注:本文含有大量原著內容。本文目的僅在於對程式進行更詳細的批註或解釋,閱讀過該著作的可直接轉至標題<2>檢視詳細注釋。
<1>原文介紹:
輪盤賭選擇是從染色體群體中選擇一些成員的方法,被選中的機率和它們的適應性分數成比例,染色體的適應性分數愈高,被選中的概率也愈多。這不保證適應性分數最高的成員一定能選入下一代,僅僅說明它有最
大的概率被選中。其工作過程是這樣的:
設想群體全體成員的適當性分數由一張餅圖來代表 (見圖3.4),這一餅圖就和用於賭博的轉輪形狀一樣。我們要為群體中每一染色體指定餅圖中乙個小塊。塊的大小與染色體的適應性分數成比例,適應性分數愈高,它在餅圖中對應的小塊所佔面積也愈大。為了選取乙個染色體,你要做的,就是旋轉這個輪子,並把乙個小球拋入其中,讓它翻來翻去地跳動,直到輪盤停止時,看小球停止在哪一塊上,就選中與它對應的那個染色體。
<2>輪盤賭演算法詳解(原:指原文。注:本文作者批註。)
原:讓我們從輪盤賭選擇演算法開始。請記住,這乙個函式的功能是從群體中選擇乙個基因組,選中的機率正比於基因組的適應性分數。
sgenome& cgabob::roulettewheelselection()//輪盤賭函式的構建
另,原始碼中有
#define rand_max 0x7fff
這意味著
rand()
返回的值將在0到2147483647之間產生,實際就是某個介於0-99.99%之間的百分比。至於m_dtotalfitnessscore,
我們可以將圓形的輪盤想象為一把長形的游標卡尺,這把尺子又分為很多段(基因組的適應分區域,適應分越大,該基因組占有的區域越大),箭頭(即隨機產生的閥值)在尺子的長度範圍內隨機移動,很明顯便有了下述判斷:
if (cftotal > fslice) 原:
double cftotal = o;
int selectedgenome = 0;
for (int i=o; im_ipopsize為群體大小,或者說基因組的數量 }
return m_vecgenomes[selectedgenome]; }
。。原:現在,程式通過迴圈來考察各基因組,把它們相應的適應性分數乙個乙個累加起來,直到這一部分累加和大於fslice值時,就返回該基因組。就是這樣簡單。
總結:第一次看這個演算法的時候並不是太懂,而且原著的程式怎麼也不符合我腦袋中想象的圓形輪盤跟跳動的小球,直到……我將那個輪盤線性化(就像求圓的面積一樣將圓沿中心向四周剖開再將圓周直線化,拉直)。就是這樣簡單,終於明白了原作者的話,恩,這個演算法根據源**直譯過來的思想就是醬紫的,你懂了沒?
輪盤賭演算法
首先,這個演算法可以如下表述 如果已知a類物件生成概率為p a b類物件生成概率為p b c類物件 k類物件,他們的概率總和為1,問如何在a k中隨機生成乙個物件 演算法理解如下 即我們需要先對0 1區段按照概率大小劃分長度,設隨機生成乙個0 1之間的數,這種隨機數生成結果是在0 1均勻分布的,然後...
輪盤賭演算法
1.基本原理 群體中個體被選擇的概率與其適應度值成正比。設個體表示為 2.由輪盤 化示例 個體 1234 5適應度值24 6810個體被選擇的概率 按照上式計算 0.07 0.13 0.20.27 0.33 3.累積概率 補充上表個體1 2345 適應度值24 6810個體被選擇的概率 按照上式計算...
輪盤賭演算法
首先,這個演算法可以如下表述 如果已知a類物件生成概率為p a b類物件生成概率為p b c類物件 k類物件,他們的概率總和為1,問如何在a k中隨機生成乙個物件 演算法理解如下 即我們需要先對0 1區段按照概率大小劃分長度,設隨機生成乙個0 1之間的數,這種隨機數生成結果是在0 1均勻分布的,然後...