遗传算法与TSP问题及验证

遗传算法与TSP问题

TSP(旅行商)问题简介

旅行商问题,即TSP问题(Traveling Salesman Problem)
又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。

遗传算法简介

遗传算法是计算数学中用于解决最佳化的搜索算法,是进化算法的一种。进化算法最初是借鉴了进化生物学中的一些现象而发展起来的,这些现象包括遗传、突变、自然选择以及杂交等。

遗传算法通常实现方式为一种计算机模拟。对于一个最优化问题,一定数量的候选解(称为个体)的抽象表示(称为染色体)的种群向更好的解进化。

传统上,解用二进制表示(即0和1的串),但也可以用其他表示方法。进化从完全随机个体的种群开始,之后一代一代发生。在每一代中,整个种群的适应度被评价,从当前种群中随机地选择多个个体(基于它们的适应度),通过自然选择和突变产生新的生命种群,该种群在算法的下一次迭代中成为当前种群。

遗传算法图解

在这里插入图片描述

遗传算法基本运算

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

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

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

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

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

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

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

遗传算法解决TSP问题策略

应用遗传算法解决 TSP 问题,首先对访问城市序列进行排列组合的方法编码,这保证了每个城市经过且只经过一次。接着生成初始种群,并计算适应度函数,即计算遍历所有城市的距离。然后用最优保存法确定选择算子,以保证优秀个体直接复制到下一代。采用有序交叉和倒置变异法确定交叉算子和变异算子。

1、染色体编码
为了充分利用城市间相邻边的信息和距离的信息,不采用二进制编码而是采用整数编码,即每个染色体都是一个1到N的排列,表示周游路线的城市间的先后顺序序列。

2、选择算子
这里没有采用轮盘赌算法,而是采用了锦标赛选择,即每次从群体中随机抽 取出M个个体,然后选择其中适应值最好的进入下 一代,接着进行下一个锦标赛选择直至选出种群数目个个体为止。锦标赛选择算子保证了更优的染色体能够有更大的存活机会,当然,同一个优秀的个体被多次选中也是允许的。这里的M取2.

3、交配算子
利用相邻边的信息和距离的信息作为启发来设计一种基于顶点的候选表的交配算子(CandidateCrossover)

具体步骤如下:
①交配算子根据交配概率pc来选择两个父体进行交配。把这两个父体看作是两个循环队列,然后产生一个随机数k作为交配位。 交配位所对应的父体1中的城市作为当前的城市加入到子代1中;

②找到该城市在父体2中对应的位置,分别把该城市在父体1和 父体2中的左右邻接城市(和这个城市相连接的边的另外两个城市)加入到当前城市的候选表中,如果其左右邻接城市已在子代中,则选择其次邻接城市,依次类推直至所选取的城市不在子 代中,而最后一个城市的下一个城市是第一个城市;

③根据距离矩阵计算当前城市和候选表中的各个城市的距离,找出与当前城市距离最短的城市加入到子代中,并且把这个距离最短的城市又当作当 前城市,找到此城市在父体1中的位置,返回到第2 步继续执行,直到所有的城市加入到子代1中为止。

4、变异算子
变异操作发生在某个染色体的某个基因上,它将可变性引入群体中,增强了群体的多样性,从而提供了从局部最优中跳出来的一种手段。变异方法也是一个随机的、盲目的变异,因此需要使用比较小的变异概率(pm)来控制以避免造成种群的破坏。这里采用的是基于位置的变异也称为插入式变异(InsertionMutation),该算子在染色体中随机产生两个变异位,然后把第二个位置的基因插入到第一个位置的基因之前。

遗传算法解决TSP代码块(MATLAB)

main主函数
%main
clear;
clc;
%%%%%%%%%%%%%%%输入参数%%%%%%%%
N=25;               %%城市的个数
M=100;               %%种群的个数
ITER=2000;               %%迭代次数
%C_old=C;
m=2;                %%适应值归一化淘汰加速指数
Pc=0.8;             %%交叉概率
Pmutation=0.05;       %%变异概率
%%生成城市的坐标
pos=randn(N,2);
%%生成城市之间距离矩阵
D=zeros(N,N);
for i=1:N
    for j=i+1:N
        dis=(pos(i,1)-pos(j,1)).^2+(pos(i,2)-pos(j,2)).^2;
        D(i,j)=dis^(0.5);
        D(j,i)=D(i,j);
    end
end

%%生成初始群体

popm=zeros(M,N);
for i=1:M
    popm(i,:)=randperm(N);%随机排列,比如[2 4 5 6 1 3]
end
%%随机选择一个种群
R=popm(1,:);
figure(1);
scatter(pos(:,1),pos(:,2),'rx');%画出所有城市坐标
axis([-3 3 -3 3]);
figure
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值