1實驗環境
實驗環境:CPU i5-2450M@2.50GHz,內存6G,windows7 64位操作系統
實現語言:java (JDK1.8)
實驗數據:TSPLIB,TSP采樣實例庫中的att48數據源
數據地址:http://comopt.ifi.uni-heidelberg.de/software/TSPLIB95/tsp/att48.tsp.gz
TSPLIB是一個從各種來源和各種類型中產生的TSP及其相關問題的采樣實例庫,這里選取TSP采樣實例庫中的att48數據源,最優值為10628。該數據源中有48個地點坐標,實驗過程是基於這48個坐標求解TSP問題。
2 TSP問題回顧
旅行商問題,即TSP問題(Travelling Salesman Problem)又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最后要回到原來出發的城市。路徑的選擇目標是要求得的路徑路程為所有路徑之中的最小值。
3 TSP問題常見解法
算法 |
優點 |
缺點 |
窮舉法(暴力) |
實現簡單 |
時間和空間復雜度太大,不適合解決城市數太多的情況。 |
貪心算法 |
實現簡單、計算速度快 |
容易得出局部最優解而不是全局最優解。 |
動態規划 |
隨着城市數的增加,計算量大大減少,得到了中間各點到終點的最短路徑。 |
同樣不適合處理城市數太多的情況。 |
以上三種常見算法都各自的問題,窮舉法和動規不能解決城市數多的情況,而貪心法在城市數少的時候都有可能得不到全局最優解,那么是否存在既能解決城市數多的情況又能得到最優呢?遺傳算法。
4遺傳算法
遺傳算法(Genetic Algorithm)是模擬達爾文生物進化論的自然選擇和遺傳學機理的生物進化過程的計算模型,是一種通過模擬自然進化過程搜索最優解的方法。
5 算法實現步驟
5.1初始化階段
初始化對象:種群規模、城市數量、運行代數、交叉概率、變異概率
初始化數據:讀入數據源,將坐標轉換為距離矩陣(標准化歐式距離)
初始化種群:隨機生成n個路徑序列,n表示種群規模。
5.2.計算種群適應度
這里表示每條路徑求和。
5.3計算累計概率
計算初始化種群中各個個體的累積概率
5.4迭代
選擇算子:賭輪選擇策略挑選下一代個體。
交叉運算:第k個算子和k+1個算子有一定的概率交叉變換,k=0、2、4、...、2n
變異運算:每個算子有一定概率基因多次對換,概率處決與變異概率
計算新的種群適應度以及個體累積概率,並更新最優解。
將新種群newGroup復制到舊種群oldGroup中,准備下一代進化(迭代)
5.5輸出
輸出迭代過程中產生的最短路徑長度、最短路徑出現代數、以及最短路徑
6關鍵算法
6.1 賭輪選擇算法
又稱比例選擇方法.其基本思想是:各個個體被選中的概率與其適應度大小成正比.
具體操作如下:
(1)計算出群體中每個個體的適應度f(i=1,2,…,M),M為群體大小;
(2)計算出每個個體被遺傳到下一代群體中的概率;
(3)計算出每個個體的累積概率;
(q[i]稱為染色體x[i] (i=1, 2, …, n)的積累概率)
(4)在[0,1]區間內產生一個均勻分布的偽隨機數r
(5)若r<q[1],則選擇個體1,否則,選擇個體k,使得:q[k-1]<r≤q[k] 成立;
(6)重復(4)、(5)共M次
6.2交叉算法
第k(k=0、2、4、...、2n)個算子和k+1個算子有一定的概率交叉變換,這個概率就是交叉概率。
6.3變異算法
每個算子有一定概率(變異概率)基因多次對換。
對一個算子,隨機生成兩個不相等的范圍在[1,城市數]之間的隨機整數。將該算子在這兩個隨機整數對應的位置的城市編號對換,進行上述n次對換,n也是一個[1,城市數]之間的隨機整數。
7程序結果分析
主要參數:種群規模、城市數量、最大運行代數、交叉概率、變異概率
7.1種群規模對結果的影響
不變參數
最大運行代數 |
城市數量 |
交叉概率 |
變異概率 |
1000 |
10 |
0.9 |
0.09 |
10個城市最短長度為6178,路徑:3->9->4->5->6->8->7->0->2->1->3
變參:種群規模
種群規模分別為10、20、30、40、50、100時的運行結果看excel- sheet1
結論:上述情況下,當種群規模大於等於30的時候算法基本能得到正確解,達到40算法能100%得到最短路徑,但是最佳路徑出現代數並不穩定,當種群規模達到1000時穩定在50代之內得到正確結果。
7.2最大運行代數對結果的影響
不變參數
種群規模 |
城市數量 |
交叉概率 |
變異概率 |
30 |
10 |
0.9 |
0.09 |
10個城市最短長度為6178,路徑:3->9->4->5->6->8->7->0->2->1->3
變參:最大運行代數
最大運行代數分別為50、100、200、300、500、1000、10000時的運行結果看excel- sheet2
結論:
上述情況下,當最大運行代數達到1000時算法運行結果趨於穩定(穩定得到最短路徑),這時算法的效率比較高。
當達到10000時100%正確,但是最佳路徑出現代數穩定在2000代以內,所以想要2000代之后的計算都是不必要的,算法的最大運行代數最優參數為2000。
7.3城市數量對結果的影響
不變參數
種群規模 |
最大運行代數 |
交叉概率 |
變異概率 |
30 |
1000 |
0.9 |
0.09 |
變參:城市數量
城市數量分別為5、8、10、12、15、48時的運行結果看excel- sheet2
結論:上述情況下,當城市數量<=8時,算法100%的到正確解。當城市數量達到12時,這套參數已經不能得到最優解了,必須調整某些參數。調整分以下情況:
(1)其他參數不變,種群規模逐漸調到120時,算法結果穩定。
(2)其他參數不變,最大運行代數逐漸調到10000時,算法結果穩定。
(3)其他參數不變,交叉概率不管怎么調,算法都得不到最優解。但是將種群規模調大到40,交叉概率調為0.1時,算法結果趨於穩定
綜合(1)(2)(3)發現似乎一開始交叉概率就有問題,對於該算法交叉概率應該調低。當交叉概率較高時無論是提高種群規模還是最大運行代數,代價都太大。
當城市數量為48時(最優解10628)
(1)
種群規模 |
最大運行代數 |
交叉概率 |
變異概率 |
1000 |
10000 |
0.1 |
0.09 |
算法運行時間為6s,算法結果(10937)優於貪心結果(12842),很接近了,但不是最優。
謝 謝! 未 完 待 續 ...