禁忌搜尋演算法求解TSP

2021-10-04 16:51:57 字數 2697 閱讀 3098

本文的禁忌搜尋演算法是最經典禁忌搜尋演算法,可以在此基礎上進行修改和擴充套件

主函式

%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 來實現深度優先搜尋。輸入形式 在螢幕上輸入頂點個數和連線頂點間的邊...