用遗传算法求解中国34个省会TSP的问题.docx
《用遗传算法求解中国34个省会TSP的问题.docx》由会员分享,可在线阅读,更多相关《用遗传算法求解中国34个省会TSP的问题.docx(11页珍藏版)》请在冰豆网上搜索。
![用遗传算法求解中国34个省会TSP的问题.docx](https://file1.bdocx.com/fileroot1/2023-1/4/9c179573-043f-45da-9eb0-f17c27ee19b8/9c179573-043f-45da-9eb0-f17c27ee19b81.gif)
用遗传算法求解中国34个省会TSP的问题
用遗传算法求解中国34个省会TSP问题
一、TSP问题的描述
旅行商问题(TSP)可以具体描述为:
已知n个城市之间的相互距离,现有一个推销员从某一个城市出发,必须遍访这n个城市,并且每个城市只能访问一次,最后又必须返回到出发城市,如何安排他对这些城市的访问次序,可使其旅行路线的总长度最短。
现给出中国34个省会数据,要求基于此数据使用遗传算法解决该TSP问题。
中国34省会位置
city=
1.西藏2.云南3.四川4.青海5.宁夏6.甘肃7.内蒙古8.黑龙江9.吉林
10.辽宁11.北京12天津13.河北14.山东15.河南16.山西17.陕西18.安徽19.江苏
20.上海21.浙江22.江西23.湖北24.湖南25.贵州26.广西27.广东28.福建29.海南30.澳门31.香港32.台湾33.重庆34.新疆
像素坐标如下:
Columns1through11
100187201187221202258352346336290
2112652141581421651216685106127
Columns12through22
297278296274265239302316334325293
135147158177148182203199206215233
Columns23through33
280271221233275322250277286342220
216238253287285254315293290263226
Column3410477
二、遗传算法的介绍
2.1遗传算法
遗传算法的基本原理是通过作用于染色体上的基因寻找好的染色体来求解问题,它需要对算法所产生的每个染色体进行评价,并基于适应度值来选择染色体,使适应性好的染色体有更多的繁殖机会,在遗传算法中,通过随机方式产生若干个所求解问题的数字编码,即染色体,形成初始种群;通过适应度函数给每个个体一个数值评价,淘汰低适应度的个体,选择高适应度的个体参加遗传操作,经过遗产操作后的个体集合形成下一代新的种群,对这个新的种群进行下一轮的进化。
2.2遗传算法的过程
遗传算法的基本过程是:
1.初始化群体。
2.计算群体上每个个体的适应度值
3.由个体适应度值所决定的某个规则选择将进入下一代个体。
4.按概率Pc进行交叉操作。
5.按概率Pm进行变异操作。
6.没有满足某种停止条件,则转第2步,否则进入第7步。
7.输出种群中适应度值最优的染色体作为问题的满意解或最优界。
停止条件有两种:
一是完成了预先给定的进化代数则停止;二是种群中的最优个体在连续若干代没有改进或平均适应度在连续若干代基本没有改进时停止。
遗传算法过程图如图2
图2遗传算法过程框图
三、遗传算法解决TSP问题的Matlab程序实现
3.1程序初始化
程序首先读入34个省会城市坐标,计算任意两个城市的距离:
设置遗传算法控制参数。
clearall;clc;clf;
load(‘testdata.mat’);
nlen=length(x1);
xy=[x1;y1]';
n=500;%种群数目
C=5000;%进化迭代次数
m=2;%适应度归一化淘汰加速指数,取值不宜太大
alpha=0.8;%淘汰保护指数,范围0~1,为1时关闭保护
a=meshgrid(1:
nlen);%生成nxn矩阵
dmat=reshape(sqrt(sum((xy(a,:
)-xy(a',:
)).^2,2)),nlen,nlen);%计算城市距离矩阵
遗传算法对求解问题本身是一无所知的,这里采用随机生成初始化种群,如下:
[N,NN]=size(dmat);
farm=zeros(n,N);%用于存储种群
fori=1:
n
farm(i,:
)=randperm(N);%随机生成初始化种群
end
3.2计算适应度
本程序目标函数为经过34省会的总距离,适应度与目标函数的正相关,取值范围0~1,适应度计算公式为:
其中,len为某组解的总距离,minlen为该次迭代中最短距离,maxlen为该次迭代中最长距离,m为适应度归一化淘汰加速指数,源程序如下:
functionfitness=fit(len,m,maxlen,minlen)
fitness=len;
fori=1:
length(len)fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.0001))).^m;
end
3.3选择操作
当个体适应度小于某一随机数值时,遭到淘汰,保留优秀个体,使它们有机会作为父代产生后代个体,源程序如下:
FARM=farm;
nn=0;%nn为复制的个数
fori=1:
n
iffitness(i,1)>=alpha*rand%适应度与随机数值相比较
nn=nn+1;
FARM(nn,:
)=farm(i,:
);
end
end
FARM=FARM(1:
nn,:
);
3.4交叉操作
许多生物的繁衍是通过染色体的交叉完成的,在遗传算法中使用这一概念,并把交叉作为遗传算法的一个操作算子,其实现过程是对选中用于繁殖下一代的个体,随机地选择两个个体的位置,按交叉概率Pc,在选择的位置实行交换,目的在于产生新的基因组合,即新的个体,源代码如下:
[aa,bb]=size(FARM);
whileaaifnn<=2
nnper=randperm
(2);
else
nnper=randperm(nn);
end
A=FARM(nnper
(1),:
);
B=FARM(nnper
(2),:
);
[A,B]=intercross(A,B);%使用部分匹配交叉法进行交叉操作
FARM=[FARM;A;B];
[aa,bb]=size(FARM);
end
ifaa>n
FARM=FARM(1:
n,:
);%保持种群规模为n
end
farm=FARM;
clearFARM;
以下是交叉函数:
%交叉算法采用的是由Goldberg和Lingle于1985年提出的PMX(部分匹配交叉)
function[a,b]=intercross(a,b)
L=length(a);
ifL<=10%确定交叉宽度
W=9;
elseif((L/10)-floor(L/10))>=rand&&L>10
W=ceil(L/10)+8;
else
W=floor(L/10)+8;
end
p=unidrnd(L-W+1);%随机选择交叉范围,从p到p+W
fori=1:
W%交叉
x=find(a==b(1,p+i-1));
y=find(b==a(1,p+i-1));
[a(1,p+i-1),b(1,p+i-1)]=exchange(a(1,p+i-1),b(1,p+i-1));
[a(1,x),b(1,y)]=exchange(a(1,x),b(1,y));
End
%交换函数
function[x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
本遗传算法中并未引入变异操作,当程序迭代次数满足设定条件时,程序得出近似最优解。
四、程序结果分析
初始值种群数目设为500,进化迭代次数为5000,归一化淘汰加速指数设为2,淘汰保护指数设为0.8时,运行程序,得最短距离为1489.3,结果如下:
图3城市位置坐标(左)、初始解(中)、最终解(右)
图4种群数为500,进化数为5000,TSP问题最优路径
图5种群数为500,进化数为5000,TSP问题寻优历史
从图4可以看出,迭代次数超过500次时,所得的解已接近近似最优解。
只改变种群数量,进行多次计算,可得下表:
种群数量最终解距离
502679.7
1002053.0
2001747.6
5001489.3
10001499.8
20001624.6
表一不同种群数量下最终解
综上所述,种群越大、迭代越多求解的结果越优化,但是需要花费大量的运算时间;由于算法中存在多个随机参数,因此每次计算结果不一定相同,须根据需要设定初值进行多次计算取多组中最优解。
五、另一种的遗传算法解决该问题
上述算法中,只采用了遗传算法中交换操作,以下算法,则采用变异操作解决同一问题。
算法核心思路是,在每次迭代中,解的个体随机按4个为1组,每组中只保留最优解,然后对此最优解进行左右翻转、交换、向前移位三种变异作,生成三个新个体,再参与下次迭代。
整个算法不需要计算归一化适应度,核心源代码如下:
forp=4:
4:
pop_size
rtes=pop(rand_pair(p-3:
p),:
);
dists=total_dist(rand_pair(p-3:
p));
[ignore,idx]=min(dists);
best_of_4_rte=rtes(idx,:
);
ins_pts=sort(ceil(n*rand(1,2)));%生成1x2每一列元素按照升序排列矩阵
I=ins_pts
(1);
J=ins_pts
(2);
fork=1:
4%保留最佳个体,繁殖三个新个体
tmp_pop(k,:
)=best_of_4_rte;
switchk
case2%左右翻转
tmp_pop(k,I:
J)=fliplr(tmp_pop(k,I:
J));
case3%交换
tmp_pop(k,[IJ])=tmp_pop(k,[JI]);
case4%向前移动一位
tmp_pop(k,I:
J)=tmp_pop(k,[I+1:
JI]);
otherwise
end
end
new_pop(p-3:
p,:
)=tmp_pop;
end
pop=new_pop;
在此算法中,每次迭代淘汰率固定为75%,三种变异操作覆盖面比较广,直接以最短距离为适应函数,省去每次适应度的计算。
初始值种群数目设为500,进化迭代次数为5000,寻得最优解为1295.72,如下:
图5省会位置(左上)、各省会距离分布(右上)、最优路径(左下)、寻优历史(右下)
由上图及最终结果可以看出,该算法比上一算法所得结果更优化,从寻优历史可见,迭代次数在接近1000次才能得到近似最优解(见表二),总体而言,该算法相对上一算法收敛性更好,但计算量稍大。
种群数量最终解距离
501304.7587
1001302.0629
2001298.1412
5001295.7248
10001295.7248
20001299.9698
表二不同种群数量下最终解
图6种群数为500,进化数为5000,TSP问题最优路径
六、总结
本文采用MATLAB实现遗传算法求解TSP问题,对结果进行了分析,并对比了两种不同思路的遗传算法。
遗传算法是一种智能优化算法,它的实现有些关键点,一是串的编码方式,本质就是问题编码,串长度及编码形式对算法收敛影响极大;二是适应函数的确定,这是选择的基础;三是自身参数的设定,其中重要的是群体大小,最大迭代次数,通过计算我们可以看到最大迭代次数、种群数目对问题求解的精度、最优解都有影响,;四是交叉和变异算子的设计,这决定了整个算法的收敛速度。
目前很多研究都是根据具体的领域问题,改进交叉算子,变异算子,寻找最优的参数设定来提高算法收敛速度和保证最优解的得到,对算子的改进和参数值的设定这是将来的研究工作。