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

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