【ACO TSP】蚁群算法求解52城市旅行商问题(目标函数:最短距离)【含Matlab源码 4449期】

在这里插入图片描述

⛄一、获取代码方式

获取代码方式1:
完整代码已上传我的资源: 【ACO TSP】基于matlab蚁群算法求解52城市旅行商问题(目标函数:最短距离)【含Matlab源码 4449期】
点击上面蓝色字体,直接付费下载,即可。

获取代码方式2:
付费专栏Matlab路径规划(初级版)

备注:
点击上面蓝色字体付费专栏Matlab路径规划(初级版),扫描上面二维码,付费29.9元订阅海神之光博客付费专栏Matlab路径规划(初级版),凭支付凭证,私信博主,可免费获得1份本博客上传CSDN资源代码(有效期为订阅日起,三天内有效);
点击CSDN资源下载链接:1份本博客上传CSDN资源代码

⛄二、蚁群算法求解52城市旅行商问题(目标函数:最短距离)

1 课题内容和要求
蚁群算法是一种智能优化算法,在TSP商旅问题上得到广泛使用。蚁群算法于1992年由Marco Dorigo首次提出,该算法来源于蚂蚁觅食行为。
在这里插入图片描述
由于蚂蚁没有视力,所以在寻找食物源时,会在其经过的路径上释放一种信息素,并能够感知其它蚂蚁释放的信息素。信息素浓度的大小表征路径的远近,信息素浓度越高,表示对应的路径距离越短。通常,蚂蚁会以较大的概率优先选择信息素浓度高的路径,并且释放一定的信息素,使该条路径上的信息素浓度增高,进而使蚂蚁能够找到一条由巢穴到食物源最近的路径。
在这里插入图片描述
但是,随着时间的推移,路径上的信息素浓度会逐渐衰减。用MATLAB完成多点间最短路径的仿真,并计算出最短距离。

在这里插入图片描述
2 需求分析
(1)数据准备
为了防止既有变量的干扰,首先将环境变量清空。然后将城市的位置坐标从数据文件(详见源程序里的excel文件)读入程序,并保存到变量为citys的矩阵中(第一列为城市的横坐标,第二列为城市的纵坐标)。
(2)计算城市距离矩阵
根据平面几何中两点间距离公式及城市坐标矩阵citys,可以很容易计算出任意两城市之间的距离。但需要注意的是,这样计算出的矩阵对角线上的元素为0,然而为保证启发函数的分母不为0,需将对角线上的元素修正为一个足够小的正数。从数据的数量级判断,修正为以下,我们认为就足够了。
(3)初始化参数
计算之前需要对参数进行初始化,同时为了加快程序的执行速度,对于程序中涉及的一些过程量,需要预分配其存储容量。
(4)迭代寻找最佳路径
该步为整个算法的核心。首先要根据蚂蚁的转移概率构建解空间,即逐个蚂蚁逐个城市访问,直至遍历所有城市。然后计算各个蚂蚁经过路径的长度,并在每次迭代后根据信息素更新公式实时更新各个城市连接路径上的信息素浓度。经过循环迭代,记录下最优的路径和长度。
(5)结果显示
计算结果用数字或图形的方式显示出来,以便于分析。同时,也可以根据需要把能够显示程序寻优过程的数据显示出来,以直观呈现出程序的寻优轨迹。

3 概要设计
蚁群算法的流程
用蚁群算法求解TSP问题的算法流程如图9-2所示,具体每步的含义如下:
①对相关参数进行初始化,包括蚁群规模、信息素因子、启发函数因子、信息素挥发因子言息素常数、最大迭代次数等,以及将数据读入程序,并对数据进行基本的处理,如将城市的标位置转为城市间的矩阵。
②随机将蚂蚁放于不同的出发点,对每个蚂蚁计算其下一个访问城市,直至所有蚂蚁问完所有城市。
③计算各个蚂蚁经过的路径长度Lk,记录当前迭代次数中的最优解,同时对各个城市接路径上的信息素浓度进行更新。
④判断是否达到最大迭代次数,如果是则返回步骤②,否则终止程序。
⑤输出程序结果,并根据需要输出程序寻优过程中的相关指标,如运行时间、收敛迭代次数等
在这里插入图片描述

4 详细设计
4.1 参数设定的准则
通过对以上蚁群算法原理和程序的学习,我们大致可以感受到蚁群算法的特点。特点之一是,蚁群在寻优的过程中,带有一定的随机性。这种随机性主要体现在初始城市(出发点)的选择上。蚁群算法正是通过这个初始点的选择将全局寻优慢慢转化为局部寻优。蚁群算法参数设定的关键是在“全局”与“局部”之间建立一个平衡点。既要使得蚁群算法的搜索空间尽可能大,以寻找可能存在的最优解的解区间;同时,又要充分利用蚂蚁群当前留下的有效信息,以较大的概率尽快收敛到近似的全局最优。
目前蚁群算法中的参数设定尚无严格的理论依据,难以用解析法确定最佳组合,但是可以通过实验来研究算法的寻优规律,从而确定相对合理的参数组合。其实,由于现实事物的复杂性,往往用严格的解析数学很难来描述真实的现实世界,这时我们不妨考虑用比较经典的实验法来研究算法的参数设定,因为在近代科学发展史上,有很多伟大的发现都是通过实验法得到的。
一般来讲,这类智能算法的参数设定遵照以下基本准则:
①尽可以在全局上搜索最优解,保证解的最优性;
②算法尽快收敛,以节省寻优时间;
③尽量反映客观存在的规律,以保证这种仿生算法的真实性。

4.2 信息素因子
同样可以采用以上的实验方法研究其他参数对算法指标的影响,从而确定各参数的合理取值。具体实验过程这里不再赘述,只将一些主要结论总结出来,时间充裕的读者可以根据以上的实验方法来研究其他参数的取值。
信息素因子α反映了蚂蚁在运动过程中所积累的信息量在指导蚁群搜索过程中的相对重要程度。其值过大,蚂蚁选择以前走过路径的可能性就越大,搜索的随机性减弱;其值过小,则等同于贪婪算法,易使蚁群的搜索过早陷入局部最优。实验研究发现,当α属于[1,4]时,综合求解性能较好。

4.3 启发函数因子
启发函数因子β反映了启发式信息在指导蚁群搜索过程中的相对重要程度。其大小反映了蚁群寻优过程中先验性、确定性因素的作用强度。β过大时,蚂蚁在某个局部点上选择局优的可能性大,虽然收敛速度加快,但搜索全优的随机性减弱,易于陷入局部最优过程。β过小,蚂蚁群体陷入纯粹的随机搜索,很难找到最优解。实验研究发现,当β属于[3,4.5]时,综合求解性能较好。

4.4 信息素挥发因子、
信息素挥发因子ρ描述了信息素的消失水平,而1-ρ则为信息素残留因子,描述信息素的保持水平。ρ的大小直接关系蚁群算法的全局搜索能力及收敛速度,1-ρ则反映蚂蚁之间个体相互影响的强弱。由于ρ的存在,当问题规模较大时,会使从未被搜索的路径的信息素量减小到接近0,降低全局搜索能力、且当ρ过大时,重复搜索的可能性大,影响随机性和全局搜索能力;当ρ过小时,会使收敛速度降低。实验研究发现,当ρ属于[0.2,0.5]时,综合求解性能较好。

4.5 信息素常数
常系数Q为信息素强度,表示蚂蚁循环一周时释放在路径上的信息素总量,其作用是为了充分利用有向图上的全局信息反馈量,使算法在正反馈机制作用下以合理的演化速度搜索到全局最优解。Q越大,蚂蚁在已遍历路径上的信息素累积越快,有助于快速收敛。
Q越大,信息素收敛速度越快。当Q过大时,虽然收敛速度较快,但易陷入局优,性能也不稳定。当Q过小时,影响算法收敛速度。实验研究发现,当Q属于[10,1000]时,综合性能较好。

4.6 最大迭代次数
最大迭代次数iter_max控制算法的迭代次数。其值过小,可能导致算法还没收敛,程序就已经结束了;值过大则会导致资源浪费。从上面的程序来看,ASA算法一般经过50~100次的迭代后收敛,为此,最大迭代次数可以取100~500。一般,建议先取200,执行程序后查看算法收敛轨迹,由此判断比较合理的最大迭代次数取值。

4.7 组合参数设计策略
由于ACA算法中涉及这些参数,而且这些参数对程序都有一定的影响,为此设计一组较合适的参数组合对程序来说非常重要。通常,可以按照以下策略进行参数的组合设定:
①确定蚂蚁数目,蚂蚁数目与城市规模之比约为1.5;

⛄三、部分源代码

clear all
clc

% 程序运行计时开始
t0 = clock;

%导入数据
citys=xlsread(‘Chap9_citys_data.xlsx’, ‘B2:C53’);

%% 计算城市间相互距离
n = size(citys,1);
D = zeros(n,n);
for i = 1:n
for j = 1:n
if i ~= j
D(i,j) = sqrt(sum((citys(i,:) - citys(j,:)).^2));
else
D(i,j) = 1e-4; %设定的对角矩阵修正值
end
end
end

%% 初始化参数
m = 75; % 蚂蚁数量
alpha = 1; % 信息素重要程度因子
beta = 5; % 启发函数重要程度因子
vol = 0.2; % 信息素挥发(volatilization)因子
Q = 10; % 常系数
Heu_F = 1./D; % 启发函数(heuristic function)
Tau = ones(n,n); % 信息素矩阵
Table = zeros(m,n); % 路径记录表
iter = 1; % 迭代次数初值
iter_max = 100; % 最大迭代次数
Route_best = zeros(iter_max,n); % 各代最佳路径
Length_best = zeros(iter_max,1); % 各代最佳路径的长度
Length_ave = zeros(iter_max,1); % 各代路径的平均长度
Limit_iter = 0; % 程序收敛时迭代次数

%% 迭代寻找最佳路径
while iter <= iter_max
% 随机产生各个蚂蚁的起点城市
start = zeros(m,1);
for i = 1:m
temp = randperm(n);
start(i) = temp(1);
end
Table(:,1) = start;
% 构建解空间
citys_index = 1:n;
% 逐个蚂蚁路径选择
for i = 1:m
% 逐个城市路径选择
for j = 2:n
tabu = Table(i,1:(j - 1)); % 已访问的城市集合(禁忌表)
allow_index = ~ismember(citys_index,tabu); % 参加说明1(程序底部)
allow = citys_index(allow_index); % 待访问的城市集合
P = allow;
% 计算城市间转移概率
for k = 1:length(allow)
P(k) = Tau(tabu(end),allow(k))^alpha * Heu_F(tabu(end),allow(k))^beta;
end
P = P/sum§;
% 轮盘赌法选择下一个访问城市
Pc = cumsum§; %参加说明2(程序底部)
target_index = find(Pc >= rand);
target = allow(target_index(1));
Table(i,j) = target;
end
end

⛄四、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⛄五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

  • 14
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Matlab领域

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

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

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

打赏作者

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

抵扣说明:

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

余额充值