遗传算法求解TSP问题

本文介绍了使用遗传算法求解旅行商问题(TSP)的详细流程,包括编码、适应度函数、选择、交叉、变异和进化逆转操作。通过MATLAB实现,解决起点固定并返回的TSP拓展问题,例如灾情巡视路线规划。讨论了如何根据不同题目要求调整遗传算法的各个部分,并给出了具体实例的解决方案和运行结果。
摘要由CSDN通过智能技术生成

问题背景:

        TSP问题可描述为:已知n个城市相互之间的距离,某一旅行商从某个城市出发访问每个城市一次且仅一次,最后回到出发城市,如何安排才使其所走路线最短。简言之,就是寻找一条最短的遍历n个城市的路径,或者说搜索自然子集X={1,2,……n}(X的元素表示对n个城市的编号)的一个排列s(X)={V1,V2,……,Vn},使得以某城市作为起点出发遍历所有城市并最后返回起点所走的路程最短。

        遗传算法流程图为:                                                                                                                                                                   101726_kcwE_2845902.png 

(1)编码

        通常解决TSP问题时采用整数排列编码方法,对n个城市的TSP问题,个体即为1-n的随机排列,整数对应各个城市序号。一般使用randperm(n)来创建一个个体,即产生1-n随机排列的向量,且符合每个城市只访问一次。

%% 初始化种群
%输入:
% NIND:种群大小
% N:   个体染色体长度(这里为城市的个数)  
%输出:
%初始种群
function Chrom=InitPop(NIND,N)
Chrom=zeros(NIND,N);%用于存储种群
for i=1:NIND
    Chrom(i,:)=randperm(N);%随机生成初始种群
end

(2)适应度函数

        我们求解问题的目标函数即为起点出发遍历所有城市且返回起点所走过的最短路径,为了使越短的路径适应度值越大,我们取适应度函数为路径的倒数。如此以来,经过的路径越短,适应度值越大;经过的路径越长,适应度值越小,即可有效地保留适应度值大的个体。(此适应度值仅仅用于选择操作,以较大的概率保留适应度值较大的个体;对于而后的操作,全部都直接使用目标值作为保留个体的依据)

%% 适应度值函数     
%输入:
%个体的长度(TSP的距离)
%输出:
%个体的适应度值
function FitnV=Fitness(len)
FitnV=1./len;

(3)选择操作

         选择操作即从旧种群中以一定概率选择个体到新种群中,个体被选中的概率跟适应度值有关,个体适应度值越大,被选中的概率就越大。个体保留数目与代沟有关,代沟为[0-1]的数,指示原种群中保留下来的个体占种群总个体数的比例。例:GGAP=0.95,表示100个个体里保留95个个体作为新种群的雏形。

%% 选择操作
%输入
%Chrom 种群
%FitnV 适应度值
%GGAP:代沟
%输出
%SelCh  被选择的个体
function SelCh=Select(Chrom,FitnV,GGAP)
NIND=size(Chrom,1);
NSel=max(floor(NIND*GGAP+.5),2);
ChrIx=Sus(FitnV,NSel);
SelCh=Chrom(ChrIx,:);


% 输入:
%FitnV  个体的适应度值
%Nsel   被选择个体的数目
% 输出:
%NewChrIx  被选择个体的索引号
function NewChrIx = Sus(FitnV,Nsel)
[Nind,ans] = size(FitnV);
cumfit = cumsum(FitnV);
trials = cumfit(Nind) / Nsel * (rand + (0:Nsel-1)');
Mf = cumfit(:, ones(1, Nsel));
Mt = trials(:, ones(1, Nind))';
[NewChrIx, ans] = find(Mt < Mf & [ zeros(1, Nsel); Mf(1:Nind-1, :) ] <= Mt);
[ans, shuf] = sort(rand(Nsel, 1));
NewChrIx = NewChrIx(shuf);

(4)交叉操作

        采用部分映射杂交,将父代样本两两分组,每组重复操作(假设城市数为10)

1.产生两个[1,10]区间内的随机整数r1和r2,确定两个位置,对两位置中间的中间数据进行交叉,如r1=4,r2=7

                                                    9     5     1    |    3     7     4     2    |    10     8     6

                                                  10     5     4    |    6     3     8     7    |     2      1     9

交叉为

                                                    9     5     1    |    6     3     8     7     |    10     *     * 

                                                  10     5     *     |    3     7     4     2     |     *      1     9

2.交叉后同一个个体中有重复的城市编号,不重复的数字保留,有冲突的数字则将非更改位置的重复数字用原位置的数代替,即完成交换。

具体的操作程序实际上为更换一个,交换一个,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值