正文
本文已参与「新人创作礼」活动,一起开启掘金创作之路。货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。该问题的基本描述是:某售货员要到若干个村庄售货,各村庄之间的路程是已知的,为了提高效率,售货员决定从所在商店出发,到每个村庄售一次货然后返回商店,问他应选择一条什么路线才能使所走的总路程最短? 有很多实际问题可归结为货郎担问题·。例如邮路问题就是一个货郎担问题。假定有一辆邮车要到n个不同的地点收集邮件,这种情况可以用n十1个结点的图来表示。
matlab实现卖货郎问题
%TSP问题(又名:[旅行商问题](https://so.csdn.net/so/search?q=%E6%97%85%E8%A1%8C%E5%95%86%E9%97%AE%E9%A2%98&spm=1001.2101.3001.7020),货郎担问题)遗传算法通用matlab程序
%D是距离[矩阵](https://so.csdn.net/so/search?q=%E7%9F%A9%E9%98%B5&spm=1001.2101.3001.7020),n为种群个数
%参数a是中国31个城市的坐标
%C为停止代数,遗传到第 C代时程序停止,C的具体取值视问题的规模和耗费的时间而定%m为适应值归一化淘汰加速指数,最好取为1,2,3,4,不宜太大
%alpha为淘汰保护指数,可取为0~1之间任意小数,取1时关闭保护功能,建议取
0.8~1.0之间的值
%R为最短路径,Rlength为路径长度
function [R,Rlength]=geneticTSP(D,a,n,C,m,alpha)
[N,NN]=size(D);
farm=zeros(n,N);%用于存储种群
for i=1:n
farm(i,:)=randperm(N);%随机生成初始种群
end
R=farm(1,:);
subplot(1,3,1)
scatter(a(:,1),a(:,2),'x')
pause(1)
subplot(1,3,2)
plotaiwa(a,R)
pause(1)
farm(1,:)=R;
len=zeros(n,1);%存储路径长度
fitness=zeros(n,1);%存储归一化适应值
counter=0;
while counter for i=1:n
len(i,1)=myLength(D,farm(i,:));%计算路径长度
end
maxlen=max(len);
minlen=min(len);
fitness=fit(len,m,maxlen,minlen);%计算归一化适应值
rr=find(len==minlen);
R=farm(rr(1,1),:);%更新最短路径
FARM=farm;%优胜劣汰,nn记录了复制的个数
nn=0;
for i=1:n
if fitness(i,1)>=alpha*rand
nn=nn+1;
FARM(nn,:)=farm(i,:);
end
end
end