一、原理步骤
参考:禁忌搜索算法(Tabu Search)的基本原理与算法流程总结_Chauncy__xu的博客-CSDN博客_禁忌搜索算法
注意其中存在两个对象:
禁忌对象:禁忌表中被禁的那些变化元素
禁忌长度:禁忌的步数,决定禁忌表的长度
二、算例,以tsp问题为例,数据随机生成
代码:
clc
clear
p=rand(10,2)*10;
plot(p(:,1),p(:,2),'ok')
title('生成点')
save p p
三、禁忌搜索算法matlab代码及效果
迭代过程: 路线结果:
代码:子函数点赞收藏关注后私聊获得,码字不易感谢支持!
clc
clear
close all
p=[8.14723686393179,1.57613081677548;9.05791937075619,9.70592781760616;1.26986816293506,9.57166948242946;9.13375856139019,4.85375648722841;6.32359246225410,8.00280468888800;0.975404049994095,1.41886338627215;2.78498218867048,4.21761282626275;5.46881519204984,9.15735525189067;9.57506835434298,7.92207329559554;9.64888535199277,9.59492426392903];
%% 初始化
popus=randperm(size(p,1));
%% 禁忌搜索
max_ge=50;%搜索步数
J_ch=[];%禁忌表
J_T=[];
T=5;%禁忌长度
Pf=inf;
for gen=1:max_ge
num=50;
pop=cell(1,num);
%选出候选集
for i=1:num
pop{i}=Randk(popus);
end
f=fit(pop,p);
for i=1:num
for j=1:size(J_ch,2)
if sum(abs(J_ch{j}-pop{i}))==0
f(i)=inf;
break
end
end
end
[~,index]=min(f);
%将禁忌长度-1
if ~isempty(J_T)
J_T=J_T-1;
ch=find(J_T==0);
J_T(ch)=[];
J_ch(ch)=[];
end
%将其加入禁忌表
J_ch=[J_ch,pop(index(1))];
J_T=[J_T,T];
Pop{gen}=pop{index(1)};
Pf(gen)=min([min(f),Pf]);
popus=pop{index(1)};
end
[~,index]=min(Pf);
popus=Pop{index(1)};
figure(1)
plot(1:size(Pf,2),Pf,'-k')
title('迭代过程')
xlabel('X')
ylabel('Y')
figure(2)
plot(p(:,1),p(:,2),'ok')
hold on
plot([p(popus(1),1) p(popus(end),1)],[p(popus(1),2) p(popus(end),2)],'-b')
hold on
for i=1:size(popus,2)-1
plot([p(popus(i),1) p(popus(i+1),1)],[p(popus(i),2) p(popus(i+1),2)],'-b')
hold on
end
title('路线图')