在看進化算法的時候,看到一個東東,就是要根據輪盤賭法,選擇可以交配的個體
它的代碼是這樣的
/** 在計算完種群適應度之后,我們需要使用轉盤賭法選取可以產生下一代的個體,這里有個條件就是只有個人的適應度不小於平均適應度才會長生下一代(適者生存) */ private Chromosome getParentChromosome() { double slice = Math.random() * totalScore; double sum = 0; for (Chromosome chro : population) { sum += chro.getScore(); // 轉到對應的位置並且適應度不小於平均適應度 if (sum > slice && chro.getScore() >= averageScore) { return chro; } } return null; }
其中slice是一個隨機數,由於Math.random 的范圍在0.0~1.0的閉區間,設想每個個體的score是1,有10個個體,totalScore=10,所以 slice的值最終在[0,10]
第一次for循環, sum+=chro.getScore 之后等於1,假設slice=5,這時候if中的條件
sum > slice && chro.getScore() >= averageScore
1>5 && 1>=1
不成立,直到sum=5的時候,才能通過。
當然這是score都為1的,易於理解的設想。可以理解,如果某個個體的分數比較高,那么它更容易通過if條件,這就是輪盤賭算法的本質:自己的分數與被選擇的概率成正比