蚁群算法(ACA)及其Matlab实现

蚁群算法解决TSP问题
本文介绍了一种使用蚁群算法求解旅行商问题(TSP)的方法。该算法通过模拟蚂蚁寻找最短路径的行为来逐步优化解决方案。通过设置合理的参数,如信息素浓度、启发函数、挥发因子等,实现路径的不断优化。最终,通过Matlab编程实现了算法的具体应用,并给出了详细的代码及运行结果。

1基本原理

本质上也是一种概率算法,通过大概率收敛到最佳值,和其他的智能算法很相似。蚁群分泌的信息素存在正反馈,使得较佳的解

具有大概率被选到,当全局都选用较佳的解,变可以得到整体的最优解。

2几个关键点:

  1) 概率选择:

      受信息素浓度和启发函数影响,启发函数为距离的倒数

   2)信息素挥发

      考虑到信息素随时间的挥发,加入挥发因子                

3程序设计步骤:

    1初始化各个参数:包括各点的距离,信息素的初始浓度,蚂蚁数量,信息素挥发因子

                                    信息素和启发函数的重要度因子,启发函数,最大迭代次数,路径记录表等等

      2迭代:对每个蚂蚁随机制定初始值,再根据概率选择,选择出每只蚂蚁的路径,确定每只蚂蚁的路径总长度,

                   以及蚁群的最佳路径长度和平均长度,并对信息素进行更新。

      3展示:展示出最佳路径,以及最佳路径对迭代的变化图

   4Matlab代码

 

clc,clear                                                                                    %清空环境中的变量
load data.txt                                                                           %读入城市的坐标
t0 = clock;                                                                                %程序计时开始
%%
%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%
city=data;
n = size(city,1);                                                                      %城市距离初始化
D = zeros(n,n);                                                    
for i = 1:n
    for j = 1:n
           if i ~= j
            D(i,j) = sqrt(sum((city(i,:) - city(j,:)).^2));
        else
            D(i,j) = 0;      %设定的对角矩阵修正值
        end
    end    
end
m=30;                                                                                        %蚂蚁数量
alpha = 1;                                                                                 % 信息素重要程度因子
beta = 5;                                                                                  % 启发函数重要程度因子
v = 0.1;                                                                                     % 信息素挥发因子
Q = 0.5;                                                                                     % 信息因子常系数
H= 1./D;                                                                         % 启发函数
T= ones(n,n);                                                                         % 信息素矩阵
Table = zeros(m,n);                                                               % 路径记录表
iter = 1;                                                                                    % 迭代次数初值
iter_max = 50;                                                                     % 最大迭代次数 
best_route = zeros(iter_max,n);                                       % 各代最佳路径       
best_length = zeros(iter_max,1);                                     % 各代最佳路径的长度  
%%
while iter<=iter_max
   
                        % 随机产生每只蚂蚁的起点城市
                          start = zeros(m,1);
                          for i = 1:m
                              temp = randperm(n);
                              start(i) = temp(1);
                          end
                          Table(:,1) = start; 
                          city_index=1:n;
                          for i = 1:m
                          % 逐个城市路径选择
                         for j = 2:n
                             tabu = Table(i,1:(j - 1));                                                   % 已访问的城市集合
                             allow =city_index( ~ismember(city_index,tabu));    % 筛选出未访问的城市集合
                             P = zeros(1,length(allow));
                             % 计算相连城市的转移概率
                             for k = 1:length(allow)
                                 P(k) = T(tabu(end),allow(k))^alpha * H(tabu(end),allow(k))^beta;
                             end
                             P = P/sum(P);
                             % 轮盘赌法选择下一个访问城市
                            Pc = cumsum(P);     %参加说明2(程序底部)
                            target_index = find(Pc >= rand); 
                            target = allow(target_index(1));
                            Table(i,j) = target;
                         end
                      end

                          % 计算各个蚂蚁的路径距离
                                  Length = zeros(m,1);
                                  for i = 1:m
                                      Route = [Table(i,:) Table(i,1)];
                                      for j = 1:n
                                          Length(i) = Length(i) + D(Route(j),Route(j + 1));
                                      end
                                  end   
             %对最优路线和距离更新            
                   if iter == 1
                      [min_length,min_index] = min(Length);
                      best_length(iter) = min_length;  
                      best_route(iter,:) = Table(min_index,:);
                  else
                      [min_length,min_index] = min(Length);
                           if min_length<best_length(iter-1)
                                     best_length(iter)=min_length;
                                     best_route(iter,:)=Table(min_index,:);
                           else
                                    best_length(iter)=best_length(iter-1);
                                    best_route(iter,:)=best_route(iter-1,:);
                           end 
                   end
                            % 更新信息素
                          Delta_T= zeros(n,n);
                          % 逐个蚂蚁计算
                          for i = 1:m
                              % 逐个城市计算
                              Route = [Table(i,:) Table(i,1)];
                              for j = 1:n
                                  Delta_T(Route(j),Route(j+1)) = Delta_T(Route(j),Route(j+1)) +D(Route(j),Route(j+1))* Q/Length(i);
                              end
                          end
                          T= (1-v) * T + Delta_T;
                                 % 迭代次数加1,并清空路径记录表
                        iter = iter + 1;
                        Table = zeros(m,n);              
end
%--------------------------------------------------------------------------
%% 结果显示
shortest_route=best_route(end,:);                 %选出最短的路径中的点
short_length=best_length(end);
Time_Cost=etime(clock,t0);
disp(['最短距离:' num2str(short_length)]);
disp(['最短路径:' num2str([shortest_route shortest_route(1)])]);
disp(['程序执行时间:' num2str(Time_Cost) '秒']);
%--------------------------------------------------------------------------
%% 绘图
figure(1)
%采用连线图画起来
plot([city(shortest_route,1);city(shortest_route(1),1)], [city(shortest_route,2);city(shortest_route(1),2)],'o-');
for i = 1:size(city,1)
    %对每个城市进行标号
    text(city(i,1),city(i,2),['   ' num2str(i)]);
end
xlabel('城市位置横坐标')
ylabel('城市位置纵坐标')
title(['蚁群算法最优化路径(最短距离):' num2str(short_length) ''])

figure(2)
%画出收敛曲线
plot(1:iter_max,best_length,'b')
xlabel('迭代次数')
ylabel('距离')
title('迭代收敛曲线')

 

 程序说明:采用蚁群算法求取TSP问题,共有34个城市,从txt文件加载数据:

运行结果:

 

转载于:https://www.cnblogs.com/jacksin/p/9163508.html

1 2/3维图像分割工具箱 2 PSORT粒子群优化工具箱 3 matlab计量工具箱Lesage 4 MatCont7p1 5 matlab模糊逻辑工具箱函数 6 医学图像处理工具箱 7 人工蜂群工具箱 8 MPT3安装包 9 drEEM toolbox 10 DOMFluor Toolbox v1.7 11 Matlab数学建模工具箱 12 马尔可夫决策过程(MDP)工具箱MDPtoolbox 13 国立SVM工具箱 14 模式识别与机器学习工具箱 15 ttsbox1.1语音合成工具箱 16 分数阶傅里叶变换的程序FRFT 17 魔方模拟器与规划求解 18 隐马尔可夫模型工具箱 HMM 19 图理论工具箱GrTheory 20 自由曲线拟合工具箱ezyfit 21 分形维数计算工具箱FracLab 2.2 22 For-Each 23 PlotPub 24 Sheffield大学最新遗传算法工具箱 25 Camera Calibration 像机标定工具箱 26 Qhull(二维三维三角分解、泰森图)凸包工具箱 2019版 27 jplv7 28 MatlabFns 29 张量工具箱Tensor Toolbox 30 海洋要素计算工具箱seawater 31 地图工具箱m_map 32 othercolor配色工具包 33 Matlab数学建模工具箱 34 元胞自动机 35 量子波函数演示工具箱 36 图像局域特征匹配工具箱 37 图像分割graphcut工具箱 38 NSGA-II工具箱 39 chinamap中国地图数据工具箱(大陆地区) 40 2D GaussFit高斯拟合工具箱 41 dijkstra最小成本路径算法 42 多维数据快速矩阵乘法 43 约束粒子群优化算法 44 脑MRI肿瘤的检测与分类 45 Matlab数值分析算法程序 46 matlab车牌识别完整程序 47 机器人工具箱robot-10.3.1 48 cvx凸优化处理工具箱 49 hctsa时间序列分析工具箱 50 神经科学工具箱Psychtoolbox-3-PTB 51 地震数据处理工具CREWES1990版 52 经济最优化工具箱CompEcon 53 基于约束的重构分析工具箱Cobratoolbox 54 Schwarz-Christoffel Toolbox 55 Gibbs-SeaWater (GSW)海洋学工具箱 56 光声仿真工具箱K-Wave-toolbox-1.2.1 57 语音处理工具箱Sap-Voicebox 58 贝叶斯网工具箱Bayes Net Toolbox(BNT) 59 计算机视觉工具箱VFfeat-0.9.21 60 全向相机校准工具箱OCamCalib_v3.0 61 心理物理学数据分析工具箱Palamedes1_10_3 62 生理学研究工具箱EEGLAB 63 磁共振成像处理工具箱CONN 18b 64 matlab 复杂网络工具箱 65 聚类分析工具箱FuzzyClusteringToolbox 66 遗传规划matlab工具箱 67 粒子群优化工具箱 68 数字图像处理工具箱DIPUM Toolbax V1.1.3 69 遗传算法工具箱 70 鱼群算法工具箱OptimizedAFSAr 71 蚁群算法工具箱 72 matlab优化工具箱 73 数据包络分析工具箱 74 图像分割质量评估工具包 75 相关向量机工具箱 76 音频处理工具箱 77 nurbs工具箱 78 Nurbs-surface工具箱 79 grabit数据提取工具箱 80 量子信息工具箱QLib 81 DYNAMO工具箱 82 NEDC循环的整车油耗量 83 PlotHub工具箱 84 MvCAT_Ver02.01 85 Regularization Tools Version 4.1 86 MatrixVB 4.5(含注册) 87 空间几何工具箱 matGeom-1.2.2 88 大数计算工具箱 VariablePrecisionIntegers 89 晶体织构分析工具包 mtex-5.7.0 90 Minimal Paths 2工具箱 91 Matlab数学建模工具箱
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值