遺傳演算法的簡單實現(Go語言)

2021-08-24 23:43:23 字數 2351 閱讀 6549

這是我自己寫的一篇有關遺傳演算法的文章。

for i := 0; i < len(population); i++

return next

}函式中寫的crossover(交叉),mutate(變異),將在下面給出,next就是下一代群體。

4.7 交叉的實現

func crossover(d1 organism, d2 organism) organism

// 子代得到父母的dna各一部分

mid := rand.intn(len(d1.dna))

for i := 0; i < len(d1.dna); i++ else

}return child

}交叉的實現可以千變萬化,我這裡採用的方法是子代得到父母dna的各一部分dna,這樣產生的子代也將大概率的比其父母適應能力更強。

4.8 變異的實現

func (d *organism) mutate() }}

根據mutationrate(變異的概率),這也是乙個很重要的引數,對結果有很大的影響,在後面的結果中就能看到。

4.9 找出群體中最優的生物個體

func getbest(population organism) organism

}return population[index]

}最優即該生物個體的適應度在整個群體中是最大的,這個函式將在主函式的迴圈中呼叫。

4.10 主函式

func main() else

}elapsed := time.since(start)

fmt.printf("\ntime taken: %s\n", elapsed)

}不同的遺傳演算法的結束條件有所不同,我採用的是找到完全匹配的字串即結束演算法,也可以用迭代次數來作為結束條件。我們根據執行的時間來判斷演算法的好壞。

4.11 可調的、重要的引數

// 變異的概率

var mutationrate = 0.005

// 種群數量

var popsize = 500

// 目標字串

var target = byte("no matter how long the night, the day will come")

這三個引數都是可以隨機設定的,不同的值可能會對結果有很大的影響。

5 執行結果

先展示上面源**引數的執行結果:

圖一 執行結果一

圖二 執行結果二

上面的兩個執行結果從引數都一樣,大概花了二十多、三十秒就迭代出了目標字串,以這些引數執行多次,時間在三十秒上下波動,這看似體現了遺傳演算法較為穩定的特性。

接下來修改popsize這個引數,看看會有什麼影響:

圖三 執行結果三

popsize改為300,看起來還能接受,但如果改為200或100這個程式將可能陷入區域性最優,也就是一直迭代下去,時間可能是無限長,這也是遺傳演算法的乙個弊病,所以有些遺傳演算法的實現的結束條件是迭代次數,防止程式無限期的執行下去。

接著來修改mutationrate這個引數,看看會有什麼影響:

圖四 執行結果四

不難看出變異的概率雖然更大了但是執行時間卻更長了,這是由於變異的概率反而增大了遺傳演算法的隨機性,這個變異的方向可能是好的方向也可能是不好的方向,如果變異概率更大的話會更早陷入區域性最優:

圖五 執行結果五

可以發現mutationrate為0.05,由於程式的fitness一直在0.4上下波動,因此程式陷入了區域性最優。

6 結論

遺傳演算法在這種類似問題的求解與應用中展現了其獨特的魅力,但也暴露了它的侷限性和缺陷,很容易陷入區域性最優是其比較嚴重的問題,其次它的隨機性也是乙個不容忽視的問題。因此要利用好遺傳演算法,引數的選擇和結束條件的設定極為重要,這就要根據題目的不同設定不同的方案。所以關於遺傳演算法的研究重點在一下幾個方面:

1)    演算法的改進:針對不同領域的問題來對遺傳演算法進行改進與完善。

2)    演算法的數學理論基礎:包括演算法的收斂性、收斂速度估計、早熟機理的探索與預防,交叉運算元的幾何意義與統計解釋。

遺傳演算法及matlab簡單實現

遺傳演算法的實現 遺傳演算法的一次迭代稱為一代,每一代都有一組解。新的一組解不但可以有選擇的保留一些適度值高的舊的解,而且可以包括一些由其它解結合得到的新解。最初的一組解 初始群體 是隨機生成的,之後的每組解由遺傳操作生成。每個解都通過乙個與目標函式相關的適應度函式給予評價,通過遺傳過程不斷重複,達...

遺傳演算法簡單例項

遺傳演算法的手工模擬計算示例 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各 個主要執行步驟。例 求下述二元函式的最大值 1 個體編碼 遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1,x2 編碼為一種符號串。本題中,用無符號二進位制整數來表示。因 x1,x2...

簡單的多目標遺傳演算法實現

function multiga 執行此程式之前先安裝謝爾菲德遺傳演算法工具箱。遺傳演算法求解多目標優化案例 將原多目標函式改寫為f1 x 2 y 2 4 f2 x 1 y 10 運用線性疊加法,f a f1 x b f2 x a b 1 總目標函式改寫為 f 0.6 x 2 y 2 4 0.4 x...