1. 程式人生 > >用GA演算法設計22個地點之間最短旅程-R語言實現

用GA演算法設計22個地點之間最短旅程-R語言實現

資料探勘入門與實戰  公眾號: datadw

相關帖子 ————————————————————————————————————————————————————————

某畢業班共有30位同學,來自22個地區,我們希望在假期來一次說走就走的旅行,將所有同學的家鄉走一遍。算起來,路費是一筆很大的花銷,所以希望設計一個旅行方案,確保這一趟走下來的總路程最短。

旅行商問題是一個經典的NP問題

NP就是Non-deterministic Polynomial,即多項式複雜程度的非確定性問題,是世界七大數學難題之一。

如果使用列舉法求解,22個地點共有:
(22-1)!/2 = 25545471085854720000 

種路線方案


GA演算法

遺傳演算法將“優勝劣汰,適者生存”的生物進化原理引入優化引數形成的編碼串聯群體中,按所選擇的適應度函式並通過遺傳中的複製、交叉及變異對個體進行篩選,使適應度高的個體被保留下來,組成新的群體,新的群體既繼承了上一代的資訊,又優於上一代。這樣周而復始,群體中個體適應度不斷提高,直到滿足一定的條件。遺傳演算法的演算法簡單,可並行處理,並能到全域性最優解。

GA演算法設計

1.生成原始染色體種群

採用實數編碼,以N個城市的序號作為一條可能的路徑。 例如對8個城市,可生成如下的染色體代表一條路徑,8,6,4,2,7,5,3,1.重複操作生成數目等於n的染色體種群。

2.生成適應度函式

由於是求最短路徑,適應度函式一般求函式最大值,所以取路徑總長度T的倒數,即fit

ness=1/T。

3.選擇染色體

採用輪盤賭的方式產生父代染色體。

4.對染色體種群進行編碼

假設有一個含有九個城市的列表:W=(A,B,C,D,E,F,G,H,I)。
有如下兩條路線:
W1=(A,D,B,H,F,I,G,E,C)
W2=(B,C,A,D,E,H,I,F,G)
則這兩條路線可編碼為:
W1=(142869753)
W2=(231458967)

5.交叉

以概率Pc選擇參加交叉的個體(偶數個),用兩點交叉運算元進行操作。
例如對於下面兩個染色體個體
(1 3 4 | 5 2 9 

| 8 6 7)
(1 7 6 | 9 5 2 | 4 3 8)
通過兩點交叉可得到子代染色體為
(1 3 4 | 9 5 2 | 8 6 7)
(1 7 6 | 5 2 9 | 4 3 8)

6.變異

以概率Pm選擇參加變異的個體,用對換變異進行操作。隨機的選擇個體中的兩個位點,進行交換基因。
如A=123456789;如果對換點為4和7,則經過對換後為B=123756489

7.解碼

對染色體進行解碼,恢復染色體的實數表示方法。

8.逐代進化

根據得出的新的染色體,再次返回選擇染色體的步驟,進行迭代,直到達到迭代次數,演算法停止。


演算法實現

#載入packageslibrary(sp)
library(maptools)
library(geosphere)

source("C:\\Users\\ShangFR\\Desktop\\路徑優化\\GA演算法指令碼.R")
data=read.csv("C:\\Users\\ShangFR\\Desktop\\路徑優化\\143地理座標.csv") #讀取城市經緯度資料
border <- readShapePoly("C:\\Users\\ShangFR\\Desktop\\路徑優化\\map\\bou2_4p.shp") #讀取各省的邊界資料等#初始化(列出地區距離矩陣-聚類)da=data[,1:2] rownames(da)=data[,3] hc=hclust(dist(da)) cutree(hc, h = 10) plot(hc) route=CreatDNA(data,5)   x = route[,1] y = route[,2] z = route[,3] cols=route[,4] muer.lonlat = cbind(route[,1],route[,2]) # matrixmuer.dists = distm(muer.lonlat, fun=distVincentyEllipsoid) # 精確計算,橢圓ans=round(muer.dists/1000,2) roundots = list(x=x,y=y,ans=ans,z=z,cols=cols) species = GA4TSP(dots=roundots,initDNA=NULL,N=50,cp=0.1,vp=0.01,maxIter=1000,maxStay=100,maxElite=2,drawing=TRUE)

最優路徑視覺化

R語言-GA演算法指令碼