在网上看到了一位别人写的禁忌搜索的代码,看了半天才理解,为了让大家更好地理解,我在别人代码的基础上添加了详细的注释,代码我按照算法流程图注释的,配合流程图看会更容易理解。大家可以把代码复制到matlab里看,有详细的分块,看起来会清楚一些

这里是原文:禁忌搜索算法(Tabu Search)

%% 一个旅行商人要拜访全国31个省会城市,且每个城市只能拜访一次,求所有路径之中的最小值
% 禁忌搜索算法求解TSP问题
function [BestShortcut,theMinDistance]=TabuSearch
clear;
clc;
% 全国31个省会城市坐标
Clist=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;...4196 1044;4312  790;4386  570;3007 1970;2562 1756;2788 1491;2381 1676;...1332  695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;...4263 2931;3429 1908;3507 2376;3394 2643;3439 3201;2935 3240;3140 3550;...2545 2357;2778 2826;2370 2975];%% 计算距离矩阵
CityNum=size(Clist,1); % TSP问题的规模,即城市数目
dislist=zeros(CityNum);
for i=1:CityNumfor j=1:CityNumdislist(i,j)=((Clist(i,1)-Clist(j,1))^2+(Clist(i,2)-Clist(j,2))^2)^0.5;end
end
%% 定义属性
TabuList=zeros(CityNum);                      % 禁忌表设置为所有城市互换对,初始禁忌长度都为0,即禁忌表为空
TabuLength=round((CityNum*(CityNum-1)/2)^0.5);% 禁忌表长度(tabu length),设置为二领域个数的开方,round四舍五入
CandidatesNum=200;                            % 领域集的个数 (全部二领域解个数太多,我们随机选取200个),由这些领域解中选出候选解
Candidates=zeros(CandidatesNum,CityNum);      % 选取的领域解集合,每一行代表一个领域解,由这些领域解中选出候选解
S0=randperm(CityNum);                         % 随机产生初始解,返回一行1到CityNum的整数数组
BSF=S0;                                       % 当前最佳路径
BestL=Inf;                                    % 当前最佳解距离,inf为极大值
p=1;                                          % 记录迭代次数
StopL=1000;                                   % 最大迭代次数
%% 用户控制界面
figure(1);
stop = uicontrol('style','toggle','string'...,'stop','background','white');
tic;                                          % 用来保存当前时间
%% 禁忌搜索循环
while p<StopLif CandidatesNum>CityNum*(CityNum-1)/2disp('领域解个数不大于n*(n-1)/2!');break;endALong(p)=DistanceOfS(dislist,S0);       % 当前解适配值,也就是当前路径的长度%% 以下while循环生成随机的[200,2]的矩阵A,每一个元素都是在1-31之间的% 用于后面为当前解生成邻域解i=1;A=zeros(CandidatesNum,2);       % 解中交换的城市矩阵while i<=CandidatesNumM=CityNum*rand(1,2); M=ceil(M);                  % 返回一行两列数值为 1-CityNum 之间的数组%【1-----------------------------if M(1)~=M(2)A(i,1)=max(M(1),M(2));A(i,2)=min(M(1),M(2));%【2-------------------------if i==1isa=0;else%【3---------------------% 判断是否生成相同的交换城市组,如果是,重新生成for j=1:i-1if A(i,1)==A(j,1) && A(i,2)==A(j,2)isa=1;break;elseisa=0;endend%3】---------------------end%2】-------------------------%【4---------if ~isai=i+1;end%4】---------end%1】-----------------------------end%% 产生领域解,选取前100个为确定候选解% 保留前BestCandidateNum个最好领域解作为候选解BestCandidateNum=100;% 四列,分别存数i、路径长度、交换城市A(i,1)、交换城市A(i,2)BestCandidate=Inf*ones(BestCandidateNum,4); F=zeros(1,CandidatesNum);% 这相当于是产生一个S0的邻域...包含CandidatesNum个领域解,最后选出的BestCandidate才是候选解for i=1:CandidatesNumCandidates(i,:)=S0;  % 领域解集合Candidates(i,[A(i,2),A(i,1)])=S0([A(i,1),A(i,2)]);% 计算当前解适配值,也就是当前路径的长度F(i)=DistanceOfS(dislist,Candidates(i,:));%----------------------------------% 选出100个最好的领域解if i<=BestCandidateNumBestCandidate(i,2)=F(i);BestCandidate(i,1)=i;BestCandidate(i,3)=S0(A(i,1));BestCandidate(i,4)=S0(A(i,2));elsefor j=1:BestCandidateNumif F(i)<BestCandidate(j,2)BestCandidate(j,2)=F(i);BestCandidate(j,1)=i;BestCandidate(j,3)=S0(A(i,1));BestCandidate(j,4)=S0(A(i,2));break;endendend%----------------------------------end% 对BestCandidate排序[JL,Index]=sort(BestCandidate(:,2)); % JL是排序后的向量(用不到),index是JL中每一项对应于BestCandidate(:,2)中项的索引,排序是按升序进行的。SBest=BestCandidate(Index,:);BestCandidate=SBest;                 % 此时的BestCandidate是按第二列路径长度升序排列的%% 特赦准则是否满足,更新禁忌表% 此时BestCandidate(1,1)存储的i下标代表Candidates中最短路径对应的行下标%% Yif BestCandidate(1,2)<BestLBestL=BestCandidate(1,2);% 当前解(路经集合)变成候选集合的第BestCandidate(1,1)行,这一行最小S0=Candidates(BestCandidate(1,1),:);BSF=S0;  for m=1:CityNumfor n=1:CityNumif TabuList(m,n)~=0TabuList(m,n)=TabuList(m,n)-1;                         % 更新禁忌表,禁忌长度减1endendendTabuList(BestCandidate(1,3),BestCandidate(1,4))=TabuLength;        % 更新禁忌表,设置当前解的禁忌长度%% N% 此时没有候选解比当前解更优else for i=1:BestCandidateNumif  TabuList(BestCandidate(i,3),BestCandidate(i,4))==0         % 如果已经解禁S0=Candidates(BestCandidate(i,1),:);for m=1:CityNumfor n=1:CityNumif TabuList(m,n)~=0TabuList(m,n)=TabuList(m,n)-1;                 % 更新禁忌表,禁忌长度减1endendendTabuList(BestCandidate(i,3),BestCandidate(i,4))=TabuLength;% 更新禁忌表,设置当前解的禁忌长度break;                                                     % 找到第一个非禁忌的最好的候选解作为当前解,退出for循环endendend% 更新当前最好的解适配值,也就是当前最短路径的长度% BestCandidate(1,2)<BestL时更新,否则不更新,放在这里是为了方便后面画适应度曲线用ArrBestL(p)=BestL;%% 每次迭代都画出最好的路径for i=1:CityNum-1plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'bo-');    % 画出两点的连线hold on;endplot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNum),2),Clist(BSF(1),2)],'ro-');% 画出最后一点与出发点的连线(红色)title(['迭代次数:',int2str(p),' 优化最短距离:',num2str(BestL)]);hold off;pause(0.005);if get(stop,'value')==1break;end% 存储中间结果为图片if (p==1||p==5||p==10||p==20||p==60||p==150||p==400||p==800||p==1500||p==2000)filename=num2str(p);fileformat='jpg';saveas(gcf,filename,fileformat);endp=p+1;                                                                 % 迭代次数加1
end
%%
toc;                                         % 用来保存完成时间
BestShortcut=BSF;                            % 最佳路线
theMinDistance=BestL;                        % 最佳路线长度
set(stop,'style','pushbutton','string','close', 'callback','close(gcf)');
%% 画适应度进化曲线
figure(2);
plot(ArrBestL,'b');
xlabel('迭代次数');
ylabel('目标函数值');
title('适应度进化曲线');
grid;
hold on;
%% 运行时间
% figure(3)
% plot(toc-tic,'b');
% grid;
% title('运行时间');
% legend('Best So Far','当前解');
% 计算适配值函数,即路径的长度
function F=DistanceOfS(dislist,s)
DistanV=0;
n=size(s,2);
for i=1:(n-1)DistanV=DistanV+dislist(s(i),s(i+1));
endDistanV=DistanV+dislist(s(n),s(1));
F=DistanV;

运行结果:

禁忌搜索算法代码注释相关推荐

  1. 转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  2. 禁忌搜索算法(tabu search)解决TSP及其Matlab代码

    1.算法简介 禁忌搜索算法TS(Tabu search),顾名思义核心在于"禁忌",简单来说就是在某一个过程中把一些不太好的操作给禁止了,直到搜索到一个"最优秀" ...

  3. java 路径规划_转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)...

    以下文章来源于数据魔术师 ,作者周航 欲下载本文相关的代码及算例,请关注公众号[程序猿声],后台回复[TSVRPJAVA]不包括[]即可 前言 大家好呀! 眼看这9102年都快要过去了,小编也是越来越 ...

  4. 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例

    01 什么是禁忌搜索算法? 1.1 先从爬山算法说起 爬山算法从当前的节点开始,和周围的邻居节点的值进行比较. 如果当前节点是最大的,那么返回当前节点,作为最大值 (既山峰最高点):反之就用最高的邻居 ...

  5. 惩罚函数外点matlab,禁忌搜索算法求解带时间窗的车辆路径问题(惩罚函数版 附MATLAB代码)...

    本周应小伙伴要求继续学习TS求VRPTW,不过这次通过使用惩罚约束的形式允许解违反时间窗约束和容量约束,不过要给违反约束的解加以惩罚. 这次我们的目标函数就不单单只有车辆总行驶距离了,还要包括当前解中 ...

  6. 【优化布局】matlab基于禁忌搜索算法求解基站选址问题代码

    1 简介 物流配送中心选址问题在物流网络规划中占有非常重要的地位,选址的合理与否直接关系到配送中心未来的发展.针对企业选址的一般要求,以配送中心总成本最小为目标,构造了一种物流配送中心选址模型.该模型 ...

  7. 基于改进禁忌搜索算法求解TSP问题(Matlab代码实现)

    目录 1 概述 2 改进禁忌搜索算法 3 运行结果 4 参考文献 5 Matlab代码实现 1 概述 当城市数量较少时,理论上可以通过穷举法来列举出最优方案,然而当城市数量较多时,所有路线之和将呈指数 ...

  8. 【路径规划】基于禁忌搜索算法求解初始点和终点确定的取送货路径问题matla代码

    1 简介 研究了带时间窗的取送混合车辆路径问题.问题中,每个客户带有取货和送货两个时间窗,每个客户处的取货和送货任务可以通过访问一次全部完成,也可以分两次访问分别完成送货和取货任务.在对该类问题进行描 ...

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

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

  10. “拼木头”算法挑战赛:禁忌搜索算法,用Javascript 跑

    题目来源见文章<帮一个朋友征集算法代码,大家都来开动你的脑袋发挥你的智慧参与吧>,大家提出了很多算法,很多人说类似百钱买百鸡,这里要讨论一下,拼木头问题和百钱买百鸡问题是很不一样的. 百钱 ...

最新文章

  1. C# Aop简单扫盲及ORM实体类属性拦截示例
  2. windows redis 客户端_redis高并发的最佳解决方案
  3. PHP/AJAX——登录页面与登录信息提示(非安全版本)
  4. 结合zuul网关的鉴权流程
  5. 和搜狗输入法快捷键冲突_这款输入法被调教多年不输搜狗,爱了奥里给!
  6. cordova 人脸识别_html5与EmguCV前后端实现——人脸识别篇(一)
  7. (王道408考研操作系统)第四章文件管理-第二节4:磁盘的管理
  8. 重庆曙光服务器虚拟化部署,VMware vCloud Director 安装部署教程
  9. GitHub 的替代品(国内版)
  10. 一种连续语音识别系统的制作方法
  11. 从留言簿开始,学习MonoRail MVC(三)
  12. windows 系统配置多网关win添加静态路由
  13. 网络工程制图论文计算机,计算机工程制图教学的课业评价-计算机工程论文-计算机论文.docx...
  14. html访问共享文件夹,教大家如何通过IP地址访问共享文件夹
  15. 一枚前端UI组件库 KUI for React
  16. 关于示波器探头的输入容抗问题解决
  17. CANopen协议解读
  18. 程序员如何选择未来的职业路线
  19. Wireshark 301: Finding the busiest computers on your network
  20. docker容器测试技巧

热门文章

  1. 智联+影音,AITO问界M7想干翻的不止理想One
  2. linux %s替换命令,linux vi 替换命令
  3. 基于JS和Canvas的小球碰撞动画演示
  4. TraceView 的使用
  5. linux指令大全(摘自:http://www.3wbmw.cn/archiver/?tid-4706.html)
  6. 计算机专业学校课程改革,中专学校计算机专业课程改革初探
  7. 【时间序列分析】16.平稳序列的决定性
  8. LabelImg 图片标注工具 for Mac
  9. 《现代操作系统(中文第三版)》课后习题——第二章 进程与线程
  10. 自定义报表(demo1)