基于蚁群算法的10个城市TSP问题的最短路径研究

欢迎关注:天际使徒的个人博客

1 蚁群算法

1.1 蚁群算法的流程步骤

这里以TSP问题为例,算法设计的流程如下:
步骤1:对相关参数进行初始化,包括蚁群规模、信息素因子、启发函数因子、信息素挥发因子、信息素常数、最大迭代次数等,以及将数据读入程序,并进行预处理:比如将城市的坐标信息转换为城市间的距离矩阵。
步骤2:随机将蚂蚁放于不同出发点,对每个蚂蚁计算其下个访问城市,直到有蚂蚁访问完所有城市。
步骤3:计算各蚂蚁经过的路径长度 ,记录当前迭代次数最优解,同时对路径上的信息素浓度进行更新。
步骤4:判断是否达到最大迭代次数,若否,返回步骤2;是,结束程序。
步骤5:输出结果,并根据需要输出寻优过程中的相关指标,如运行时间、收敛迭代次数等。
要用到的符号说明:
mm:整个蚂蚁群体中蚂蚁数量;nn:城市的数量; :城市i与城市j的距离 ; :t时刻城市i和城市j连接路径上的信息素; :t时刻蚂蚁k从城市i转移到城市j的概率。
初始时刻蚂蚁被放在不同的城市,且各城市路径上的信息素浓度为0。
由于蚁群算法涉及到的参数蛮多的,且这些参数的选择对程序又都有一定的影响,所以选择合适的参数组合很重要。蚁群算法有个特点就是在寻优的过程中,带有一定的随机性,这种随机性主要体现在出发点的选择上。蚁群算法正是通过这个初始点的选择将全局寻优慢慢转化为局部寻优的。参数设定的关键就在于在“全局”和“局部”之间建立一个平衡点。

1.2 蚁群算法的关键参数

在蚁群算法的发展中,关键参数的设定有一定的准则,一般来讲遵循以下几条:
尽可能在全局上搜索最优解,保证解的最优性;
算法尽快收敛,以节省寻优时间;
尽量反应客观存在的规律,以保证这类仿生算法的真实性。
蚂蚁数量:
设M表示城市数量,m表示蚂蚁数量。m的数量很重要,因为m过大时,会导致搜索过的路径上信息素变化趋于平均,这样就不好找出好的路径了;m过小时,易使未被搜索到的路径信息素减小到0,这样可能会出现早熟,没找到全局最优解。一般上,在时间等资源条件紧迫的情况下,蚂蚁数设定为城市数的1.5倍较稳妥。
信息素因子:
信息素因子反映了蚂蚁在移动过程中所积累的信息量在指导蚁群搜索中的相对重要程度,其值过大,蚂蚁选择以前走过的路径概率大,搜索随机性减弱;值过小,等同于贪婪算法,使搜索过早陷入局部最优。实验发现,信息素因子选择[1,4]区间,性能较好。
启发函数因子:
启发函数因子反映了启发式信息在指导蚁群搜索过程中的相对重要程度,其大小反映的是蚁群寻优过程中先验性和确定性因素的作用强度。过大时,虽然收敛速度会加快,但容易陷入局部最优;过小时,容易陷入随机搜索,找不到最优解。实验研究发现,当启发函数因子为[3,4.5]时,综合求解性能较好。
信息素挥发因子:
信息素挥发因子表示信息素的消失水平,它的大小直接关系到蚁群算法的全局搜索能力和收敛速度。实验发现,当属于[0.2,0.5]时,综合性能较好。
信息素常数:
这个参数为信息素强度,表示蚂蚁循环一周时释放在路径上的信息素总量,其作用是为了充分利用有向图上的全局信息反馈量,使算法在正反馈机制作用下以合理的演化速度搜索到全局最优解。值越大,蚂蚁在已遍历路径上的信息素积累越快,有助于快速收敛。实验发现,当值属于[10,1000]时,综合性能较好。
最大迭代次数:
最大迭代次数值过小,可能导致算法还没收敛就已结束;过大则会导致资源浪费。一般最大迭代次数可以取100到500次。一般来讲,建议先取200,然后根据执行程序查看算法收敛的轨迹来修改取值。
组合参数设计策略:
通常可以按照以下策略来进行参数组合设定:

  1. 确定蚂蚁数目,蚂蚁数目与城市规模之比约为1.5;
  2. 参数粗调,即调整取值范围较大的α,β及Qα,β及Q;
  3. 参数微调,即调整取值范围较小的ρ。

2 实验结果

2.1 实验代码

(1)ACATSP.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
%{1.C就是城市坐标x         y
城市1    0     120
城市2   120     0      城市n   100    230
2.运行后这里D变成了一个n*n的矩阵,每个元素代表两个城市之间的距离,比如当城市数目为3时:
D=      城市1    城市2    城市3城市1   0        120      100
城市2  120       0        230 城市3  100    230         0
这里D是个对角线为0的对称矩阵,因为城市1,2间距离等于城市2,1的距离,城市n与n距离设置为0
%}
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))';
%{1.ceil(m/n)
假如有 10只蚂蚁,3个城市,ceil(m/n)=ceil(10/3)=4,需要安排四次,才能把这十只蚂蚁全部放到到三个城市,
每次都在行向量Randpos加入如新的元素,randperm(3)表示就是1 3 2,或者3 1 2这种随机组合,4次循环之后,
那么Randpos =2     3     1     1     2     3     3     1     2     3     2     1
2.Tabu(:,1)=(Randpos(1,1:m))'
总共m蚂蚁,只这里m为10,Tabu(:,1)表示Tabu第一行就是初始10只蚂蚁被随机分到所三个城市中的一个
Tabu =2311233123
这里只取m=10个数,因为Tabu第一列表示m只蚂蚁初始的时候随机被分在的城市,比如第一个2代表,第一只蚂蚁
最开始放在了城市2,以此类推
%}
%%第三步: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;                           %这时记录没有访问的城市到J中
Jc=Jc+1;                         %访问的城市个数自加1
end
end
%{1.visited=Tabu(i,1:(j-1));    向量visited记录已访问的城市,比如第一次Tabu中第一行第一个的城市2
2.J=zeros(1,(n-j+1))           向量J记录待访问的城市,已结访问城市2,还没访问1和3城市放入J向量中
3.if length(find(visited==k))==0
判断语句,find()语句找到visited中等于k的元素在数组visited中的位置,例如数组a=[1 2 3 4 5 2],
find(a==2)=[2,6],find(a==6)=[],则
length(find(a==6))=0
length()==0判断length()是否为零
如果为零就是visited中没有k元素,即没有访问过k城市。
这时记录没有访问的城市到J中。
%}
%下面计算待选城市的概率分布
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); %若计算的概率大于原来的就选择这条路线%要选择其中总概率大于等于某一个随机数,找到大于等于这个随机数的城市的在J中的位置
to_visit=J(Select(1));  %提取这些城市的编号到to_visit中
Tabu(i,j)=to_visit;
end
end
%{1. %visited(end)表示蚂蚁现在所在城市编号,J(k)表示下一步要访问的城市编号
2.P=P/(sum(P));把各个路径概率统一到和为1
3.Pcum=cumsum(P);   cumsum,元素累加即求和,比如P=[0.1 0.5 0.4],cumsum(P)=  [0.1000    0.6000    1.0000]
有一点要特别说明,用到cumsum(P),蚂蚁要选择的下一个城市不是按最大概率,就是要用到轮盘法则,不然影响全局收缩能力,
所以用到累积函数,Pcum=cumsum(P)
4.Select=find(Pcum>=rand); to_visit=J(Select(1))
轮盘法则,Select(1),1保证可以选到最大概率的城市,具体自己可以用matlab试一下:p=[0.1 0.6 0.3]    中间那个城市概率最大
此时Pcum=[0.1  0.7  1],   Select =[2   3];  Select(1)=2,中间那个城市概率最大
%}
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
%{1.L=zeros(m,1)   记录本次迭代最佳路线的长度,每个蚂蚁都有自己走过的长度记录在向量L中
%}
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;                     %迭代继续%{1.R_best(NC,:)=Tabu(pos(1),:):找到路径最短的那条蚂蚁所在的城市先后顺序,pos(1)中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
%{1.R_best(NC,:)=Tabu(pos(1),:):找到路径最短的那条蚂蚁所在的城市先后顺序,pos(1)中1表示万一有长度一样的两条蚂蚁,那就选第一个%}
%%第七步:输出结果
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('平均距离和最短距离')     %标题

(2) DrawRoute.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)],'r')
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)],'r')
hold on
end
title('旅行商问题优化结果 ')

2.2 实验绘图

命令行窗口输入以下参数:

c=[1,2;70,90;80,60;10,100;800,200;800,100;90,80;200,600;230,4;500,90];
nc=100;
m=18;
a=1;
b=5;
p=0.5;
q=1;
ACATSP(c,nc,m,a,b,p,q);

得到下图

基于蚁群算法的10个城市TSP问题的最短路径研究(附源码及讲解步骤)相关推荐

  1. 【路径规划】基于蚁群算法求解电动汽车充电站与换电站协调路径规划matlab源码含GUI

    1.蚁群算法(ant colony algorithm,ACA)起源和发展历程 Marco Dorigo等人在研究新型算法的过程中,发现蚁群在寻找食物时,通过分泌一种称为信息素的生物激素交流觅食信息从 ...

  2. java毕业设计——基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现(毕业论文+程序源码)——蚁群算法路由选择可视化动态模拟

    基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+MMAS的蚁群算法路由选择可视化动态模拟设计与实现,文章末尾附有本毕业设计的 ...

  3. 【Matlab DVRP】蚁群算法求解带距离的车辆路径规划问题【含源码 1040期】

    一.代码运行视频(哔哩哔哩) [Matlab DVRP]蚁群算法求解带距离的车辆路径规划问题[含源码 1040期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  4. 【无标题】(论文阅读)基于蚁群算法的现代藏文字符轮廓提取技术研究-孙淑娟

    一.摘要 由于对字符提取骨架往往会失去受污损部位的重要信息,因此本文提出了一种基于蚁群算法的现代藏文字符轮廓提取 算法‚旨在用字符的轮廓线代替骨架线来表征字符.本算法用于印刷体藏文轮廓提取‚取得了良好 ...

  5. 【无人机】基于matlab蚁群算法求解含危险源的无人机路径规划【含Matlab源码 2059期】

    一.无人机简介 0 引言 随着现代技术的发展,飞行器种类不断变多,应用也日趋专一化.完善化,如专门用作植保的大疆PS-X625无人机,用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机,以及用作水下 ...

  6. 【路径规划】基于matlab蚁群算法栅格地图路径规划及避障【含Matlab源码 2088期】

    一.蚁群算法及栅格地图简介 随着机器人技术在诸多领域的应用, 如机器人协作焊接.灾后搜救.军事.太空探索.深海勘探.家用和服务行业等, 机器人的发展正向智能化方向延伸, 要求其具有自组织.自学习.自适 ...

  7. 【建模算法】基于蚁群算法求解TSP问题(Python实现)

    [建模算法]基于蚁群算法(ACA)求解TSP问题(Python实现) TSP (traveling salesman problem,旅行商问题)是典型的NP完全问题,即其最坏情况下的时间复杂度随着问 ...

  8. ​【路径规划】基于蚁群算法求解多式联运路径规划问题matlab源码

    1 简介 随着国际贸易的不断发展和国内外物品流通的速度不断加快,多式联运作为一种先进的运输组织形式不断发展.在运输过程中,合理的路径选择和运输模式选择对多式联运的经营者会带来卓有成效的经济效益,而其中 ...

  9. 链路状态算法实现Java,JAVA基于蚁群算法路由选择可视化动态模拟(开题报告+任务书+毕业论文+外文翻译+源代码+可执行程序+答辩P...

    JAVA基于蚁群算法路由选择可视化动态模拟(开题报告+任务书+毕业论文+外文翻译+源代码+可执行程序+答辩PPT) 摘 要 路由选择是一种基于网络层的协议,而所有流行的网络层路由选择协议都是基于以下两 ...

最新文章

  1. 32位处理器是什么意思
  2. 混合mixin函数_Less 混合
  3. Oralce 使用SQL中的exists 和not exists 用法详解
  4. 网工路由基础(2)路由选路原理
  5. Java正成为COBOL的一部分-它将成为COBOL的一部分吗?
  6. dom4j和jaxb_JAXB,SAX,DOM性能
  7. python 文件加密_python实现文件快照加密保护的方法
  8. 【代码源 Div1 - 105】#451. Dis(倍增求LCA)
  9. 2021年王道考研计算机408【新课】
  10. python github 12306 文贤平_GitHub排名第一!免费最强“抢票神器”在手,程序员抢票再不用跪求加速包...
  11. 小程序毕设作品之微信积分商城小程序毕业设计成品(6)开题答辩PPT
  12. 结构梁配筋最牛插件_YouTube 字幕翻译 —— Chrome 插件
  13. Android 如何查看apk签名信息的MD5(SHA1和SHA256也可以)
  14. javaWeb—9.Git
  15. Fugiat inventore earum unde officia nihil ratione.Аллея развитый юный сынок угроза голубчик.
  16. 用Javascript实现回到顶部效果
  17. 计算机科学期刊是ISTP吗,ISTP期刊是核心期刊吗
  18. network “xxxx“ is declared as external
  19. 解决vmware 本地连接时出错:地址仍未与网络终结点关联
  20. 读《佛说》:提炼出的哪些惊世脱俗的句子

热门文章

  1. 群晖python套件包_群晖中给Python3安装pip工具以安装扩展包
  2. Java项目ssm企业工资管理系统源码
  3. 教你一招,让你摆脱ftp工具上因为权限不足而删不了想删除文件夹的苦恼
  4. RSA算法加解密的C语言实现
  5. CSDN专访:吃喝玩乐背后的黑科技
  6. 用友金蝶 道不同殊途同归
  7. compose的TextField等组件请求焦点和释放焦点
  8. 前端----CSS 父元素在子元素之上显示
  9. 图像RGB与数组关系理解
  10. Python判断奇偶数