北工商-經研143班共有30位同窗,來自22個地區,咱們但願在假期來一次說走就走的旅行,將全部同窗的家鄉走一遍。算起來,路費是一筆很大的花銷,因此但願設計一個旅行方案,確保這一趟走下來的總路程最短。php
NP就是Non-deterministic Polynomial,即多項式複雜程度的非肯定性問題,是世界七大數學難題之一。html
若是使用枚舉法求解,22個地點共有:
(22-1)!/2 = 25545471085854720000 種路線方案算法
遺傳算法將「優勝劣汰,適者生存」的生物進化原理引入優化參數造成的編碼串聯羣體中,按所選擇的適應度函數並經過遺傳中的複製、交叉及變異對個體進行篩選,使適應度高的個體被保留下來,組成新的羣體,新的羣體既繼承了上一代的信息,又優於上一代。這樣周而復始,羣體中個體適應度不斷提升,直到知足必定的條件。遺傳算法的算法簡單,可並行處理,並能到全局最優解。app
採用實數編碼,以N個城市的序號做爲一條可能的路徑。 例如對8個城市,可生成以下的染色體表明一條路徑,8,6,4,2,7,5,3,1.重複操做生成數目等於n的染色體種羣。echarts
因爲是求最短路徑,適應度函數通常求函數最大值,因此取路徑總長度T的倒數,即fitness=1/T。函數
採用輪盤賭的方式產生父代染色體。優化
假設有一個含有九個城市的列表: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)編碼
以機率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)spa
以機率Pm選擇參加變異的個體,用對換變異進行操做。隨機的選擇個體中的兩個位點,進行交換基因。
如A=123456789;若是對換點爲4和7,則通過對換後爲B=123756489設計
對染色體進行解碼,恢復染色體的實數表示方法。
根據得出的新的染色體,再次返回選擇染色體的步驟,進行迭代,直到達到迭代次數,算法中止。
#加載packages library(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]) # matrix muer.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)