禁忌搜索算法(tabu search)解决TSP及其Matlab代码
1、算法简介
禁忌搜索算法TS(Tabu search),顾名思义核心在于“禁忌”,简单来说就是在某一个过程中把一些不太好的操作给禁止了,直到搜索到一个“最优秀”的。它是在1986年由美国Fred Glover教授提出的,主要是为了提高寻优过程中的全面搜索的能力。
禁忌搜索算法通过模拟人类智能的记忆特点,引入存储结构和相应的禁忌准则来避免迂回循环,通过特赦准则来释放禁忌表中较优的个体,进而保证多样性的搜索来尽可能达到问题的最优解。
2、算法核心概念
禁忌表(TabuList):是用来存放禁忌对象的表。它是TS算法的核心,禁忌表的值在每一次迭代过程中都会完成一次更新。禁忌对象可以是TSP中的路径长度、城市顺序等等。
禁忌长度(TabuLength):禁忌表中存放的数值即为禁忌长度,它规定了禁忌对象的生存时间,一旦达到其禁忌长度,则会被解除禁忌状态。禁忌长度的选取有静态和动态选取两种方法,静态选取会事先固定禁忌长度,而动态选取则会根据迭代过程而发生变化。
特赦准则:是在搜索过程中,发现有解比当前最优解更优时执行替换最优解的操作,或者在搜索过程中全部候选解都在“禁忌”状态,能够释放特定解的操作。
领域解:在初始解的基础上,按照一定的方向对初始解进行移动所形成的新解,称为领域解。不重复的移动次数称为领域的规模。
候选解:候选解就是领域解中较为优秀的一部分解。若候选解所选的规模较小,算法则会过早收敛,造成局部最优解的情况,若候选解所选规模较大,算法则会浪费较多的时间和空间来搜索最优解。
3、算法流程
禁忌搜索算法的一般流程如下:
(1)初始化TS算法的参数,按照准则生成问题的初始解,生成0禁忌表;
(2)判断是否满足终止条件,若是,则结束算法,输出结果
(3)根据算法的特性生成领域解,并从中选择合适规模大小的候选解;
(4)判断候选解中的最优解Next是否满足特赦准则,若满足特赦准则,则用Next替代当前最优解Before,并更新禁忌表,令Next对应的禁忌对象的禁忌长度为最长,即禁忌时间最长;若不满足特赦准则,进行(4)步骤;
(5)判断候选解中禁忌状态情况,找出候选解中处于“非禁忌”状态的禁忌对象,并把该禁忌对象对应的解赋给当前最优解,同时设置该禁忌对象的禁忌时间为最长;
(6)转(2);
4、实例及Matlab代码
接下来,利用Tabu Search算法来解决TSP问题。假设有48个随机分布的城市如下图所示,一个旅行商从一个城市出发,遍历完所有城市,要求其旅行距离最短。在这一过程中,禁忌对象为互换城市对,就是在解中把两个城市的位置调换。
function TspTBout = TSPTabusearch(xy,dmat,TabuLength,IterNum,showProg,showResult)
%运用禁忌搜索算法解决TSP问题
nargs = 6;
%检查函数输入
for i = nargin:nargs-1 %nargin代表函数已输入参数个数switch i case 0 %产生城市坐标xy =[488,814;1393,595;2735,2492;4788,4799;4825,1702;789,2927;4853,1120;4786,3757;2427,1276;4002,2530;710,3496;2109,4455;4579,4797;3962,2737;4798,694;3279,747;179,1288;4246,4204;4670,1272;3394,4072;3789,1218;3716,4647;1962,1750;3278,983;856,1256;3531,3081;160,2367;1385,1759;231,4155;486,2927;4118,2749;3475,4586;1586,1430;4752,3787;173,3769;2194,1903;1908,2840;3828,380;3976,270;935,2654;2449,3896;2228,4671;3232,650;3547,2845;3774,2347;1381,60;3399,1686;3276,811];case 1%计算距离矩阵N = size(xy,1);a =meshgrid(1:N);%生成N*N升序矩阵dmat = reshape(sqrt(sum((xy(a,:)-xy(a',:)).^2,2)),N,N);% '为矩阵的转置,reshape把数据生成N*N的矩阵case 2%设置禁忌长度(禁忌时间)TabuLength = round((N*(N-1)/2)^0.5);%round四舍五入case 3%设置迭代次数IterNum = 1e3;case 4%是否展示迭代过程showProg = 1;case 5%是否展示最终结果showResult = 1;otherwiseend
end
%对输入参数进行检查
[N,~] = size(xy);%城市个数、维数
[nr,nc] = size(dmat);%距离矩阵的行数和列数
if N~=nr || N~=ncerror('城市坐标或距离矩阵输入有误')
end
showProg = logical(showProg(1));%将数值转变为逻辑值
showResult = logical(showResult(1));
%画出城市位置分布图
figure(1);
plot (xy(:,1),xy(:,2),'k.');
title('城市坐标位置');%% 禁忌搜索算法参数设置
TabuList = zeros(N);%禁忌表设置为城市互换对,为N*N的矩阵,矩阵中的值代表禁忌长度,初始禁忌长度为0
CandidatesNum = 200; %领域解的个数,由领域解选出候选解
Candidates = zeros(CandidatesNum,N);%领域解集合
S0 = randperm(N);%随机产生一个初始解
Broute = S0;%当前最佳的路劲
Bdist = Inf;%当前最佳路径总距离
BLHistory = zeros(IterNum,1);%记录最优路径长度%% 禁忌搜索循坏
for iter = 1:IterNum%% 以下生成城市互换对矩阵Twocity[200,2]Twocity = zeros(CandidatesNum,2);i = 1;while i<= CandidatesNumM = ceil(N*rand(1,2));%随机生成两个城市序号if M(1) ~= M(2)Twocity(i,1) = max(M(1),M(2));%最小值存在1,最大值存在2Twocity(i,2) = min(M(1),M(2));if i ==1isa = 0;%是否生成相同的城市互换对,1为生成了elsefor j = 1:i-1if Twocity(i,1)==Twocity(j,1)&&Twocity(i,2)==Twocity(j,2)%若相同isa =1;break;elseisa =0;endendendif ~isa %若生成的城市对与之前的都不相同则可以继续生成城市对i =i+1;endendend%% 产生领域解,选取前100个为候选解 %保留前100个最好领域解为候选解BestCandNum = 100;%定义一个表格,四列,分别存储领域解序号i,路径长度L(i),Twocity(i,1),Twocity(i,2)BCandidate = Inf * ones(BestCandNum,4);L = zeros(1,CandidatesNum);%相当于产生一个S0的解,包含有200个领域解,从中找出最佳的100个才是候选解for i = 1:CandidatesNumCandidates(i,:) = S0;%领域解Candidates(i,[Twocity(i,2),Twocity(i,1)]) = S0([Twocity(i,1),Twocity(i,2)]);%在当前解S0上交换两个城市的位置%计算当前领域解路径的距离L(i) = CalDistofS(dmat,Candidates(i,:));%选出100个最好的领域解充当候选解if i<= BestCandNumBCandidate(i,1) = i;BCandidate(i,2) = L(i);BCandidate(i,3) = S0(Twocity(i,1));BCandidate(i,4) = S0(Twocity(i,2));elsefor j =1:BestCandNumif L(i) < BCandidate(j,2)%领域解超出100个,则需要比较选取较小距离的BCandidate(j,1) = i;BCandidate(j,2) = L(i);BCandidate(j,3) = S0(Twocity(i,1));BCandidate(j,4) = S0(Twocity(i,2));break;endendendend%根据距离,对候选解进行排序[~,Index] = sort(BCandidate(:,2));%Index是BCandidate中距离升序排列后的索引SBest = BCandidate(Index,:);BCandidate = SBest;% 此时的BCandidate是按第二列路径长度升序排列的%% 特赦准则是否满足,更新禁忌表if BCandidate(1,2)< Bdist%如果小于当前最优Bdist = BCandidate(1,2);%当前最优解变为候选解中的第BCandidate(1,1)行S0 = Candidates(BCandidate(1,1),:);Broute = S0;for m = 1:Nfor n = 1:Nif TabuList(m,n) ~=0TabuList(m,n) = TabuList(m,n) -1;%更新禁忌表,禁忌长度减1endendendTabuList(BCandidate(1,3),BCandidate(1,4)) = TabuLength;%更新禁忌表else %若没有找到比当前最优解更好的解for i = 1:BestCandNumif TabuList(BCandidate(i,3),BCandidate(i,4)) == 0%如果已经解禁了S0 = Candidates(BCandidate(i,1),:);for m = 1:Nfor n = 1:Nif TabuList(m,n) ~=0TabuList(m,n) = TabuList(m,n) -1;%更新禁忌表,禁忌长度减1endendendTabuList(BCandidate(i,3),BCandidate(i,4)) = TabuLength;%更新禁忌表break;endendend%更新当前最好解的距离值BLHistory(iter,1) = Bdist;if showProgfigure(2);for i = 1:(N-1)plot([xy(Broute(i),1),xy(Broute(i+1),1)],[xy(Broute(i),2),xy(Broute(i+1),2)],'bo-');%画出路线图hold on;endplot([xy(Broute(N),1),xy(Broute(1),1)],[xy(Broute(N),2),xy(Broute(1),2)],'ro-');%画出终点到起点的线title(['迭代次数:', num2str(iter),'最短距离:',num2str(Bdist)]);hold off;end
end
if showResultBestroute = Broute;MinLength = Bdist;figure(3);plot(BLHistory,'b');%画出最优路径长度与迭代次数的关系xlabel('迭代次数');ylabel('当前最优路径长度');title('最优路径长度变化曲线图');grid;hold on;
end
if nargout%如果需要输出结果TspTBout{1} = Bestroute;TspTBout{2} = MinLength;
endfunction L = CalDistofS(dmat,S)dist = 0;n = size(S,2);for k = 1:(n-1)dist = dist +dmat(S(k),S(k+1));%中间路径的距离endL = dist + dmat(S(n),S(1));%回到起点的距离
endend
由于代码有较多的注释,就不在解释太多了,直接上结果图吧!
若有小伙伴对机器人任务分配算法较为兴趣的,可以在下面评论交流一波,纯属互相学习!
禁忌搜索算法(tabu search)解决TSP及其Matlab代码相关推荐
- 元启发式算法 | 禁忌搜索(Tabu Search)解决TSP问题(Python)
[元启发式算法]禁忌搜索(Tabu Search)解决TSP问题(Python) 文章目录 [元启发式算法]禁忌搜索(Tabu Search)解决TSP问题(Python) 1.Tabu Search ...
- 局部搜索:禁忌搜索(Tabu Search)解决TSP问题的python案例
禁忌搜索解决TSP问题的python案例 Tabu Search 禁忌(Tabu Search)算法是一种亚启发式(meta-heuristic)随机搜索算法,它从一个初始可行解出发,选择一系列的特定 ...
- 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
01 什么是禁忌搜索算法? 1.1 先从爬山算法说起 爬山算法从当前的节点开始,和周围的邻居节点的值进行比较. 如果当前节点是最大的,那么返回当前节点,作为最大值 (既山峰最高点):反之就用最高的邻居 ...
- 禁忌搜索算法例题 c语言,禁忌搜索算法(Tabu Search)
由7层不同的绝缘材料构成的一种绝缘体,应如何排列顺序,可获得最好的绝缘性能. 编码方式:顺序编码 初始编码:2-5-7-3-4-6-1 目标值:极大化目标值. 邻域移动:两两交换 TabuSize:3 ...
- 禁忌搜索(Tabu Search)算法及python实现
禁忌搜索(Tabu Search)算法及python实现 版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/adkjb,未经博主允许不得转载. 禁忌搜索(Tabu S ...
- 【优化求解】基于matlab禁忌搜索算法求解函数极值问题【含Matlab源码 1204期】
⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源: [优化求解]基于matlab禁忌搜索算法求解函数极值问题[含Matlab源码 1204期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...
- 禁忌搜索(Tabu Search)原理梳理和应用细节-附求解VRPTW问题C++代码
文章目录 1.禁忌搜索(TS)的相关概念 1.1 搜索空间(search space) 1.2 邻域结构(neighborhood structure) 1.3 禁忌表(tabu) 1.4 解禁标准( ...
- 【TSP问题】基于改进蜜蜂算法解决旅行商问题(Matlab代码实现)
目录 1 蜜蜂优化算法 1.1 蜜蜂觅食机制 1.2 蜜蜂算法 1.3 流程 2 TSP问题 3 运行结果 4 Matlab代码实现及详细文章 5 结论 6 写在最后 1 蜜蜂优化算法 蜜蜂算法 ...
- 回溯法解决tsp问题 matlab,回溯法求解tsp问题
回溯法以这种工作方式递归地在解空间中搜索, 直至找到所 要求的解或解 空间中已无活结点时为止. 回溯法求解 TSP 问题,首先把所有的顶点的访问标志初始化为 0,...... 回溯法求解 TSP 问题 ...
最新文章
- 为什么掌握 Linux 对程序员这么重要
- 做好准备迎接崭新的BCH了吗?
- Zookeeper已经设置了myid文件但是依然报错myid file is missing
- 使用七牛图片遇到的图片方向翻转问题
- 【kafka】kafka DefaultRecordBatch. The older message format classes only support conversion from class
- mysql rpm server_记录一次最新版MySQL-server-5.6.20-1.el6.x86_64.rpm的安装
- 一个实用的JS自定义函数addLoadEvent()
- 【软考】面向对象程序设计复习指南
- 第三篇 层次类非线性表的编程实验 第9章 应用二叉树的基本概念编程
- 51单片机原理知识点,复位时钟和时序(二)
- js基础知识汇总13
- Kubernetes部署软件应用的步骤思路
- 如何使用stripe_使用Stripe和Laravel出售下载内容
- [Ansible系列⑦]ansible fact变量
- 手机兼容性测试——机型选择(从系统、屏幕、型号考虑)
- iOS的电量测试(Sysdiagnose)
- Dolby fMP4视频seek后卡顿问题分析
- 茗香茶艺网/茶叶宣传网站
- 数据分析模型:漏斗分析
- 扑克牌移动 下面代码模拟了一套扑克牌(初始排序A~K,共13张)的操作过程。
热门文章
- webgl与opengl的区别和联系
- daysmatter安卓版_倒数日days matter下载-倒数日days 安卓版v1.0.2-PC6安卓网
- 逆变器simulink模型——处理器在环测试(PIL)
- 在Ubuntu\Centos等Linux环境安装支付宝控件
- 电荷密度波的嵌套理论和电声子耦合理论
- c语言消除scanf危险警告,关于vs2013做c语言scanf出现警告的问题
- HUAWEI 机试题:消除相邻且相同
- iOS 获取网络状态(包含iphone X /XR/Xs)
- ice文件转java文件
- jav基础回顾-内存结构