遗传算法解决TSP问题

该博客探讨了遗传算法解决旅行商问题(TSP),介绍了算法原理、实现过程和参数调整的影响。通过实验发现,种群数量在100-200,交叉概率为0.6,变异概率为0.03时,算法表现较好。然而,随着城市数量增加,遗传算法的效率下降,无法保证找到最优解。
摘要由CSDN通过智能技术生成

TSP(traveling salesman problem,旅行商问题)描述的是某一旅行商从某个城市出发访问每个城市一次且仅一次,最后回到出发城市,目标是寻找一条最短的遍历n个城市的路径。TSP是典型的NP完全问题,其时间复杂度随问题规模的增加按指数形式增长。这里使用遗传算法求解TSP问题

1.算法原理
遗传算法的基本思想是从初始种群出发,采用优胜劣汰,适者生存的自然法则选择个体,并通过杂交,变异来产生新一代种群,如此逐代进化,直到满足目标为止。

遗传算法的基本运算过程如下:

a)初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。

b)个体评价:计算群体P(t)中各个个体的适应度。

c)选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。

d)交叉运算:将交叉算子作用于群体。所谓交叉是指把两个父代个体的部分结构加以替换重组而生成新个体的操作。遗传算法中起核心作用的就是交叉算子。

e)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。

群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t 1)。

f)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。

算法流程图:
在这里插入图片描述
2.算法实现
2.1 代码

  • fit.m 适应度函数fit.m,每次迭代都要计算每个染色体在本种群内部的优先级别,类似归一化参数。
%适应度函数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
  • cross.m 交叉操作函数
%交叉操作函数  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
%%W为需要交叉的位数
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

  • exchange.m 对调函数
%对调函数 exchange.m

function [x,y]=exchange(x,y)
temp=x;
x=y;
y=temp;
 
end
  • Mutation.m 变异函数
%变异函数 Mutation.m

function a=Mutation
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实验内容与步骤 TSP 问题是一个经典的 NP 问题,很难得到最优解,利用遗传算法,可以比较快的找到近似最优。本实验采用 TSPLIB 的数据,利用遗传算法进行求解。 染色体设计 染色体设计是遗传算法的关键之一,在本实验中,采用基于路径的方法进行设计,即一条完整合法的路径为一个染色体。如 12345678 或 51834762 (以 8 个城市为例)。 交叉编码方式设计 在本实验中采用部分交叉编码方式,编码过程如下: 根据两个父代染色体建立基因对应规则 确定父代中交叉的起始位置、结束位置 互换需要交叉的编码得到子代,对于每一个子代,如果交叉的部分已经在存在,则根据基因对应规则对寻找替换基因 示例:父代 1 : 12345678; 父代 2: 51834762 步骤 1、确定基因对应规则。 父代 1 视角: 1->5、 2->1、 3->8、 4->3、 5->4、 6->7、 7->6、8->2 父代 2 视角: 5->1、 1->2、 8->3、 3->4、 4->5、 7->6、 6->7、2->8 步骤 2、确定交叉起始位置为 4,结束位置为 6。 父代 1 中需要交换的基因为 456 父代 2 中需要交换的基因为 347 步骤 3、通过互换基因得到子代。 子代 1 生成过程:父代 1 中前 3 个基因和后 2 个基因无需互换,遗传给子代 1,得到 123***78 第四个基因 4 需要交换,对应的基因为 3,得到 1233##78。由于基因 3 已经存在于子代 1(位置 3)中,因此将该基因根据对应规则修改为 8,得到1283##78,但基因 8 也已经存在,根据规则修改为 2,得到 1223##78; 2 同样存在,修改为 1,得到 1213##78; 1 也存在,修改为 5,得到 1253##78; 第五个基因 5 需要交换,对应的基因为 4,得到 12534*78; 第六个基因 6 需要交换,对应的基因为 7,得到 12534778,基因 7 已经存在,根据规则修改为 6,得到 12534768,子代 1 编码完成; 用同样的方式编码子代 2(用父代 2 视角的对应规则)。 编码原则 如果交换得到的基因已经存在,保留交换得到的基因、修改由父代遗传下来的基因。基因修改可能会有多次(由于多次冲突),但都只在同一位置进行。 变异编码规则设计 本实验采用交换变异,即在自身染色体中随机挑选两个基因,然后互换位置。 程序实现 1.设定种群数量 2.随机初始化种群染色体并计算适应度 3.根据适应度选择父代进行遗传(根据交叉概率决定是否交叉染色体) 4.根据变异率进行变异操作 5.计算适应度,如达到要求或达到迭代次数则终止算法,否则跳转到第3步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值