自從Hollad教授提出基本遺傳算法後,針對遺傳算法改進的討論從來沒有停止。本文將介紹遺傳算法的幾種改進方法,分別爲自適應遺傳算法、混合遺傳算法中的模擬退火遺傳算法(SAGA)和並行遺傳算法。相較於標準(簡單)遺傳算法(SGA),改進法在某些方面會具有一定的優勢。
往期傳送門
自適應遺傳算法
交叉概率
上式中,
fmax ——羣體中最大的適應度值favg ——每代羣體的平均適應度值f′ ——要交叉的兩個個體中較大的適應度值f ——要變異的個體的適應度值
Pc1=0.9 ,Pc2=0.6 ,Pm1=0.1 ,Pm2=0.001 。
模擬退火遺傳算法
用模擬退火算法對GA進行改進的具體辦法有許多,總結下來有退火思維改進適應度函數、退火式變異(SAM)和退火式選擇等方法。
1. 無從考證的Stoffa改進方法
Stoffa借鑑模擬退火的思想2(並沒有找到原文,只有未列出參考文獻的二手資源),將適應度隨迭代的次數拉伸。遺傳算法在運行初期個體差異較大,使用輪盤賭選擇產生的後代與適應度成正比,可以獲得較好的選擇效果。但在算法後期,適應度趨於一致,優秀個體優勢不足,需要對適應度進行一定的“拉伸”,公式如下:
其中
本方法有一定的可取之處,在“算法後期,適應度趨於一致”的時候,該方法可以拉伸適應度,使遺傳算法中的選擇更有擇優的效果。但該方法只是應用了模擬退火思想中“拉伸”的思想,無法解決早熟問題,並沒有將模擬退火算法的爬山能力融入遺傳算法中。
2.SAM(退火式變異)
遺傳算法有三種明顯劣勢 3,一是編碼所佔用的儲存空間可能很大(二進制碼),二是可能出現早熟,陷入局部最優解,三是爬山能力差。Adler提出一種操作符——退火變異,僞代碼如下:
SAM(s, T){
s' = mutate(s);
if (accept(s, s', T)) return s';
else return s;
}
其中的aceept操作爲模擬退火中的accept。計算變異後新的適應度與變異前適應度的差值,若變異後適應度更大,則接受變異;若變異後適應度變小,則以一定的退火概率
對於函數
在區間
其中平均遺傳代數爲64.66次。
在退火初溫度
可以發現加入模擬退火變異操作後可以明顯提高遺傳算法的效率。
3. 另一種改進的遺傳退火進化算法
操作流如下:
與上述僅僅將變異或交叉操作符中加入退火思想不同,本方法直接將一部分個體進行退火。