【TSP】禁忌搜索算法求解TSP问题【Matlab 465期】

一、简介

一、局部领域搜索

又称爬山启发式算法,从当前的节点开始,和周围的邻居节点的值进行比较。如果当前节点是最大的,那么返回当前节点,作为最大值(即山峰最高点);反之就用最高的邻居节点替换当前节点,从而实现向山峰的高处攀爬的目的。它是禁忌搜索的基础,TS算法是在其上改进而来。

优点:

    1、容易理解,容易实现,具有较强的通用性;

    2、局部开发能力强,收敛速度很快。

缺点:

    1、全局开发能力弱,只能搜索到局部最优解;

    2、搜索结果完全依赖于初始解和邻域的映射关系。

通过针对爬山法的分析,提出了TS搜索算法:

    改进1:接受劣解。

    改进2:引入禁忌表。

    改进3:引入长期表和中期表。

二、TS算法的特点:

1、基本思想——避免在搜索过程中的循环

2、只进不退的原则,通过禁忌表实现

3、不以局部最优作为停止准则

4、邻域选优的规则模拟了人类的记忆功能

    TS算法构成要素:       

(1)编码方式

 将不相同的n件物品分为m组,可以用的编码:

a、带分隔符的顺序编码

以自然数1~n分别代表n件物品,n个数加上 m-1个分割符号混编在一起,随机排列。  如:1-3-4-0-2-6-7-5-0-8-9

b、自然数编码

编码的每一位分别代表一件物品,而每一位的值代表该物品所在的分组。

如:1-2-1-1-2-2-2-3-3

(2)初始解的获取

可以随机给出初始解,也可以事先使用其他启发式等算法给出一个较好的初始解。

(3)移动邻域

移动是从当前解产生新解的途径,例如上述问题中用移动s产生新解s(x)。 从当前解可以进行的所有移动构成邻域,也可以理解为从当前解经过“一步”可以到达的区域。

(4)禁忌表

禁忌表的作用:防止搜索出现循环​

(1)记录前若干步走过的点、方向或目标值,禁止返回

(2)表是动态更新的

(3)表的长度称为Tabu-Size

禁忌表的主要指标(两项指标)

 禁忌对象:禁忌表中被禁的那些变化元素

 禁忌长度:禁忌的步数

禁忌对象(三种变化)

 以状态本身或者状态的变化作为禁忌对象

 以状态分量以及分量的变化作为禁忌对象

 采用类似的等高线做法,以目标值变化作为禁忌对象

禁忌长度:可以是一个固定的常数(T=c),也可以是动态变化的,可按照某种规则或公式在区间内变化。

禁忌长度过短,一旦陷入局部最优点,出现循环无法跳出;

禁忌长度过长,候选解全部被禁忌,造成计算时间较大,也可能造成计算无法继续下去。

(5)渴望水平函数   

A(x,s)一般为历史上曾经达到的最好目标值,若有C(s(x))<A(x,s)则S(x)是不受T表限制。即使s(x)∈T,仍可取 x=s(x)。A(x,s)称为渴望水平函数。

(6)停止准则

(1)给定最大迭代步数(最常用 )

(2)设定某个对象的最大禁忌频率。

(3)设定适配值的偏离阈值。

二、源代码

clc;
clear;
close all;

%% Problem Definition

model = CreateModel();      % Create TSP Model

CostFunction=@(tour) TourLength(tour, model);    % Cost Function

ActionList=CreatePermActionList(model.n);    % Action List

nAction=numel(ActionList);              % Number of Actions


%% Tabu Search Parameters

MaxIt=50;                      % Maximum Number of Iterations

TL=round(0.5*nAction);      % Tabu Length


%% Initialization

% Create Empty Individual Structure
empty_individual.Position=[];
empty_individual.Cost=[];

% Create Initial Solution
sol=empty_individual;
sol.Position=randperm(model.n);
sol.Cost=CostFunction(sol.Position);

% Initialize Best Solution Ever Found
BestSol=sol;

% Array to Hold Best Costs
BestCost=zeros(MaxIt,1);

% Initialize Action Tabu Counters
TC=zeros(nAction,1);


%% Tabu Search Main Loop

for it=1:MaxIt
    
    bestnewsol.Cost=inf;
    
    % Apply Actions
    for i=1:nAction
        if TC(i)==0
            newsol.Position=DoAction(sol.Position,ActionList{
    
    i});
            newsol.Cost=CostFunction(newsol.Position);
            newsol.ActionIndex=i;

            if newsol.Cost<=bestnewsol.Cost
                bestnewsol=newsol;
            end
        end
    end
    
    % Update Current Solution
    sol=bestnewsol;
    
    % Update Tabu List
    for i=1:nAction
        if i==bestnewsol.ActionIndex
            TC(i)=TL;               % Add To Tabu List
        else
            TC(i)=max(TC(i)-1,0);   % Reduce Tabu Counter
        end
    end
    
    % Update Best Solution Ever Found
    if sol.Cost<=BestSol.Cost
        BestSol=sol;
    end
    function PlotSolution(sol,model)

    xmin=model.xmin;
    xmax=model.xmax;
    ymin=model.ymin;
    ymax=model.ymax;
    
    tour=sol.Position;
    
    tour=[tour tour(1)];
    
    plot(model.x(tour),model.y(tour),'k-o',...
        'MarkerSize',10,...
        'MarkerFaceColor','y',...
        'LineWidth',1.5);
    
    xlabel('x');
    ylabel('y');
    
    axis equal;
    grid on;
    
	alpha = 0.1;
	
    dx = xmax - xmin;
    xmin = floor((xmin - alpha*dx)/10)*10;
    xmax = ceil((xmax + alpha*dx)/10)*10;
    xlim([xmin xmax]);
    
    dy = ymax - ymin;
    ymin = floor((ymin - alpha*dy)/10)*10;
    ymax = ceil((ymax + alpha*dy)/10)*10;
    ylim([ymin ymax]);
    function model=CreateModel()

    x=[82 91 12 92 63 9 28 55 96 97 15 98 96 49 80 12 80 55];
    
    y=[14 42 92 80 96 66 3 85 94 68 76 75 39 66 17 78 80 45];
    
    n=numel(x);
    
    d=zeros(n,n);
    
    for i=1:n-1
        for j=i+1:n
            d(i,j)=sqrt((x(i)-x(j))^2+(y(i)-y(j))^2);
            d(j,i)=d(i,j);
        end
    end

    xmin=0;
    xmax=100;
    
    ymin=0;
    ymax=100;
    
    model.n=n;
    model.x=x;
    model.y=y;
    model.d=d;
    model.xmin=xmin;
    model.xmax=xmax;
    model.ymin=ymin;

三、运行结果

在这里插入图片描述

在这里插入图片描述

四、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【路径规划】粒子群优化算法之三维无人机路径规划【Matlab 012期】
【路径规划】遗传算法之多物流中心的开放式车辆路径规划【Matlab 013期】
【路径规划】粒子群算法之机器人栅格路径规划【Matlab 014期】
【路径规划】蚁群算法之求解最短路径【Matlab 015期】
【路径规划】免疫算法之物流中心选址【Matlab 016期】
【路径规划】人工蜂群之无人机三维路径规划【Matlab 017期】
【路径规划】遗传算法之基于栅格地图机器人路径规划【Matlab 018期】
【路径规划】蚁群算法之多无人机攻击调度【Matlab 019期】
【路径规划】遗传算法之基于栅格地图的机器人最优路径规划【Matlab 020期】
【路径规划】遗传算法之考虑分配次序的多无人机协同目标分配建模【Matlab 021期】
【路径规划】蚁群算法之多中心vrp问题【Matlab 022期】
【路径规划】蚁群算法之求解带时间窗的多中心VRP【Matlab 023期】
【路径规划】遗传算法之多中心VRP求解【Matlab 024期】
【路径规划】模拟退火之求解VRP问题【Matlab 025期】
【路径规划】A星之栅格路径规划【Matlab 026期】
【路径规划】基于一种带交叉因子的双向寻优粒子群栅格地图路径规划【Matlab 027期】
【路径规划】【TSP】蚁群算法之求解TSP问题含GUI【Matlab 028期】
【路径规划】蚁群算法之栅格地图路径规划【Matlab 029期】
【路径规划】遗传算法之旅行商 TSP 【Matlab 030期】
【路径规划】模拟退火算法之旅行商 TSP 问题【Matlab 031期】
【路径规划】蚁群算法之智能车路径规划【Matlab 032期】
【路径规划】华为杯:基于matlab 无人机优化运用于抢险救灾【Matlab 033期】
【路径规划】matlab之最小费用最大流算问题【Matlab 034期】
【路径规划】A算法之解决三维路径规划问题【Matlab 035期】
【路径规划】人工蜂群算法之路径规划【Matlab036期】
【路径规划】人工蜂群算法之路径规划【Matlab 037期】
【路径规划】蚁群算法之求解多旅行商MTSP问题【Matlab 038期】
【路径规划】蚁群算法之无人机路径规划【Matlab 039期】
【路径规划】遗传算法之求解多VRP问题【Matlab 040期】
【VRP】遗传算法之带时间窗的车辆路径问题【Matlab 041期】
【路径规划】蚁群算法之三维路径规划【Matlab 042期】
【路径规划】粒子群优化蚁群之求解最短路径【Matlab 043期】
【TSP问题】差分进化之求解TSP问题【Matlab 044期】
【路径规划】RRT之三维路径规划【Matlab 144期】
【路径规划】人工势场算法之无人机编队路径规划【 Matlab 145期】
【VRP问题】节约算法之求解TWVRP问题【Matlab 146期】
【VRP问题】节约算法之求解CVRP问题【Matalb 147期】
【VRP问题】禁忌搜索算法之求解VRP问题【Matalb 148期】
【VRP问题】模拟退火算法之求解CVRP问题【Matlab 149期】
【VRP问题】模拟退火求解带时间窗之TWVRP问题【Matlab 150期】
【VRP问题】人工鱼群算法之求解带时间窗VRP问题【Matlab 151期】
【VRP问题】遗传算法之求解带容量VRP问题【Matlab 152期】
【路径规划】狼群算法算法之三维路径规划【Matlab 153期】
【路径规划】人工势场算法之无人机三维路径规划【Matlab 154期】
【路径规划】改进差分算法之三维多无人机协同航迹规划【Matlab 155期】
【路径规划】人工蜂群算法之多无人机三维路径规划【Matlab 156期】
【路径规划】麻雀搜索算法之无人机三维路径规划【Matlab 157期】
【路径规划】蚁群算法之三维路径规划【Matlab 158期】
【路径规划】免疫算法之最短路径规划【Matlab 159期】
【旅行商问题】免疫算法之求解旅行商问题【Matlab 160期】
【路径规划】遗传算法的公交排班系统分析【Matlab 161期】
【TSP】粒子群算法Hopfield之TSP求解【Matlab 162期】
【路径规划】A和改进A*的路径规划【Matlab 163期】
【TSP】改进的禁忌搜索算法之求解旅行商问题【Matlab 170期】
【TSP】改进的蚁群算法之求解旅行商问题【Matlab 171期】
【路径规划】模拟退火算法之求解火灾巡逻最短路径【Matlab 193期】
【三维路径规划】蚁群算法寻优潜水器的三维路径【Matlab 194期】
【三维路径规划】matlab 蚁群算法UAV巡检路径【Matlab 195期】
【三维路径规划】无人机的三维动态仿真【Matlab 196期】
【三维路径规划】无人机三维空间的航迹规划【Matlab 228期】
【路径规划】分布式目标检测和跟踪的多无人机【Matlab 229期】
【路径规划】粒子群算法求解无人机最短路径【Matlab 277期】
【无人机】多无人协同任务分配程序平台【Matlab278期】
【路径规划】多无人机协同任务规划【Matlab 279期】
【路径规划】任意架次植保无人机作业路径规划【Matlab 280期】
【路径规划】粒子群遗传求解多无人机三维路径规划【Matlab 281期】
【VRP问题】粒子群求解VRPTW模型【Matlab 282期】
【路径规划】改进蚁群算法的路径规划【Matlab 283期】
【VRP】改进的模拟退火和遗传算法求解VRP问题【Matlab 284期】
【VRP问题】灰狼算法求解VRPTW问题【Matlab 285期】
【VRP问题】遗传算法和模拟退火求解带时间窗的自行车调度问题【Matlab 286期】
【路径规划】改进的人工势场法机器人动静态避障【Matlab 287期】
【TSP】混合粒子群求解TSP问题【Matlab 288期】
【TSP】蚁群算法求解旅行商问题【Matlab 289期】
【TSP】hopfield神经网络求解TSP问题【Matlab 290期】
【TSP】蚁群算法求解76城市TSP问题【Matlab 291期】
【路径规划】粒子群求解物流选址【Matlab 292期】
【TSP】人工鱼群算法求解TSP问题【Matlab 293期】
【TSP】基粒子群算法求解旅行商问题【Matlab 308期】
【航迹规划】Astar算法三维航迹规划【Matlab 361期】

猜你喜欢

转载自blog.csdn.net/m0_54742769/article/details/114956191