优化算法慢慢学(二) 随机贪婪基本蚁群算法求解TSP问题 附带MATLAB代码

蚁群算法是一种模拟蚂蚁群体智能行为的仿生优化算法,具有较强的鲁棒性、优良的分布式计算机制、易于与其他方法相结合等优点。蚁群算法用来求解旅行商问题(Traveling Salesman Problem,TSP)表现出很大的优越性。但是没经过优化的蚁群算法也存在收敛速度慢,容易陷入局部最优解等缺点。
仿真发现基本蚁群算法求解TSP问题收敛振荡大、收敛迭代次数多及获得最优解困难。此处尝试将蚁群算法结合历史学习经验可显著改善收敛振荡,从而为可更好的解决TSP问题打下基础,同时也可体会算法的改进魅力。

1 TSP问题介绍

TSP问题(Traveling Salesman Problem,旅行商问题)解决如何找到一条从一个城市出发经过若干个城市后又返回原城市的最短路径。
TSP是一个经典的NP难题,此类问题用一般的算法是很难得到最优解,所以一般需要借助一些启发式算法求解,例如蚁群算法、遗传算法、微粒群算法等。其中蚁群算法因具有优良的分布式计算机制、易于与其他方法相结合等优点,用来求解TSP问题表现出很大的优越性。

2 蚁群算法应用于TSP问题

蚁群算法最早是由意大利学者Colorni A、Dorigo M.等于1991年提出。蚁群算法是灵感来源于自然界蚂蚁觅食行为的一种全局最优搜索方法。在自然界蚂蚁觅食过程中,蚁群总能够寻找到一条从蚁巢到食物源的最优路径。算法具有良好的搜索性能,不仅能找到全局最优解,并且寻找最优解的能力比一般算法要好,从而为求解复杂问题提供了一种新的可能。
在解决TSP问题中蚁群算法的基本思想如下:
(1)预先初始化各边信息素强度以及各蚂蚁的城市禁忌表。各蚂蚁按照一定的概率规则,在禁忌表的制约下选择下一个要到达的城市,直到最终形成一条合法路径。
(2)计算各蚂蚁所产生的路径长度.路径长度是合法路径中各边长度之和。
(3)更新各边的信息素。各边先进行信息素挥发操作,然后根据各蚂蚁产生的路径长度获取蚂蚁所释放的信息素。
(4)当所有蚂蚁均完成了信息素的更新操作之后,记录当前的最短路径,并且对禁忌表以及信息素的增加值进行初始化,并转到步骤(2)。
依此循环下去,直到满足算法停止条件为止,比如解无法得到进一步的改进或者达到了事先规定的循环次数。
蚁群算法主要涉及以下三个方面的内容: 
在这里插入图片描述在这里插入图片描述

3 随机贪婪蚁群算法求解TSP

使用一般的随机贪婪蚁群算法,采用TSPLIB的eil51测试数据,在51个城市规模时,算法出现收敛振荡问题,在100次迭代中找不到最优解。迭代误差如下图所示。在这里插入图片描述
计算得到的优化路径如下图所示,路径存在明显交叉。
在这里插入图片描述虽然蚁群算法具有良好的搜索性能,具有找到全局最优解的能力,但是基本蚁群存在算法收敛振荡大、收敛迭代次数多及获得最优解困难的问题。在迭代计算到第15次时,得到100次迭代中的最优解为463,与已知最优解426的误差为8.69%.而后算法就开始收敛震荡,并不能收敛到已知最优解。

4 初步优化

针对收敛振荡大问题,增加历史经验学习。在一次迭代中强制第一只蚂蚁所走城市为前一次迭代中路径的最优值,实现历史最好经验的学习,从而有效避免算法的振荡。
对引入历史经验改进后的算法采用TSPLIB的eil51测试数据,在51个城市规模时,改进后的算法收敛如下图所示。在这里插入图片描述
计算得到的优化路径如下图所示,路径存在明显交叉。
图4 优化路径
改进后的算法在迭代计算到第34次时,得到100次迭代中的最优解为460,与已知最优解426的误差为7.98%。
虽然改进后算法振荡明显改善,同时求得的最优解好一些,但是算法收敛迭代次数还是较多,甚至步基本蚁群算法还多。同时在迭代34次之后,算法就不再收敛,所得到的优化解误差依旧较大.算法需要进一步改进,才能有效地解决TSP问题。

附带Matlab源代码下载

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用DWA算法蚁群算法结合求解TSP问题MATLAB代码: ```matlab % DWA算法蚁群算法结合求解TSP问题 clc;clear;close all; %% 生成城市坐标 n = 50; % 城市数量 x = rand(1,n)*10; y = rand(1,n)*10; plot(x,y,'o'); hold on; %% DWA算法蚁群算法结合求解TSP问题 % 初始化参数 N = 1000; % 迭代次数 alpha = 0.95; % 降温系数 T0 = 100; % 初始温度 T = T0; % 当前温度 L = zeros(1,N); % 保存每次迭代的路径长度 bestL = inf; % 最佳路径长度 bestPath = []; % 最佳路径 path = randperm(n); % 初始路径 m = 50; % 蚂蚁数量 beta = 5; % 启发函数重要程度因子 rho = 0.1; % 信息素挥发因子 Q = 1; % 常系数 eta = 1./sqrt((repmat(x,n,1)-repmat(x',1,n)).^2 + (repmat(y,n,1)-repmat(y',1,n)).^2); % 启发函数 tau = ones(n,n); % 信息素矩阵 for i = 1:N % DWA算法 newPath = path; a = randi(n); b = randi(n); while a == b b = randi(n); end newPath([a b]) = newPath([b a]); newL = 0; for j = 1:n-1 newL = newL + sqrt((x(newPath(j+1))-x(newPath(j)))^2 + (y(newPath(j+1))-y(newPath(j)))^2); end newL = newL + sqrt((x(newPath(1))-x(newPath(n)))^2 + (y(newPath(1))-y(newPath(n)))^2); deltaL = newL - L(i); if deltaL < 0 || exp(-deltaL/T) > rand() path = newPath; L(i+1) = newL; if newL < bestL bestL = newL; bestPath = newPath; end else L(i+1) = L(i); end T = alpha*T; % 蚁群算法 path = zeros(m,n); for j = 1:m unvisited = 1:n; current = unvisited(randi(n)); unvisited(unvisited==current) = []; path(j,1) = current; for k = 2:n p = tau(current,unvisited).^beta .* eta(current,unvisited); p = p/sum(p); current = unvisited(find(rand()<cumsum(p),1)); unvisited(unvisited==current) = []; path(j,k) = current; end L(j) = 0; for k = 1:n-1 L(j) = L(j) + sqrt((x(path(j,k+1))-x(path(j,k)))^2 + (y(path(j,k+1))-y(path(j,k)))^2); end L(j) = L(j) + sqrt((x(path(j,1))-x(path(j,n)))^2 + (y(path(j,1))-y(path(j,n)))^2); if L(j) < bestL bestL = L(j); bestPath = path(j,:); end end deltaTau = zeros(n,n); for j = 1:m for k = 1:n-1 deltaTau(path(j,k),path(j,k+1)) = deltaTau(path(j,k),path(j,k+1)) + Q/L(j); end deltaTau(path(j,n),path(j,1)) = deltaTau(path(j,n),path(j,1)) + Q/L(j); end tau = (1-rho)*tau + deltaTau; % 绘制最佳路径 if mod(i,100) == 0 plot(x(bestPath),y(bestPath),'r-'); title(sprintf('DWA算法蚁群算法结合求解TSP问题,路径长度=%f',bestL)); drawnow; end end % 绘制最佳路径 plot(x(bestPath),y(bestPath),'g-'); title(sprintf('DWA算法蚁群算法结合求解TSP问题,路径长度=%f',bestL)); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

静水深流(探索者)

优化算法慢慢学习

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

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

打赏作者

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

抵扣说明:

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

余额充值