卖货郎问题

158 阅读2分钟

正文

本文已参与「新人创作礼」活动,一起开启掘金创作之路。货郎担问题属于易于描述但难于解决的著名难题之一,至今世界上还有不少人在研究它。该问题的基本描述是:某售货员要到若干个村庄售货,各村庄之间的路程是已知的,为了提高效率,售货员决定从所在商店出发,到每个村庄售一次货然后返回商店,问他应选择一条什么路线才能使所走的总路程最短? 有很多实际问题可归结为货郎担问题·。例如邮路问题就是一个货郎担问题。假定有一辆邮车要到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