TS matlab程序

某 5 個城市旅行商問題,城市間距離矩陣D
TS 算法設置如下:
初始解爲 1-2-3-4-5;
評價函數爲極小化巡迴路程;
鄰域移動方式爲 2-opt;
禁忌對象爲鄰域移動方式;
T 表長度設爲 3,NG 設爲 5。
要求:給出完整的 TS 迭代過程。

matlab代碼如下:
function main()
%D爲城市間的距離
clear;clc;
D=[0 10 15 6 2
10 0 8 13 9
15 8 0 20 15
6 13 20 0 5
2 9 15 5 0];
t=3; %t爲禁忌表的長度
A=zeros(t,5);%A爲禁忌表
p=1;
x=1:5;%x爲初始可行解
fmin=fun(D,x);%將初始可行解下的目標函數設爲當前最優目標值
N=1;
while N<=5
X=find(x); %X爲候選可行解的集合集
[m,n]=size(X);
y=zeros(1,m);
for i=1:m
y(i)=fun(D,X(i,:));
end
[miny,minp]=sort(y);%對y排序並返回其下標值
w=X(minp(1), :); %取最小的y
%若候選解的目標值優於當前的最優目標值,不管其禁忌屬性如何,更新爲當前最優解並更新禁忌表
if miny(1)< fmin %如果最小的y優於當前最優目標值
xbest=w;%xbest爲當前最優解
x=w; %更新當前解
fmin=miny(1); %更新當前最優目標值
A(p,:)=x; %將當前解加入到禁忌表中
p=p+1;
if p= =t+1
p=1;
end
else
j=2;
%若被禁忌,選取次優解後繼續該步驟;若未被禁忌,更新該解w爲當前解並更新禁忌表。
while check(A,w)= =1
w=X(minp(j), :); %取次優解
j=j+1;
end
x=w;
fmin=fun(D,x);
A(p,:)=x; %將次優解加入到禁忌表中
p=p+1;
if p= =t+1
p=1;
end
end
N=N+1;
end
xbest
fmin
A
end
%-----------------------------
%fun()函數爲目標函數作
function y=fun(D,x)
A=D;
d=0;
n=length(x);
for i=1:n-1
d=d+D(x(i),x(i+1));
end
d=d+D(x(n),x(1));
y=d;
end
%-----------------------------
%find(x)函數,在x領域中尋找候選可行解的集合
function X=find(x)
X=[];
c=1;
for i=2:5
y=x;
for r=i+1:5
y=x;
t=y(i);
y(i)=y( r);
y( r)=t;
X(c,:)=y;
c=c+1;
end
end
end
%-----------------------------
%check(A,x)函數,檢查x是否在禁忌表A內
function f=check(A,x)
f=0;
[m,n]=size(A);
for i=1:m
y=A(i,:);
if x==y
f=1;
break;
end
end
end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章