
function [best_solution,best_fit,iter] = mySa(solution,a,t0,tf,Markov)
% 模擬退化算法
% ===== 輸入 ======%
% solution 初始解
% a 溫度衰減系數 0.99
% t0 初始溫度 120
% tf 最終溫度 1
% Markov 馬爾科夫鏈長度 10000
% ====== 輸出 =====%
% best_solution 最優解
% best_fit 最優解目標值
% iter 迭代次數
n = length(solution);
t = t0;
solution_new = solution; % 初始解賦給最新的解
best_fit = Inf; % 初始化最優適應度(最差的適應度)
fit = Inf; % 初始化當前的適應度
best_solution = solution; % 最優解
iter = 1;
% -----------------------迭代過程------------------------------------%
while t >= tf
for j = 1:Markov
% -----------------------產生新解過程------------------------------------%
%進行擾動,產生新的序列solution_new;
if (rand < 0.7) % 概率小於0.7 采取交換兩個數位置的方式產生新解
ind1 = 0; ind2 = 0;
while(ind1 == ind2 && ind1 >= ind2)
ind1 = ceil(rand*n);
ind2 = ceil(rand*n);
end
temp = solution_new(ind1);
solution_new(ind1) = solution_new(ind2);
solution_new(ind2) = temp;
else % 概率大於等於0.7 采取成組交換連續三個數位置的方式產生新解
ind = zeros(3,1);
L_ind = length(unique(ind));
while (L_ind < 3)
ind = ceil([rand*n rand*n rand*n]);
L_ind = length(unique(ind));
end
ind0 = sort(ind);
a1 = ind0(1); b1 = ind0(2); c1 = ind0(3);
solution0 = solution_new;
solution0(a1:a1+c1-b1-1) = solution_new(b1+1:c1);
solution0(a1+c1-b1:c1) = solution_new(a1:b1);
solution_new = solution0;
end
% -----------------------計算適應度過程------------------------------------ %
%計算適應度fit_new
fit_new = myFitCal(solution_new);
% -----------------------解的更新過程------------------------------------ %
if fit_new<fit
fit = fit_new;
solution = solution_new;
%對最優路線和距離更新
if fit_new < best_fit
iter = iter + 1;
best_fit = fit_new;
best_solution = solution_new;
end
else
if rand<exp(-(fit_new-fit)/t)
solution = solution_new;
fit = fit_new;
end
end
solution_new = solution;
end
t = t*a; %降溫
end