用遗传算法求解的tsp问题
对于遗传算法的基本定义及内容笔者就不重复了,这里附上网址供大家去学习参看。遗传算法
大家也可以参看我其他的文章,比如智能算法和数学建模专题,里面都有详细的介绍和题目代码,完全够读者学习和使用的,后面笔者也会对这些专题和其他内容进行更新,敬请期待哦。
题目:在一条装配线上用一个机械手去固定待装配部件上的螺母问题。机械手由其初始位置(该位置在第一个要紧固螺母的上方)开始,依次移动到其余的每一个螺母,最后返回到初始位置。机械手移动的路线就是以螺母为结点的一条周游路线。一条最小成本周游路线将使机械手完成工作的时间取最小值。注意:只有机械手移动的时间总量是变化的。
分析:我们要求时间最短的路线,在机械手移动速度不变的情况下,即可以把问题转化为路径最短的问题。而初始位置的信息则告诉我们,机械手出发时已经处在出发螺母的位置了。
关于问题的实现方面,设螺母数量为N,我们生成一个长度为N的向量,向量的每个元素就是依次要到达的螺母编号,比如[1 2 3 4 5 … N]。之后我们采用相对应的遗传算法进行求解即可,具体内容请看Matlab代码。
clear
clc
position = [2 3
5 7
7 1
9 2
3 5
4 10
1 1
6 8
7 7
10 2];
% 计算各点之间的距离矩阵D
[m,n] = size(position);
D = zeros(m);
for i = 1:m
for j = 1:m
if i == j
D(i,j) = 0;
else
D(i,j) = sqrt((position(i,1)-position(j,1))^2+(position(i,2)-position(j,2))^2);
end
end
end
% 初始参数的设定
len = m;
popsize = 20;
maxgen = 100;
pc = 0.9;
pm = 0.05;
ggap = 0.9;
chrom = initial(popsize,len);
% 画出一个可行解
drawpath(chrom(1,:),position);
title('一可行解的路线');
disp(['路线与路程为:',pathlength(D,chrom(1,:))]);
outputpath(chrom(1,:));
% 开始迭代
global gen;
gen = 1;
track = zeros(maxgen,m);
record = zeros(1,maxgen);
while gen <= maxgen
[row,~] = size(chrom);
for i = 1:row
long(i) = pathlength(D,chrom(i,:));
end
fitv = fit(long);
% 选择
selch = select5(chrom,fitv,ggap);
% 交叉
selch = cross5(pc,selch);
% 变异
selch = mutate1(selch,pm);
% 逆转操作
selch = reverse5(selch,D);
% 重插入子代的新种群
chrom = reins5(chrom,selch,long);
[row,~] = size(chrom);
temp = zeros(row,1);
for i = 1:row
temp(i) = pathlength(D,chrom(i,:));
end
[index1,index2] = min(temp);
record(gen) = index1;
track(gen,:) = chrom(index2,:);
gen = gen + 1;
end
[~,index] = min(record);
drawpath(track(index,:),position);
hold on;
xlabel('x轴')
ylabel('y轴')
title('最短路径')
outputpath(track(index,:));
figure
hold on
plot(1:maxgen,record);
xlabel('迭代次数');
ylabel('距离');
title('优化过程');
结果: