旅行商問題
BTBU-JY143班共有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的倒數,即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)
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)
最優路徑可視化
詳細介紹
反饋與建議
- 作者:ShangFR
- 郵箱:shangfr@foxmail.com
感謝您閱讀這份文檔,分享。