基因算法解決 TSP 問題算法
基因算法的運算方法包括app
對於二進制編碼Representation,基因算法的過程能夠清晰地表示爲:函數
Tips:優化
1. 變異因子pm和交叉因子pc是能夠隨着優化進行而自適應的。好比在優化起始階段,pm和pc的值設置稍大能夠提升搜索能力,而到了優化後期,pm和pc應當相應地減少,以強化其局部搜索能力。編碼
2. 輪盤賭:簡言之即得分高的個體其保留機率越大。好比對於基因A適應度/得分爲f(A)=a,基因B爲f(B)=b,那麼A的保留機率爲PA=a/(a+b),而PB=b/(a+b)。
lua
對於TSP問題:spa
首先,咱們要有各個城市/地點之間的距離表distance_between_cities。(能夠本身隨機生成).net
而後,TSP問題其實就是尋找一個合適的地點(循環的)排序R,使得對於R中的每一個相鄰元素cityi的距離之和最小。對於Multiple-Run Algorithm,能夠不停生成不一樣的排序Ri,並計算相應的距離之和(即成本Cost)。而採用基因算法,其步驟以下:blog
交叉運算排序
交叉運算有幾種方式,本次實現採用的是基於位置的交叉。首先將種羣分爲父本和母本,隨機肯定父本中要交換的部分並複製到子代,而後將母本的其餘基因按順序複製到子代。代碼實現就須要關注避免重複的部分,能夠這樣實現:隨機取出父本中要保留的基因部分F_section(要注意的是這是一段分立的基因),再順序逐個取出母本基因元素M_element生成和F_section同等大小的M_section,兩向量相減再求元素積,爲0則表示母本基因元素M_element在父本基因段F_section中已經出現了。利用矩陣、向量運算能夠避免循環查詢父本基因段中是否有母本元素,以此實現高效率(由於矩陣運算有相關的優化)。
Partial-Mapped Crossover(部分映射交叉)
Order Crossover(順序交叉)
Position-based Crossover(基於位置的交叉)
交叉因子pc 一般較大,好比取pc=0.8。
變異運算
TSP問題中,變異運算只須要隨機肯定須要執行的數量,再依據變異因子pm隨機地交換兩個城市的位置便可。
評價函數
能夠生成一個三維張量R_tensor,其中行列爲各個城市,那麼易知,矩陣元素若爲「1/0」便是表示倆城市間是/否屬於路徑Ri。而通道則表明了種羣中的不一樣個體,故R_tensor的大小爲num_city * num_city * num_population。將各通道分別與距離表distance_between_cities做矩陣相乘獲得矩陣Temp,取其對角元素求和併除以2就是路徑Ri的距離之和,能夠用來做爲每一個路徑個體的適應度Cost。
選擇運算
有兩部分,1.挑選出最優的個體R_best與對應的適應度Cost_best。2.挑選出較優的種羣的一部分,做爲下一次迭代的父代。(由於交叉運算中一般會使得種羣數量減半,因此這裏能夠加倍來使種羣維持在定值)。
自適應的變異因子pm:利用種羣多樣性
在優化初期,根據種羣多樣性population_diversity保持在某個值S附近來調整pm,好比population_diversity < S時,須要提高種羣多樣性,故取c>1,令pm=pm*c提高變異的機率,同理population_diversity > S時,令pm=pm/c下降變異機率。對於浮點型算法,求種羣多樣性是採用了標準差,而對應到TSP問題中,多樣性則體如今路徑「基因段」的多樣性。變異因子初始值pm0一般在種羣數量倒數與基因長度(TSP問題中就是路徑長度=城市數量)倒數之間,即pm0∈(min{1/num_population, 1/num_city}, max{1/num_population, 1/num_city})。
舉個例子,路徑A:1354267和路徑B:5423716的類似基因段有:54,42,71,故在此定義A與B的非類似度爲7-3=4.對於路徑C=A,其非類似度爲7-7=0,易知此時非類似度∈[0,7]。對於肯定的城市數量num_city,非類似度=城市數-類似基因段數量,能夠考慮用因子S將種羣控制在非類似度在0.1*num附近。
其計算過程將不一樣通道的Ri相乘再取對角元素求和除以2即便類似基因段數量。如路徑1342和路徑4123,計算後獲得值爲2,即12和34。
|
1 |
2 |
3 |
4 |
1 |
0 |
1 |
1 |
0 |
2 |
1 |
0 |
0 |
1 |
3 |
1 |
0 |
0 |
1 |
4 |
0 |
1 |
1 |
0 |
|
1 |
2 |
3 |
4 |
1 |
0 |
1 |
0 |
1 |
2 |
1 |
0 |
1 |
0 |
3 |
0 |
1 |
0 |
1 |
4 |
1 |
0 |
1 |
0 |
關於浮點Representation,總體過程相似,只是其交叉運算和變異運算都有不一樣。
交叉運算
假設有父本Xi和母本Yi
子代Zi = a*Xi + (1-a)*Yi 0 < a < 1 且a是隨機生成的。
變異運算
變異運算能夠用 x_newi = x_oldi + Δxi
有Δxi|r > 0.5 = (xmax, i - xi)*(2*(r - 0.5))β 和 Δxi|otherwise = (xmin, i - xi)*(2*(0.5 - r))β
其中r是從(0,1)均勻分佈隨機生成的,β一般大於1(好比能夠取β = 3)。
關於算法的收斂性:尚未找資料深刻研究過該算法的收斂性。直觀地看,該算法能夠高效地搜索解空間,而且會獲得一個最優個體(感受有點相似Multiple-Run)。
Acknowlegement:
https://blog.csdn.net/greedystar/article/details/80343841?utm_source=blogxgwz2