一. 禁忌搜索算法

禁忌搜索算法是一种全局性邻域搜索算法,模拟人类具有记忆功能的寻优特征。它通过局部邻域搜索机制和相应的禁忌准则来避免迂回搜索,并通过破禁水平来释放一些被禁忌的优良状态,进而保证多样化的有效搜索,以实现全局优化。

二. 禁忌搜索计算流程以及Matlab实现

1. 算法流程图

2. 代码实现

主程序

%% 禁忌搜索算法求解TSP问题程序clear
clcdata = initData();                                          % 存放城市之间距离的矩阵
cityQty = size(data,1);                                     % 城市总数
otherCities = 2:cityQty;
tabuTimes = 3;                                              % 禁忌次数% 随机产生初始解
randCities = otherCities(randperm(cityQty - 1));
xnew = [1 randCities];                                      % 产生xnew
fitxnew = routeDistance(data,xnew);                         % 计算xnew解的路线长度
xbest = xnew;                                               % 让xbest = xnew
fitxbest = fitxnew;                                         % 让fitxbest = fitxnew% 定义禁忌表,1,2为置换的两点符号,3为禁忌剩余代数
tabuTable = zeros(0,3);% 循环计算
isStop = 0;
while isStop < 4                                            % 设置迭代次数% 使用2-opt方式产生xnew的全部邻域解[neighbors,changePos] = neighborBy2opt(xnew);                       % 产生xnew的邻域解% 计算neighbors中每个解的值,并获取最小值neighborRows = size(neighbors,1);fitnesses = zeros(neighborRows, 2);for i = 1 : neighborRowsfitnesses(i,1) = routeDistance(data, neighbors(i,:));minC = min(changePos(i,:));maxC = max(changePos(i,:));for j = 1 : size(tabuTable,1)if tabuTable(j,1) == minC && tabuTable(j,2) == maxCfitnesses(i,2) = 1;% 特赦准则if fitnesses(i, 1) < fitxbest fitnesses(i,2) = 0;endendendend[~, idx] = sortrows(fitnesses, [2,1]);xnow = neighbors(idx(1),:);fitnow = fitnesses(idx(1),1);               tabuObj = changePos(idx(1), :);                                         % 禁忌对象tabuTable = updataTabuTable(tabuTable, tabuObj, tabuTimes);             % 更新禁忌表% 进行解的更新和终止循环判断if fitnow < fitxbestxbest  = xnow;fitxbest = fitnow;isStop = 0;elseisStop = isStop + 1;endxnew = xnow;
end% 输出结果
disp('----------------------最短路径------------------------');
disp(xbest);
disp('---------------------最短路径长度---------------------');
disp(fitxbest);

initData()函数
初始化数据

%% 初始化数据: 各个城市之间的距离矩阵
function distData = initData()distData = [0 15 19 30 6 11 18 14 2415 0 34 44 14 23 29 4 3819 34 0 16 22 15 19 32 930 44 16 0 35 30 18 44 76 14 22 35 0 9 24 11 2811 23 15 30 9 0 24 20 2318 29 19 18 24 24 0 30 1514 4 32 44 11 20 30 0 3724 38 9 7 28 23 15 37 0];
end

routeDistance()函数
计算解的路线长度

function routeDist = routeDistance(cityDist, route)
% 根据城市间的距离计算总路径qty = max(size(route));sumDist = 0;for i = 1 : qty-1sumDist = sumDist + cityDist(route(i),route(i+1));endsumDist = sumDist + cityDist(route(qty),route(1));routeDist = sumDist;
end

neighborBy2opt()函数
两点邻域法产生xnow的邻域解集

function [routes, changePos] = neighborBy2opt( route )% 根据一条路径route,采用2opt方式产生其全部邻域解集cityQty = max(size(route));if cityQty <= 3disp('cityQty is too small in neighborBy2opt.....');endpos = 2 : cityQty;changePos = nchoosek(pos, 2);rows = size(changePos, 1);routes = zeros(rows, cityQty);% 依次对两个点进行位置互换,形成新的解for i  = 1 : rowscity1 = route(changePos(i,1));city2 = route(changePos(i,2));midRoute = route;midRoute(changePos(i,1)) = city2;midRoute(changePos(i,2)) = city1;routes(i,:) = midRoute;end
end

updataTabuTable()函数
更新禁忌表里的对象和禁忌次数

function newTabuTable = updataTabuTable( tabuTable, tabuObj, tabuTimes )
% 更新禁忌表oldRows = size(tabuTable,1);% 先排序
if tabuObj(1) > tabuObj(2)midV = tabuObj(1);tabuObj(1) = tabuObj(2);tabuObj(2) = midV;
endif oldRows == 0tabuTable = [tabuObj tabuTimes];
else% 将以前禁忌表中的禁忌次数-1for i = 1 : oldRowstabuTable(i, 3) = tabuTable(i,3) - 1;end% 查看当前禁忌对象是否存在于原有禁忌表中isExist = 0;for i = 1 : oldRowsif tabuTable(i, 1) == tabuObj(1) && tabuTable(i, 2) == tabuObj(2)isExist = i;break;endendif isExist == 0midTabu = [tabuObj tabuTimes];tabuTable = [tabuTable; midTabu];elsetabuTable(isExist, 3) = tabuTimes;enda = tabuTable(:, 3) == 0;tabuTable(a, :) = [];               % 删除禁忌次数为0的替换对
end
newTabuTable = tabuTable;
end

3. 实现结果

禁忌搜索算法求解TSP旅行商问题Matlab实现相关推荐

  1. 禁忌搜索算法求解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 ...

  2. python用禁忌搜索算法实现TSP旅行商问题

    使用python禁忌搜索算法实现TSP旅行商问题 计算智能课程作业,使用python实现禁忌搜索算法实现TSP旅行商问题 问题简介: 给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起 ...

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

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

  4. 实验10 禁忌搜索算法求解tsp问题

    传送门(所有的实验都使用python实现) 实验1 BP神经网络实验 实验2 som网实验 实验3 hopfield实现八皇后问题 实验4 模糊搜索算法预测薄冰厚度 实验5 遗传算法求解tsp问题 实 ...

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

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

  6. 基于禁忌搜索算法的TSP问题求解matlab仿真

    目录 1.算法概述 2.仿真效果 3.matlab仿真源码 1.算法概述 禁忌搜索(Tabu Search,TS)算法是组合优化算法的一种,是局部搜索算法的扩展.禁忌搜索算法是人工智能在组合优化算法中 ...

  7. 【背包问题】基于禁忌搜索算法求解背包问题附Matlab代码

    1 内容介绍 设计了一种基于禁忌搜索的遗传算法,利用遗传算法提供的并行搜索主框架,结合禁忌算法的个体串行搜索方式,能扩大搜索空间,快速实现全局优化.把基于禁忌搜索的遗传算法与启发式方法相结合用来求解背 ...

  8. 领域搜索算法java_使用JAVA实现算法——禁忌搜索算法解决TSP问题

    packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...

  9. 【TS TSP】基于matlab禁忌搜索算法求解31城市旅行商问题【含Matlab源码 1143期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab禁忌搜索算法求解31城市旅行商问题[含Matlab源码 1143期] 点击上面蓝色字体,直接付费下载,即可. 获取 ...

最新文章

  1. 北极星OKR斩获2021年阿里钉钉生态峰会开放平台年度银奖
  2. 什么是Fabric网络
  3. creo导入特征怎么实体化_Creo/Proe云图抄数牙刷抄数造型
  4. django1.4.9 OMserverweb站点管理
  5. win10家庭版调出组策略_利用powershell为win10家庭版安装组策略
  6. Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏
  7. 项目实战-药品采购系统-day01
  8. Function.prototype.bind相关知识点
  9. kafka结合mysql_logstash集成kafka,mysql实现数据采集
  10. dao-service-servlet-jsp构建简易web通讯录(三层开发)知识点1
  11. 2015年热恋的肉肉们
  12. tomcat乱码问题解决集合
  13. stm32f072 necleo学习(一)
  14. 传输层协议 ——— UDP协议
  15. VOA special English 下载 py
  16. 「区块链系列」搭建区块链底层技术
  17. transform模板函数调用tolower函数报错原因、解决办法
  18. 升级Android Q之路遇到的坑-abc_screen_simple
  19. 【springboot maven 本地包依赖】
  20. 一文概览神经网络优化算法

热门文章

  1. KNIME 安装配置
  2. Windows环境下使用Internet Information Service( IIS)管理器上搭建Web资源网站
  3. SDNU__1082.观妹种菊
  4. 通过Exchange Online(Office365)地址簿策略实现用户地址簿隔离
  5. Linux配置Wifi模块
  6. 不经一番寒彻骨,怎得梅花扑鼻香,墙都不扶就服你
  7. 【论文解读】HIN2Vec: Explore Meta-paths in Heterogeneous Information Networks for Representation Learning
  8. User management
  9. 【Spring实战】----Spring事务管理配置解析
  10. 基于SSM的毕业设计管理系统