candidates

更新时间:2023-01-04 07:50:30 阅读: 评论:0


2023年1月4日发(作者:burglary)

禁忌搜索算法总结

禁忌搜索算法简介

禁忌搜索(TabuSearch,TS)是⼀种现代启发式算法,由美国科罗拉多⼤学教授FredGlover在1986年左右提出的,是⼀个⽤来跳脱局

部最优解的搜索⽅法。

算法基于局部搜索算法改进⽽来,通过引⼊禁忌表来克服局部搜索算法容易陷⼊局部最优的缺点,具有全局寻优能⼒。

局部搜索算法

局部搜索算法从⼀个初始解开始,通过邻域动作,产⽣其邻居解,判断邻居解的质量,根据某种策略,来选择邻居解,重复上述过程,⾄到

达终⽌条件。

针对局部邻域搜索,为了实现全局优化,可尝试的途径有:

以可控性概率接受劣解来逃逸局部极⼩,如模拟退⽕算法;

扩⼤邻域搜索结构,如TSP的2opt扩展到k-opt;

多点并⾏搜索,如进化计算;

采⽤TS的禁忌策略尽量避免迂回搜索,它是⼀种确定性的局部极⼩突跳策略。

基本思想

避免在搜索过程中的循环

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

不以局部最优作为停⽌准则

标记已经解得的局部最优解或求解过程,并在进⼀步的迭代中避开这些局部最优解或求解过程。局部搜索的缺点在于,太过于对某⼀局部区

域以及其邻域的搜索,导致⼀叶障⽬。为了找到全局最优解,禁忌搜索就是对于找到的⼀部分局部最优解,有意识地避开它,从⽽或得更多

的搜索区域。

基本构成部分

禁忌表

禁忌表的作⽤:防⽌搜索出现循环。记录前若⼲步⾛过的点、⽅向或⽬标值,禁⽌返回;表是动态更新的,表的长度称为Tabu-Size(禁忌长

度)。

禁忌长度

指在之后多少个循环内禁⽤某个产⽣邻域的规则(禁忌对象)。

就禁忌长度的选择⽽⾔,禁忌长度越短,机器内存占⽤越少,解禁范围更⼤(搜索范围上限越⼤),但很容易造成搜索循环(实际去搜索的

范围却很⼩),过早陷⼊局部最优。禁忌长度过长⼜会导致计算时间过长。

特赦规则

通俗定义:对于在禁忌的对象,如果出现以下情况,不论现在对象的禁忌长度如何,均设为0

基于评价值的规则,若出现⼀个解的⽬标值好于前⾯任何⼀个最佳候选解,可特赦;

基于最⼩错误的规则,若所有对象都被禁忌,特赦⼀个评价值最⼩的解;

基于影响⼒的规则,可以特赦对⽬标值影响⼤的对象。

候选集

⼀次循环中产⽣领域解的数⽬。

候选集的⼤⼩,过⼤增加计算内存和计算时间,过⼩过早陷⼊局部最优。候选集的选择⼀般由邻域中的邻居组成,可以选择所有邻居,也可

以选择表现较好的邻居,还可以随机选择⼏个邻居。

评价函数

即代价函数,衡量⽬标解的好坏。评价函数分为直接评价函数和间接评价函数。

终⽌规则

⼀些直观的终⽌规则:

确定步数终⽌,⽆法保证解的效果,应记录当前最优解;

频率控制原则,当某⼀个解、⽬标值或元素序列的频率超过⼀个给定值时,终⽌计算;

⽬标控制原则,如果在⼀个给定步数内,当前最优值没有变化,可终⽌计算。

算法流程

代码⽰例

禁忌搜索算法求解中国TSP问题:

%%⼀个旅⾏商⼈要拜访全国31个省会城市,且每个城市只能拜访⼀次,求所有路径之中的最⼩值

%%%禁忌搜索算法求解TSP问题%%%%%%%%%%%%%%%%%%%%%

function[BestShortcut,theMinDistance]=TabuSearch

clear;

clc;

Clist=[13042312;36391315;41772244;37121399;34881535;33261556;32381229;...

41961044;4312790;4386570;30071970;25621756;27881491;23811676;...

1332695;37151678;39182179;40612370;37802212;36762578;40292838;...

42632931;34291908;35072376;33942643;34393201;29353240;31403550;...

25452357;27782826;23702975];%全国31个省会城市坐标

CityNum=size(Clist,1);%TSP问题的规模,即城市数⽬

dislist=zeros(CityNum);

fori=1:CityNum

forj=1:CityNum

dislist(i,j)=((Clist(i,1)-Clist(j,1))^2+(Clist(i,2)-Clist(j,2))^2)^0.5;

end

end

TabuList=zeros(CityNum);%(tabulist)

TabuLength=round((CityNum*(CityNum-1)/2)^0.5);%禁忌表长度(tabulength)

Candidates=200;%候选集的个数(全部领域解个数)

CandidateNum=zeros(Candidates,CityNum);%候选解集合

S0=randperm(CityNum);%随机产⽣初始解

BSF=S0;%bestsofar;

BestL=Inf;%当前最佳解距离

p=1;%记录迭代次数

StopL=2000;%最⼤迭代次数

figure(1);

stop=uicontrol('style','toggle','string'...

,'stop','background','white');

tic;%⽤来保存当前时间

%%%%%%%%%%%%%%%%%%%%%%禁忌搜索循环%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

whilep

ifCandidates>CityNum*(CityNum-1)/2

disp('候选解个数不⼤于n*(n-1)/2!');

break;

end

ALong(p)=Fun(dislist,S0);%当前解适配值

i=1;

A=zeros(Candidates,2);%解中交换的城市矩阵

%以下while的是⽣成随机的200X2的矩阵矩阵A。每⼀个元素都是在1-31之间的

whilei<=Candidates

M=CityNum*rand(1,2);

M=ceil(M);

ifM(1)~=M(2)

A(i,1)=max(M(1),M(2));

A(i,2)=min(M(1),M(2));

ifi==1

isa=0;

el

forj=1:i-1

ifA(i,1)==A(j,1)&&A(i,2)==A(j,2)

isa=1;

break;

el

isa=0;

end

end

end

if~isa

i=i+1;

el

end

end

el

end

end

%%%%%%%%产⽣领域解%%%%%%%%%%%%%%%%%%%%%%%

BestCandidateNum=100;%保留前BestCandidateNum个最好候选解

BestCandidate=Inf*ones(BestCandidateNum,4);

F=zeros(1,Candidates);

%这相当于是产⽣⼀个S0的邻域...

fori=1:Candidates

CandidateNum(i,:)=S0;%候选解集合。

CandidateNum(i,[A(i,2),A(i,1)])=S0([A(i,1),A(i,2)]);

F(i)=Fun(dislist,CandidateNum(i,:));

ifi<=BestCandidateNum

BestCandidate(i,2)=F(i);

BestCandidate(i,1)=i;

BestCandidate(i,3)=S0(A(i,1));

BestCandidate(i,4)=S0(A(i,2));

el

forj=1:BestCandidateNum

ifF(i)

BestCandidate(j,2)=F(i);

BestCandidate(j,1)=i;

BestCandidate(j,3)=S0(A(i,1));

BestCandidate(j,4)=S0(A(i,2));

break;

end

end

end

end

%对BestCandidate

[JL,Index]=sort(BestCandidate(:,2));

SBest=BestCandidate(Index,:);

BestCandidate=SBest;

%%%%%%%%%%%%%%%%%%%%%%%藐视准则%%%%%%%%%%%%%%%%%%%%%%%%%%%%

ifBestCandidate(1,2)

BestL=BestCandidate(1,2);

S0=CandidateNum(BestCandidate(1,1),:);

BSF=S0;

form=1:CityNum

forn=1:CityNum

ifTabuList(m,n)~=0

TabuList(m,n)=TabuList(m,n)-1;%更新禁忌表

end

end

end

TabuList(BestCandidate(1,3),BestCandidate(1,4))=TabuLength;%更新禁忌表

el

fori=1:BestCandidateNum

ifTabuList(BestCandidate(i,3),BestCandidate(i,4))==0

S0=CandidateNum(BestCandidate(i,1),:);

form=1:CityNum

forn=1:CityNum

ifTabuList(m,n)~=0

TabuList(m,n)=TabuList(m,n)-1;%更新禁忌表

end

end

end

TabuList(BestCandidate(i,3),BestCandidate(i,4))=TabuLength;%更新禁忌表

break;

end

end

end

ArrBestL(p)=BestL;

fori=1:CityNum-1

plot([Clist(BSF(i),1),Clist(BSF(i+1),1)],[Clist(BSF(i),2),Clist(BSF(i+1),2)],'bo-');

holdon;

end

plot([Clist(BSF(CityNum),1),Clist(BSF(1),1)],[Clist(BSF(CityNum),2),Clist(BSF(1),2)],'ro-');

title(['迭代次数:',int2str(p),'优化最短距离:',num2str(BestL)]);

holdoff;

pau(0.005);

ifget(stop,'value')==1

break;

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);

end

p=p+1;%迭代次数加1

end

toc;%⽤来保存完成时间

BestShortcut=BSF;%最佳路线

theMinDistance=BestL;%最佳路线长度

t(stop,'style','pushbutton','string','clo','callback','clo(gcf)');

figure(2);

plot(ArrBestL,'b');

xlabel('迭代次数');

ylabel('⽬标函数值');

title('适应度进化曲线');

grid;

holdon;

%%figure(3)

%%plot(toc-tic,'b');

%%grid;

%%title('运⾏时间');

%%legend('BestSoFar','当前解');

%%%%%适配值函数%%%%%%%%%%%%%%%%%%%%%

functionF=Fun(dislist,s)

DistanV=0;

n=size(s,2);

fori=1:(n-1)

DistanV=DistanV+dislist(s(i),s(i+1));

end

DistanV=DistanV+dislist(s(n),s(1));

F=DistanV;

本文发布于:2023-01-04 07:50:30,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/89553.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:delivered
下一篇:怎么做鬼脸
标签:candidates
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图