蚁群算法解决TSP问题(matlab代码实现)

🌞欢迎来到智能优化算法的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

🌠本阶段属于筑基阶段之一,希望各位仙友顺利完成突破

📆首发时间:🌹2021年11月10日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


 目录

0️⃣基本原理

         1️⃣基本流程

2️⃣主要公式

3️⃣代码部分

0️⃣✨✨✨基本原理✨✨✨

    单个蚂蚁的行为比较简单,但是蚁群整体却可以体现一些智能的行为。例如蚁群可以在不同的环境下,寻找最短到达食物源的路径。这是因为蚁群内的蚂蚁可以通过某种信息机制实现信息的传递。后又经进一步研究发现,蚂蚁会在其经过的路径上释放一种可以称之为“信息素”的物质,蚁群内的蚂蚁对“信息素”具有感知能力,它们会沿着“信息素”浓度较高路径行走,而每只路过的蚂蚁都会在路上留下“信息素”,这就形成一种类似正反馈的机制,这样经过一段时间后,整个蚁群就会沿着最短路径到达食物源了


1️⃣✨✨✨基本流程✨✨✨

Step1:变量初始化;

Step2:将m只蚂蚁放在n个元素上

Step3:m只蚂蚁按概率完成各自的周游;

Step4:记录本次最佳路线;

Step5:更新禁忌表;

Step6:更新信息表;

Step7:判断是否满足终止条件


2️⃣✨✨✨主要公式✨✨✨ 


3️⃣✨✨✨代码部分✨✨✨


%%%%%蚁群算法解决TSP%%%%%
%%%%%初始化%%%%%
clear all; %清除所有变量
close all; %清屏
clc ;      %清图
m=50;    %蚂蚁个数
Alpha=1;  %Alpha表征信息素重要程度的参数
Beta=5;  % Beta表征启发式因子重要程度的参数
Rho=0.1; % Rho信息素蒸发系数
NC_max=200; %最大迭代次数
Q=100;         %信息素增加强度
 
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 2376;
  3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;
  2370 2975];                %%31个省会坐标数据
%%%%%%第一步:变量初始化%%%%%%%%%%%%%%%
n=size(C,1);%城市个数
D=zeros(n,n);%两的城市距离间隔矩阵
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;      
        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);   %各代最佳路线的长度  %inf 正无穷
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)); %找到最佳路径
Shortest_Route=R_best(Pos(1),:) %最大迭代次数后最佳路径
Shortest_Length=L_best(Pos(1)) %最大迭代次数后最短距离
 
figure(1) 
plot(L_best)
xlabel('迭代次数')
ylabel('最短路径长度')
title('每代最短路径长度进化曲线')
 
figure(2)
%绘制第一个子图形,路线图
subplot(1,2,1)                 
N=length(Shortest_Route);
scatter(C(:,1),C(:,2)); %绘制闪点图
 hold on
 plot([C(Shortest_Route(1),1),C(Shortest_Route(N),1)],[C(Shortest_Route(1),2),C(Shortest_Route(N),2)],'g')
 hold on
for ii=2:N
    plot([C(Shortest_Route(ii-1),1),C(Shortest_Route(ii),1)],[C(Shortest_Route(ii-1),2),C(Shortest_Route(ii),2)],'g')
     hold on
end
title('旅行商最短路线结果图 ')
 
%绘制第二个子图形
subplot(1,2,2)                  
plot(L_best)
hold on                         %保持图形
plot(L_ave,'r')
legend('最短距离','平均距离')
title('平均距离和最短距离')     %标题

  • 21
    点赞
  • 93
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
蚁群算法是一种基于模拟蚂蚁觅食行为的启发式算法,可以用于求解TSP问题。在MATLAB中,可以通过以下步骤实现: 1. 定义城市距离矩阵,即TSP问题的输入数据。 2. 初始化蚂蚁的位置和信息素矩阵。 3. 迭代搜索过程中,每只蚂蚁按照一定的概率选择下一个城市,并更新信息素矩阵。 4. 记录每次迭代中最优路径和路径长度。 5. 输出最优路径和路径长度。 以下是一个简单的MATLAB代码示例: ```matlab % 定义城市距离矩阵 dist = [...]; % 初始化参数 num_ant = 50; % 蚂蚁数量 num_city = size(dist, 1); % 城市数量 pheromone = ones(num_city, num_city); % 信息素矩阵 alpha = 1; % 信息素重要程度因子 beta = 5; % 启发式因子 rho = 0.5; % 信息素挥发因子 Q = 100; % 信息素增加强度因子 % 开始迭代搜索 best_path = []; best_length = Inf;for iter = 1:100 % 初始化蚂蚁位置 ant_pos = randi(num_city, num_ant, 1); for i = 1:num_city-1 % 计算每只蚂蚁的下一个城市概率 prob = (pheromone(ant_pos(:,i),:) .^ alpha) .* ((1./dist(ant_pos(:,i),:)) .^ beta); prob(:, ant_pos(:,1:i-1)) = 0; % 已经访问过的城市概率为0 prob = prob ./ sum(prob, 2); % 按照概率选择下一个城市 [~, next_city] = max(rand(num_ant, 1) <= cumsum(prob, 2), [], 2); ant_pos(:,i+1) = next_city; end % 计算每只蚂蚁的路径长度 path_length = sum(dist(sub2ind([num_city, num_city], ant_pos(:,end), ant_pos(:,1))), 1); for i = 1:num_ant-1 path_length(i+1) = sum(dist(sub2ind([num_city, num_city], ant_pos(i,:), ant_pos(i+1,:))), 2); end % 更新信息素矩阵 delta_pheromone = zeros(num_city, num_city); for i = 1:num_ant for j = 1:num_city-1 delta_pheromone(ant_pos(i,j), ant_pos(i,j+1)) = delta_pheromone(ant_pos(i,j), ant_pos(i,j+1)) + Q/path_length(i); end delta_pheromone(ant_pos(i,end), ant_pos(i,1)) = delta_pheromone(ant_pos(i,end), ant_pos(i,1)) + Q/path_length(i); end pheromone = (1-rho) * pheromone + delta_pheromone; % 记录最优路径和路径长度 if min(path_length) < best_length best_path = ant_pos(path_length == min(path_length), :); best_length = min(path_length); end end % 输出结果 disp(['Best path: ', num2str(best_path)]); disp(['Best length: ', num2str(best_length)]); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值