永发信息网

急求 蚁群混合遗传算法在matlab上的实现以解决TSP旅行商的问题 小弟感激不尽

答案:1  悬赏:40  手机版
解决时间 2021-11-21 03:13
急求 蚁群混合遗传算法在matlab上的实现以解决TSP旅行商的问题 小弟感激不尽
最佳答案
建立m文件
function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)

%%-------------------------------------------------------------------------

%% 主要符号说明

%% C n个城市的坐标,n×2的矩阵

%% NC_max 最大迭代次数

%% m 蚂蚁个数

%% Alpha 表征信息素重要程度的参数

%% Beta 表征启发式因子重要程度的参数

%% Rho 信息素蒸发系数

%% Q 信息素增加强度系数

%% R_best 各代最佳路线

%% L_best 各代最佳路线的长度

%%=========================================================================

%%第一步:变量初始化

n=size(C,1);%n表示问题的规模(城市个数)

D=zeros(n,n);%D表示完全图的赋权邻接矩阵

for i=1:n

for j=1:n

if i~=j

D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;

else

D(i,j)=eps; %i=j时不计算,应该为0,但后面的启发因子要取倒数,用eps(浮点相对精度)表示

end

D(j,i)=D(i,j); %对称矩阵

end

end

Eta=1./D; %Eta为启发因子,这里设为距离的倒数

Tau=ones(n,n); %Tau为信息素矩阵

Tabu=zeros(m,n); %存储并记录路径的生成

NC=1; %迭代计数器,记录迭代次数

R_best=zeros(NC_max,n); %各代最佳路线

L_best=inf.*ones(NC_max,1); %各代最佳路线的长度

L_ave=zeros(NC_max,1); %各代路线的平均长度

while NC<=NC_max %停止条件之一:达到最大迭代次数,停止

%%第二步:将m只蚂蚁放到n个城市上

Randpos=[]; %随即存取

for i=1:(ceil(m/n))

Randpos=[Randpos,randperm(n)];

end

Tabu(:,1)=(Randpos(1,1:m))'; %此句不太理解?

%%第三步:m只蚂蚁按概率函数选择下一座城市,完成各自的周游

for j=2:n %所在城市不计算

for i=1:m

visited=Tabu(i,1:(j-1)); %记录已访问的城市,避免重复访问

J=zeros(1,(n-j+1)); %待访问的城市

P=J; %待访问城市的选择概率分布

Jc=1;

for k=1:n

if length(find(visited==k))==0 %开始时置0

J(Jc)=k;

Jc=Jc+1; %访问的城市个数自加1

end

end

%下面计算待选城市的概率分布

for k=1:length(J)

P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);

end

P=P/(sum(P));

%按概率原则选取下一个城市

Pcum=cumsum(P); %cumsum,元素累加即求和

Select=find(Pcum>=rand); %若计算的概率大于原来的就选择这条路线

to_visit=J(Select(1));

Tabu(i,j)=to_visit;

end

end

if NC>=2

Tabu(1,:)=R_best(NC-1,:);

end

%%第四步:记录本次迭代最佳路线

L=zeros(m,1); %开始距离为0,m*1的列向量

for i=1:m

R=Tabu(i,:);

for j=1:(n-1)

L(i)=L(i)+D(R(j),R(j+1)); %原距离加上第j个城市到第j+1个城市的距离

end

L(i)=L(i)+D(R(1),R(n)); %一轮下来后走过的距离

end

L_best(NC)=min(L); %最佳距离取最小

pos=find(L==L_best(NC));

R_best(NC,:)=Tabu(pos(1),:); %此轮迭代后的最佳路线

L_ave(NC)=mean(L); %此轮迭代后的平均距离

NC=NC+1 %迭代继续

%%第五步:更新信息素

Delta_Tau=zeros(n,n); %开始时信息素为n*n的0矩阵

for i=1:m

for j=1:(n-1)

Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);

%此次循环在路径(i,j)上的信息素增量

end

Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);

%此次循环在整个路径上的信息素增量

end

Tau=(1-Rho).*Tau+Delta_Tau; %考虑信息素挥发,更新后的信息素

%%第六步:禁忌表清零

Tabu=zeros(m,n); %%直到最大迭代次数

end

%%第七步:输出结果

Pos=find(L_best==min(L_best)); %找到最佳路径(非0为真)

Shortest_Route=R_best(Pos(1),:) %最大迭代次数后最佳路径

Shortest_Length=L_best(Pos(1)) %最大迭代次数后最短距离

subplot(1,2,1) %绘制第一个子图形

DrawRoute(C,Shortest_Route) %画路线图的子函数

subplot(1,2,2) %绘制第二个子图形

plot(L_best)

hold on %保持图形

plot(L_ave,'r')

title('平均距离和最短距离') %标题

function DrawRoute(C,R)

%%=========================================================================

%% DrawRoute.m

%% 画路线图的子函数

%%-------------------------------------------------------------------------

%% C Coordinate 节点坐标,由一个N×2的矩阵存储

%% R Route 路线

%%=========================================================================

N=length(R);

scatter(C(:,1),C(:,2));

hold on

plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'g')

hold on

for ii=2:N

plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g')

hold on

end

title('旅行商问题优化结果 ')

建m文件
function DrawRoute(C,R)

%%=========================================================================

%% DrawRoute.m

%% 画路线图的子函数

%%-------------------------------------------------------------------------

%% C Coordinate 节点坐标,由一个N×2的矩阵存储

%% R Route 路线

%%=========================================================================

N=length(R);

scatter(C(:,1),C(:,2));%画散点图

hold on

plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)],'g')

hold on

for ii=2:N

plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)],'g')

hold on

end

title('TSP问题优化结果 ')

命令窗口运行
C=[1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
4312 790
4386 570
3007 1970
2562 1756
2788 1491
2381 1676
1332 695
3715 1678
3918 2179
4061 2370
3780 2212
3676 2578
4029 2838
4263 2931
3429 1908
3507 2367
3394 2643
3439 3201
2935 3240
3140 3550
2545 2357
2778 2826
2370 2975
];
m=31;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
“訾”姓的发音是“CI”,为什么字典上是“ZI
一年级亲切的造句
金牌油烟机有哪些特点
destoon 登录时出现“累计5次错误尝试”请问
人死落草,为什么人刚死了,就叫落草?
925×9.4的竖式计算
形容看开心情突然好转成语
洁新干洗店(建华西路)地址好找么,我有些事要
9度酒吧地址在什么地方,想过去办事,
我想脱处咋办?
为什么我家人经常叫去外面做事,我不去就说我
美涤干洗店(华山中路)地址在哪,我要去那里办
8份之3加15份之3等于多少?
看着多高?
极地酒吧(步行街店)地址在什么地方,我要处理
推荐资讯
美剧永无止境女主角还演过什么
钢琴正对入户门影响风水吗?
吊兰根部像麦冬可以泡水喝吗?
汽车刹车知识:对于左脚刹车,你的误解有多深
这是一首歌歌词 说是童可可唱的 我也不知道
SS410标准
广东家具广场地址好找么,我有些事要过去,
13年江淮同悦手动挡5万公里能值多少钱?
作文提到同学能用,甲,代替吗?比如同学甲,
富盈宾馆(湖州德清县)地址在什么地方,我要处
指环果汁店里准现货是什么意思
溶脂瘦下巴后要注意什么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?