GA算法-R语言实现

遗传算法-旅行路径优化

旅行商问题

>北工商-经研143班共有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)
## Checking rgeos availability: FALSE
##      Note: when rgeos is not available, polygon geometry     computations in maptools depend on gpclib,
##      which has a restricted licence. It is disabled by default;
##      to enable gpclib, type gpclibPermit()
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)
##     海口市     南昌市     岳阳市     成都市     信阳市     阜阳市 
##          1          2          2          3          2          2 
##     南阳市   驻马店市     漯河市     周口市     安阳市     聊城市 
##          2          2          2          2          4          4 
##     淄博市   石家庄市     长治市     沧州市     北京市   张家口市 
##          4          4          4          4          4          4 
##     本溪市 巴彦淖尔市       新疆     黑河市 
##          5          6          7          5
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)

##  [1] 12382.00 12382.00 13672.03 12875.29 12875.29 14417.41 15313.20
##  [8] 12521.97 14799.27 12875.29 12521.97 12402.21 13170.24 12452.24
## [15] 12875.29 12875.29 12875.29 12875.29 12452.24 12875.29 12451.97
## [22] 12451.97 12451.97 13107.99 12875.29
##  [1] 12382.00 13906.85 13672.03 12875.29 12875.29 14417.41 15298.76
##  [8] 14915.05 13044.60 13005.90 12521.97 13195.61 13170.24 12451.97
## [15] 12875.29 12875.29 16512.69 12875.29 12452.24 12875.29 12451.97
## [22] 12514.52 12451.97 13107.99 12875.29
##  [1] 12382.00 12875.29 15834.00 13948.10 12444.55 12547.28 13771.08
##  [8] 12535.87 14316.68 12875.29 13948.10 12382.00 12444.55 14070.06
## [15] 12444.55 14032.80 16851.27 12810.33 13175.40 13186.95 13948.10
## [22] 12535.87 12444.55 12697.28 13771.08
##  [1] 12382.00 12875.29 17273.80 14912.22 14104.60 12547.28 13771.08
##  [8] 16984.83 15203.85 12382.00 13948.10 12382.00 12444.55 13917.19
## [15] 14187.64 14032.80 15651.89 12810.33 13175.40 14667.20 15209.48
## [22] 13207.35 12521.11 16880.77 13771.08
##  [1] 13074.46 15222.94 16765.63 15068.94 13410.55 12639.13 14238.74
##  [8] 12881.63 13864.14 13380.80 15550.12 16137.26 12535.11 13410.55
## [15] 12881.63 13107.99 16797.86 14784.38 14106.70 13410.55 13410.55
## [22] 12639.13 13410.55 13866.46 13866.46
##  [1] 12382.00 15540.23 16828.18 13603.36 13410.55 14918.71 14238.74
##  [8] 13761.63 13864.14 12866.26 12639.13 17662.11 12671.11 13410.55
## [15] 13107.99 13107.99 15974.17 14784.38 14106.70 13410.55 13410.55
## [22] 13806.21 13410.55 13866.46 15104.24

你可能感兴趣的:(GA算法-R语言实现)