目录

  • 1.TS概述
    • 1.1 TS介绍
    • 1.2 TS流程
    • 1.3 TS流程特点
  • 2.基于TS求解TSP问题
    • 2.1 tsp.m
    • 2.2 CalDist.m
    • 2.3 drawTSP.m
    • 2.4 tabu_search.m
    • 2.5 结果

1.TS概述

1.1 TS介绍

∙\bullet∙ 概念:禁忌搜索算法(Tabu Serach,简称TS)是一种全局性邻域搜索算法,模拟人类具有记忆功能的寻优特性。它通过领域搜索机制和相应的禁忌准则来避免迂回搜索,并通过破禁水平来释放一些被禁忌的优良状态,从而保证多样化,实现全局最优。

∙\bullet∙ 基本思想:首先给定一个当前解(初始解)和一种邻域,然后在当前解的邻域中确定若干候选解;若最佳候选解对应的目标值优于全局最优解,则忽略其禁忌特性,用其替代当前解和全局最优解,并将相应的对象加入禁忌表,同时修改禁忌表中各对象的任期;若不存在上述候选解,则在候选解中选择非禁忌的最佳状态为新的当前解,而无视它与当前解的优劣性,同是将相应的对象加入禁忌表,并修改禁忌表中各对象的任期;重复上述搜索过程,直到满足停止条件为止。

1.2 TS流程

∙\bullet∙ 给定算法参数,随机产生初始解x,置禁忌表为空。

∙\bullet∙ 判断终止条件是否满足?若是,则结束算法并输出优化结果;否则,继续一下步骤。

∙\bullet∙ 利用当前解的邻域函数产生所有(若干)邻域解,并从其中确定若干候选解。

∙\bullet∙ 若最佳候选解优于全局最优解,将最优解和当前解全部置为最佳候选解,并将与最佳候选解对应的禁忌对象替换最早进入禁忌表的禁忌对象,然后转步骤 6 。反之,继续进行一下步骤。

∙\bullet∙ 判断候选解对应的各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最早进入禁忌表的禁忌对象元素。

∙\bullet∙ 转步骤 2

1.3 TS流程特点

∙\bullet∙ 在搜索过程中可以接受劣解,得到全局最优解的概率增大。

∙\bullet∙ 新解不是随机产生,选取优良解的概率大于其他解。

∙\bullet∙ 是一种局部搜索能力很强的全局迭代寻优算法。


2.基于TS求解TSP问题

2.1 tsp.m

生成城市坐标与距离矩阵。这里我们写好了10、30、48、50、75个城市个数的坐标,调用的时候直接计算距离就好了。

注意当城市个数多的话最好不要随机生成坐标,那样的话会使城市分布很均匀,很难进行优化。而且可能会产生重复的坐标点。

function [DLn,cityn]=tsp(n)
%输入参数n为城市个数,返回参数DLn为n×n的距离矩阵,cityn为n×2的城市坐标矩阵if n==10city10=[0.4 0.4439;0.2439 0.1463;0.1707 0.2293;0.2293 0.761;0.5171 0.9414;0.8732 0.6536;0.6878 0.5219;0.8488 0.3609;0.6683 0.2536;0.6195 0.2634];%10 cities d'=2.691for i=1:10for j=1:10DL10(i,j)=((city10(i,1)-city10(j,1))^2+(city10(i,2)-city10(j,2))^2)^0.5;endendDLn=DL10;cityn=city10;
endif n==30city30=[41 94;37 84;54 67;25 62;7 64;2 99;68 58;71 44;54 62;83 69;64 60;18 54;22 60;83 46;91 38;25 38;24 42;58 69;71 71;74 78;87 76;18 40;13 40;82 7;62 32;58 35;45 21;41 26;44 35;4 50];%30 cities d'=423.741 by D B Fogelfor i=1:30for j=1:30DL30(i,j)=((city30(i,1)-city30(j,1))^2+(city30(i,2)-city30(j,2))^2)^0.5;endendDLn=DL30;cityn=city30;
endif n==48city48=[6734 1453;2233 10;5530 1424;401 841;3082 1644;7608 4458;7573 3716;7265 1268;6898 1885;1112 2049;5468 2606;5989 2873;4706 2674;4612 2035;6347 2683;6107 669;7611 5184;7462 3590;7732 4723;5900 3561;4483 3369;6101 1110;5199 2182;1633 2809;4307 2322;675 6;7555 4819;7541 3981;3177 756;7352 4506;7545 2801;3245 3305;6426 3173;4608 1198;23 2216;7248 3779;7762 4595;7392 2244;3484 2829;6271 2135;4985 140;1916 1569;7280 4899;7509 3239;10 2676;6807 2993;5185 3258;3023 1942;];%48cities d'=  by att48for i=1:48for j=1:48DL48(i,j)=((city48(i,1)-city48(j,1))^2+(city48(i,2)-city48(j,2))^2)^0.5;endendDLn=DL48;cityn=city48;
endif n==50city50=[31 32;32 39;40 30;37 69;27 68;37 52;38 46;31 62;30 48;21 47;25 55;16 57;17 63;42 41;17 33;25 32;5 64;8 52;12 42;7 38;5 25; 10 77;45 35;42 57;32 22;27 23;56 37;52 41;49 49;58 48;57 58;39 10;46 10;59 15;51 21;48 28;52 33;58 27;61 33;62 63;20 26;5 6;13 13;21 10;30 15;36 16;62 42;63 69;52 64;43 67];%50 cities d'=427.855 by D B Fogelfor i=1:50for j=1:50DL50(i,j)=((city50(i,1)-city50(j,1))^2+(city50(i,2)-city50(j,2))^2)^0.5;endendDLn=DL50;cityn=city50;
endif n==75city75=[48 21;52 26;55 50;50 50;41 46;51 42;55 45;38 33;33 34;45 35;40 37;50 30;55 34;54 38;26 13;15 5;21 48;29 39;33 44;15 19;16 19;12 17;50 40;22 53;21 36;20 30;26 29;40 20;36 26;62 48;67 41;62 35;65 27;62 24;55 20;35 51;30 50;45 42;21 45;36 6;6 25;11 28;26 59;30 60;22 22;27 24;30 20;35 16;54 10;50 15;44 13;35 60;40 60;40 66;31 76;47 66;50 70;57 72;55 65;2 38;7 43;9 56;15 56;10 70;17 64;55 57;62 57;70 64;64 4;59 5;50 4;60 15;66 14;66 8;43 26];%75 cities d'=549.18 by D B Fogelfor i=1:75for j=1:75DL75(i,j)=((city75(i,1)-city75(j,1))^2+(city75(i,2)-city75(j,2))^2)^0.5;endendDLn=DL75;cityn=city75;
end

2.2 CalDist.m

计算该种排序情况下的距离总长度

function F=CalDist(dislist,s)
%计算总长度,dislist为距离矩阵,s为城市排序序列,F为距离总长度DistanV=0;
n=size(s,2);
for i=1:(n-1)DistanV=DistanV+dislist(s(i),s(i+1));
end
DistanV=DistanV+dislist(s(n),s(1));
F=DistanV;

2.3 drawTSP.m

绘制行走路线

function m=drawTSP(Clist,BSF,bsf,p,f)
%Clist为n个城市坐标,BSF为n个城市序列,bsf为总距离,p用来记录第几步搜索
CityNum=size(Clist,1);
for i=1:CityNum-1plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');hold on;
end
plot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNum),2),Clist(BSF(1),2)],'ms-','LineWidth',2,'MarkerEdgeColor','k','MarkerFaceColor','g');
title([num2str(CityNum),'城市TSP']);
if f==0text(5,5,['第 ',int2str(p),' 步','  最短距离为 ',num2str(bsf)]);
elsetext(5,5,['最终搜索结果:最短距离 ',num2str(bsf)]);
end
hold off;
pause(0.05);

2.4 tabu_search.m

clear;CityNum=30;
[dislist,Clist]=tsp(CityNum);%dislist为城市距离矩阵,Clist为各个城市坐标矩阵。Tlist=zeros(CityNum);%禁忌表(tabu list)
cl=100;%保留前cl个最好候选解
bsf=Inf;  %记录距离
tl=50; %禁忌长度(tabu length)
L1=200;%候选解(candidate),不大于n*(n-1)/2(全部领域解个数)
S0=randperm(CityNum);  %打乱顺序随机排序
S=S0;
BSF=S0;
Si=zeros(L1,CityNum); %Si记录l1个候选解的城市顺序
StopL=2000; %终止步数
p=1;  %记录迭代次数
clf;
%绘制第一个图,动态展示了选择搜索过程
figure(1);while (p<StopL+1)%候选解过多if L1>CityNum*(CityNum)/2disp('候选解个数,不大于n*(n-1)/2(全部领域解个数)! 系统自动退出!');L1=(CityNum*(CityNum)/2)^.5;break;endArrS(p)=CalDist(dislist,S);    %ArrS矩阵记录每次迭代的距离长度 i=1;A=zeros(L1,2);while i<=L1 %随机生成选取两个城市的序号,分别存放在M(1)和M(2)中M=CityNum*rand(1,2);  M=ceil(M);if M(1)~=M(2)m1=max(M(1),M(2));m2=min(M(1),M(2));A(i,1)=m1;A(i,2)=m2;if i==1isdel=0;elsefor j=1:i-1if A(i,1)==A(j,1)&&A(i,2)==A(j,2)  %判断该解是否存在,isdel=1表示存在isdel=1;break;elseisdel=0;endendendif ~isdel   %如果不存在就放入i=i+1;elsei=i;endelse i=i;endendfor i=1:L1Si(i,:)=S;Si(i,[A(i,1),A(i,2)])=S([A(i,2),A(i,1)]);%CCL矩阵每一行分别存放次数、距离、两个点,CCL表示所有候选解CCL(i,1)=i;CCL(i,2)=CalDist(dislist,Si(i,:));CCL(i,3)=S(A(i,1));CCL(i,4)=S(A(i,2));   end[fs fin]=sort(CCL(:,2));for i=1:cl%选取cl个候选解CL(i,:)=CCL(fin(i),:);endif CL(1,2)<bsf  %藐视准则(aspiration criterion),更新全局最优解、当前解为最佳候选解bsf=CL(1,2);S=Si(CL(1,1),:);        BSF=S;for m=1:CityNumfor n=1:CityNumif Tlist(m,n)~=0Tlist(m,n)=Tlist(m,n)-1;endendendTlist(CL(1,3),CL(1,4))=tl;else  %只更新当前解为最佳候选解for i=1:clif Tlist(CL(i,3),CL(i,4))==0S=Si(CL(i,1),:);for m=1:CityNumfor n=1:CityNumif Tlist(m,n)~=0Tlist(m,n)=Tlist(m,n)-1;endendendTlist(CL(i,3),CL(i,4))=tl;break;endendendArrbsf(p)=bsf;drawTSP(Clist,BSF,bsf,p,0);p=p+1;
end
BestShortcut=BSF  %最优路线
theMinDistance=bsf  %最短路径%第二个图
figure(2);
plot(Arrbsf,'r'); hold on;
plot(ArrS,'b');grid;
title('搜索过程');
legend('最优解','当前解');

2.5 结果

【MATLAB】禁忌算法(TS)求解TSP问题相关推荐

  1. 禁忌搜索算法TS求解TSP问题

    目录 一.局部邻域搜索 二.禁忌搜索 三.禁忌搜索算法流程 四.算法求解例题 一.局部邻域搜索 局部邻域搜索是基于贪婪准则持续地在当前的邻域中进行搜索,虽然算法通用,易于实现,且容易理解,但其搜索性能 ...

  2. 【多目标优化求解】基于matlab粘菌算法MOSMA求解多目标优化问题【含Matlab源码 2279期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[多目标优化求解]基于matlab粘菌算法MOSMA求解多目标优化问题[含Matlab源码 2279期] 点击上面蓝色字体,直接付费下载, ...

  3. 【多目标优化求解】基于matlab飞蛾扑火算法 (NSMFO)求解多目标优化问题 【含Matlab源码 2312期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[多目标优化求解]基于matlab飞蛾扑火算法 (NSMFO)求解多目标优化问题 [含Matlab源码 2312期] 点击上面蓝色字体,直 ...

  4. 基于教学优化算法(TLBO)求解TSP问题 (Matlab代码实现)

     

  5. 蚁群算法ACO求解TSP问题

    目录 一.蚁群算法特点 二.基本蚁群算法及其流程 三.改进蚁群算法 1.精英蚂蚁系统 2.最大最小蚂蚁系统 3.基于排序的蚁群算法 4.自适应蚁群算法 四.例题 一.蚁群算法特点 (1)自组织算法 组 ...

  6. 遗传-粒子群算法遗传-禁忌搜索算法求解TSP问题

    1. 前言 上一篇博文[五种常见启发式算法求解TSP问题-总结篇]中,总结了五种常见启发式算法在求解TSP问题上的效果,其中遗传算法的求解质量最差,而粒子群算法和禁忌搜索算法的求解效果最佳,因此本文计 ...

  7. 禁忌搜索算法求解TSP旅行商问题C++(2020.11.19)

    TS算法求解TSP问题C++ 1.禁忌搜索算法 1.1 基本思想及主要特点 1.2 基本概念 1.3 算法流程 2. TS求解TSP问题的C++实现 2.1 输入数据文件:bayg29.tsp 2.2 ...

  8. 人工蜂群算法求解TSP问题

    人工蜂群算法求解TSP问题 [标签] ABC TSP Matlab data:2018-10-19 author:怡宝2号 [总起]利用人工蜂群算法(Artificial Bee Colony Alg ...

  9. 五种常见启发式算法求解TSP问题-总结篇

    1. 前言 本文将总结先前设计的五个启发式算法的求解效果,算法文章如下表: 智能优化算法类别 启发式算法求解TSP问题系列博文 进化算法 遗传算法求解TSP问题 仿人智能优化算法 禁忌搜索算法求解TS ...

最新文章

  1. 对列表去重并保持原来的顺序
  2. 【Android笔记】Activity的四种启动模式
  3. 《Groovy官方指南》目录
  4. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置
  5. Android开发三:常用控件1--TextView、EditText、Button
  6. 现在的python版本_现在python 流行哪个版本
  7. hdu 4530(数学)
  8. 大数据技术 思维导图
  9. linux 协议错误,在linux客户机上:协议错误,Vagrant无法挂载同步的文件夹_vagrant_开发99编程知识库...
  10. vmware linux ens32,修改Centos7的网卡ens32 改为eth0
  11. 站覆盖范围_武汉高铁站落地灯箱广告有什么投放价值?
  12. MATLAB中的Hough变换
  13. Java - 解释一下网络应用的模式及其特点。
  14. JavaScript系列-闭包
  15. Inferring Motion Direction using Commodity Wi-Fi for Interactive Exergames (WiDrancd)论文翻译
  16. Silverstack Lab for Mac(媒体资源数据管理工具)激活版
  17. java课程 数独 文库_通俗易懂的数独算法(java版)
  18. Ubuntu鼠标延迟,闪烁,消失
  19. 计算机脚本语言是什么?
  20. 毕设记录1||不要守株待兔

热门文章

  1. C3P0的三种配置方式以及基本配置项详解
  2. 如何在Linux(Ubuntu 14.04 LTS)上安装搜狗拼音输入法
  3. 论文之Unrolled Optimization with Deep Priors 深先验展开优化
  4. WTL_Freecell-Release05-v1.3-20190129 (WTL空当接龙v1.3)
  5. dialogue怎么读_dialogue是什么意思_dialogue怎么读_dialogue翻译_用法_发音_词组_同反义词_对话-新东方在线英语词典...
  6. 河南太康一高高考成绩查询2021,河南周口2020高考喜报,太康一高一本上线增幅巨大,值得重点关注...
  7. MicroStation:MDL常用API(持续更新)
  8. linux设备驱动归纳总结(八):4.总线热插拔
  9. 磁盘碎片整理软件评测
  10. 2017 微信公开课PRO版 解读