模拟退火算法是一种基于MonteCarlo迭代求解策略的一种随机寻优算法。该算法从某一较高初温出发,伴随温度参数的不断下降,结合概率的突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。
模拟退火算法的基本思想是:在一定温度下,搜索从一个状态随机地变化到另一个状态;随着温度的不断下降直到最低温度,搜索过程以概率1停留在最优解。
模拟退火算法的基本步骤如下:
用模拟退火算法求解TSP问题的MATLAB代码如下所示:
function [ E ] = Sum( C,X )
%UNTITLED2 此处显示有关此函数的摘要
% 此处显示详细说明
L = size(X);
E = 0;
for i = 1:L(1,2)-1
E = E + sqrt((C(X(1,i),1)-C(X(1,i+1),1))*(C(X(1,i),1)-C(X(1,i+1),1))+(C(X(1,i),2)-C(X(1,i+1),2))*(C(X(1,i),2)-C(X(1,i+1),2)));
end
E = E + sqrt((C(X(1,1),1)-C(X(1,30),1))*(C(X(1,1),1)-C(X(1,30),1))+(C(X(1,1),2)-C(X(1,30),2))*(C(X(1,1),2)-C(X(1,30),2)));
end
clc,clear
load('City.mat');
Loop = 1000;
alpha = 0.9;
tf = 0.0001;
X = zeros(1,30);
for i = 1:30
X(1,i) = i;
end
%scatter(City(:,1),City(:,2),'p')
%hold on;
sumarray = zeros(1,Loop);
sumarrayx = zeros(1,Loop);
T = 10000;
for i = 1:Loop
if T30
index1 = round(30*rand);
end
while index2<1 || index2>30
index2 = round(30*rand);
end
Y = X;
Y(1,index1) = X(1,index2);
Y(1,index2) = X(1,index1);
dsum = Sum(City,Y)-Sum(City,X);
if dsum<0
X = Y;
else
accept = rand;
if accept < exp(-dsum/(k*T))
X = Y;
end
end
end
T = T*alpha;
sumarray(1,i) = Sum(City,X);
sumarrayx(1,i) = i;
end
%scatter(sumarrayx(1,1:i),sumarray(1,1:i))
scatter(City(:,1),City(:,2),'p')
hold on;
for i = 1:29
line([City(X(1,i),1) City(X(1,i+1),1)],[City(X(1,i),2) City(X(1,i+1),2)])
hold on;
end
line([City(X(1,1),1) City(X(1,30),1)],[City(X(1,1),2) City(X(1,30),2)])
hold on;
Sum(City,X)
迭代100次效果如下所示
迭代200次结果如下所示
迭代1000次结果如下
路径和随迭代次数的变化如下所示
参考资料:《模拟退火算法》(PPT)卿 铭