TSP matlab

問題:工作指派問題可以描述如下:n 個工作將要指派給 n 個工人分別完成,工人 i 完成工作 j 的時間爲 dij,問如何安排可使總的工作時間達到最
小?請設計一種 SA 算法來解決上述指派問題。
假設 n=100,要求隨機產生 dij;
matlab代碼如下:
function main()
%TSP問題的模擬退火算法malab程序
%wangs編寫
d=rand(100,100);
[~,n]=size(d);
t0=100; %t0初始溫度=100K
t=t0;
tf=1; %tf最終溫度=100K
x=1:n; %領域初始解表示第i個人做i個事
xbest=x; %領域最優解
c=1;
fmin=fun(d,x);%將初始可行解下的目標函數設爲當前最優目標值
while t>tf
for k=1:5000; %內循環停止準則5000次
y=xbest;
t=y©;
y©=y(c+1); %兩個交換
y(c+1)=t; %xbest中兩個元素進行交換
x=y;
c=c+1; %可行解2-opt順序交換。
if c>99 %說明c=99時,狀態表達爲x=[2 3…99 1],
c=1;
end %c>99強制新一輪順序交換,以保證所有元素被交換到
fx=fun(d,x); %計算新解的函數值。
fb=fx-fmin;
if fb<=0
xbest=x;
fmin=fx; %無條件跳轉,取最優值與最優解。
elseif fb>0
p=exp(-fb/t);
if p>rand
xbest=x;
fmin=fx; %有條件跳轉,取最優值與最優解。
elseif p<=rand
x=x; %不處理
end
end
end
t=0.98*t; %模擬退火操作
end
fmin
xbest
function fmin=fun(d,x)
fmin=0;
n=length(x);
for i=1:n
fmin=fmin+d(i,x(i)); %計算第i個人做x(i)任務時總時間。
end

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