GA算法-R語言實現

旅行商問題

北工商-經研143班共有30位同窗,來自22個地區,咱們但願在假期來一次說走就走的旅行,將全部同窗的家鄉走一遍。算起來,路費是一筆很大的花銷,因此但願設計一個旅行方案,確保這一趟走下來的總路程最短。php

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

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

若是使用枚舉法求解,22個地點共有:
(22-1)!/2 = 25545471085854720000 種路線方案算法

GA算法

遺傳算法將「優勝劣汰,適者生存」的生物進化原理引入優化參數造成的編碼串聯羣體中,按所選擇的適應度函數並經過遺傳中的複製、交叉及變異對個體進行篩選,使適應度高的個體被保留下來,組成新的羣體,新的羣體既繼承了上一代的信息,又優於上一代。這樣周而復始,羣體中個體適應度不斷提升,直到知足必定的條件。遺傳算法的算法簡單,可並行處理,並能到全局最優解。app

GA算法設計

1.生成原始染色體種羣

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

2.生成適應度函數

因爲是求最短路徑,適應度函數通常求函數最大值,因此取路徑總長度T的倒數,即fitness=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)spa

6.變異

以機率Pm選擇參加變異的個體,用對換變異進行操做。隨機的選擇個體中的兩個位點,進行交換基因。
如A=123456789;若是對換點爲4和7,則通過對換後爲B=123756489設計

7.解碼

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

8.逐代進化

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

算法實現

#加載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)

最優路徑可視化

此圖基於百度Echarts

詳細介紹

GA算法腳本
GA算法-PPT

班級宣傳片


反饋與建議


感謝您閱讀這份文檔,分享。

相關文章
相關標籤/搜索