问题背景:
TSP问题可描述为:已知n个城市相互之间的距离,某一旅行商从某个城市出发访问每个城市一次且仅一次,最后回到出发城市,如何安排才使其所走路线最短。简言之,就是寻找一条最短的遍历n个城市的路径,或者说搜索自然子集X={1,2,……n}(X的元素表示对n个城市的编号)的一个排列s(X)={V1,V2,……,Vn},使得以某城市作为起点出发遍历所有城市并最后返回起点所走的路程最短。
遗传算法流程图为:
(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.交叉后同一个个体中有重复的城市编号,不重复的数字保留,有冲突的数字则将非更改位置的重复数字用原位置的数代替,即完成交换。
具体的操作程序实际上为更换一个,交换一个,