本文的禁忌搜尋演算法是最經典禁忌搜尋演算法,可以在此基礎上進行修改和擴充套件
主函式
%author:chauncy_xu
%date:2023年4月1日
clc;
clear all;
close all;
[len_side,city]=city;
num_city=size(city,1);%城市數目
gen=1; %記錄迭代次數
num_gen=1000; %最大迭代次數
pop0=randperm(num_city); %隨機產生初始解
%% 禁忌表設定
tabulist=zeros(num_city); %禁忌表
len_tabu=100;%禁忌表長度
%% 迭代準備
num_candi=400; %全部領域解個數,不能超過30*29/2
candi=zeros(num_candi,num_city); %鄰域集合
best_pop=pop0; %當前最優解
best_dis=inf; %當前最佳解距離
now_fit=zeros(1,num_gen);
mem_best=zeros(1,num_gen); %用於記錄每一代的最優值
%% 迭代
while gen<=num_gen
now_fit(gen)=fitness(len_side,pop0); %當前解適配值
move=zeros(num_candi,2); % 準備所有可能的移動城市,200行2列
%% 產生指定個數的候選解
%選擇鄰域的真子集為候選解集
i=1;%對候選解進行遍歷
while i<=num_candi %生成隨機的200 x 2 的矩陣矩陣,作為鄰域
m=ceil(num_city*rand(1,2));%m是1-30之間的兩個正整數
while m(1)==m(2)
m(2)=ceil(num_city*rand());%m1m2禁止重複
endmove(i,1)=m(1);
move(i,2)=m(2);
%% 保證所有的鄰域解互不相同
if i==1
flag=0;
else
for j=1:i-1
if (move(i,1)==move(j,1) && move(i,2)==move(j,2)) || (move(i,1)==move(j,2) && move(i,2)==move(j,1))
flag=1;
break;
else
flag=0;
endend
end
if ~flag
i=i+1;
end
end%% 選取乙個解鄰域的真子集作為候選解
num_bestcandi=100;%只保留前100個最好候選解
bestcandi=inf*ones(num_bestcandi,4);%記錄保留的100個候選解的資訊
fit=zeros(1,num_candi);
for i=1:num_candi
candi(i,:)=pop0; %候選解集合
candi(i,[move(i,2),move(i,1)])=pop0([move(i,1),move(i,2)]);%進行移動
fit(i)=fitness(len_side,candi(i,:));%計算該候選解的適應度值
if i<=num_bestcandi
bestcandi(i,2)=fit(i);%第二列存放適應度值
bestcandi(i,1)=i;%第一列存放序號
bestcandi(i,3)=pop0(move(i,1));%第三列第四列存放交換的位置
bestcandi(i,4)=pop0(move(i,2));
else
for j=1:num_bestcandi
if fit(i)適應值函式
function fit=fitness(len_side,pop)
f=0;
len=size(pop,2);
for i=1:(len-1)
f=f+len_side(pop(i),pop(i+1));
end f=f+len_side(pop(len),pop(1));
fit=f;
city函式
function fit=fitness(len_side,pop)
f=0;
len=size(pop,2);
for i=1:(len-1)
f=f+len_side(pop(i),pop(i+1));
end f=f+len_side(pop(len),pop(1));
fit=f;
禁忌搜尋演算法
禁忌搜尋 tabu search 演算法是一種亞啟發式 meta heuristic 隨機搜尋演算法,它從乙個初始可行解出發,選擇一系列的特定搜尋方向 移動 作為試探,選擇實現讓特定的目標函式值變化最多的移動。為了避免陷入區域性最優解,ts採用了一種靈活的 記憶 技術,對已經進行的優化過程進行記錄和...
禁忌搜尋演算法
對於優化問題相關演算法有如下分類 禁忌搜尋是由區域性搜尋演算法發展而來,爬山法是從通用區域性搜尋演算法改進而來。在介紹禁忌搜尋之前先來熟悉下爬山法和區域性搜尋演算法。在搜尋過程中,始終選擇當前點的鄰居中與離目標最近者的方向搜尋。1 隨機選擇乙個初始的可能解x0 d,xb x0,p n xb d是問題...
深度優先搜尋演算法求解TSP問題
問題描述 採用深度優先搜尋演算法求解tsp問題,並在搜尋過程中,使用界限條件 當前結點已經走過的路徑長度要小於已求得的最短路徑 進行 剪枝 操作 不再對後續結點進行遍歷 從而提高搜尋效率。採用queue模組中的棧 lifoqueue 來實現深度優先搜尋。輸入形式 在螢幕上輸入頂點個數和連線頂點間的邊...