计算智能——使用遗传算法解决TSP问题

使用遗传算法解决TSP问题

1、TSP问题描述

旅行商(TSP)问题:假设有一个旅行商人要拜访N个城市,要求他从一个城市出发,每个城市最多拜访一次,最后要回到出发的城市,保证所选择的路径长度最短。

2、遗传算法的介绍

2.1、遗传算法简介

遗传算法(Genetic Algorithm, GA)是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。

其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。

遗传算法以一种群体中的所有个体为对象,并利用随机化技术指导对一个被编码的参数空间进行高效搜索。其中,选择、交叉和变异构成了遗传算法的遗传操作;参数编码、初始群体的设定、适应度函数的设计、遗传操作设计、控制参数设定五个要素组成了遗传算法的核心内容。

2.2、遗传算法的原理

见https://blog.csdn.net/XYYHHH11/article/details/102899152

首先随机地在父体中选取两个杂交点,并交换相应的段,再根据该段内的城市确定部分映射。 在每个父体上先填入无冲突的城市,而对有冲 突的城市依照映射关系选择候选的城市,直到 找到无冲突的城市填入,按此方法获得了杂交 后的两个后代。
A=9 8 4 | 5 6 7 | 1 3 2 0
B=8 7 1 | 2 3 0 | 9 5 4 6
首先交换A和B的两个匹配区域,得到
A’=9 8 4 | 2 3 0 | l 3 2 0
B’=8 7 1 | 5 6 7 | 9 5 4 6
对于A’、B’两子串中匹配区域以外出现的遍历重复,依据匹配区域内的位置映射关系,逐一进行交换。
对于A’有2到5,3到6,0到7的位置符号映射,对A’的匹配区以外的2,3,0分别以5,6,7 替换,
则得
A”=9 8 4 | 2 3 0 | 1 6 5 7
B”=8 0 1 | 5 6 7 | 9 2 4 3

2.3、遗传算法步骤描述

1、 初始化:设置进化代数计数器iter=0、设置最大迭代次数ITER、交叉概率Pc、变异概率Pmutation、生成种群个数M。
2、个体评价:计算种群中各个个体的适应度。
3、 选择运算:将选择算子作用于群体。以个体适应度为基础,选择最优个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
4、交叉运算:在交叉概率的控制下,对群体中的个体两两进行交叉。
5、 变异运算:在变异概率的控制下,对群体中的个体两两进行变异,即对某一个体的基因进行随机调整。
6、 经过选择、交叉、变异运算之后得到下一代群体P1。

重复以上1-6,直到迭代次数为ITER,以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

3、代码分析

3.1 cross.m
function [A,B]=cross(A,B)
L=length(A);
if L<10
W=L;
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);
fprintf('p=%d ',p);
for i=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
end
3.2 对调函数 exchange.m
function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;

end

3.3 适应度函数fit.m
function fitness=fit(len,m,maxlen,minlen)
fitness=len;
for i=1:length(len)
    fitness(i,1)=(1-(len(i,1)-minlen)/(maxlen-minlen+0.0001)).^m;
end

3.4变异函数 Mutation.m
function a=Mutation(A)
index1=0;index2=0;
nnper=randperm(size(A,2));
index1=nnper(1);
index2=nnper(2);
%fprintf('index1=%d ',index1);
%fprintf('index2=%d ',index2);
temp=0;
temp=A(index1);
A(index1)=A(index2);
A(index2)=temp;
a=A;

end

3.5 染色体的路程代价函数 Mylength.m
function len=myLength(D,p)%p是一个排列
[N,NN]=size(D);
len=D(p(1,N),p(1,1));
for i=1:(N-1)
    len=len+D(p(1,i),p(1,i+1));
end
end
3.6 连点画图函数 plot_route.m</
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值