新的学期,新的征程!
先附上退火算法的原理——http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html
退火算法简单概括就是尽量跳出局部最优解,寻找全局最优解。
下面附上晚上写的代码,用的问题是教程中的旅游最短路线问题。
clear all
% 导入城市坐标数据
X = [16.4700 96.1000;
16.4700 94.4400;
20.0900 92.5400;
22.3900 93.3700;
25.2300 97.2400;
22.0000 96.0500;
20.4700 97.0200;
17.2000 96.2900;
16.3000 97.3800;
14.0500 98.1200;
16.5300 97.3800;
21.5200 95.5900;
19.4100 97.1300;
20.0900 92.5500];
% 计算距离矩阵
dis=zeros(length(X));
for i=1:length(X)
dis(i,:)=sqrt(sum((X-X(i,:)).^2,2));
end
T0=1e10;% 初始温度
Trend=1e-30; % 终止温度
q=0.9; % 降温速率
syms x;
Time = ceil(solve(T0 *(0.9).^x==Trend,x)); % 计算迭代次数
count=0; % 迭代计数
s1=randperm(length(X));% 初始化路径
s1_distance=0;
for i=1:length(X) % 初始化路径总距离
s1_distance=s1_distance+dis(s1(i),s1(rem(i,length(X))+1));
end
%本次算法通过随机交换路线中两个城市来获得新的路线
while count<=Time
T0=T0*0.9;
rand_city=round(rand(1,2)*(length(X)-1)+1);
s2=s1;
w=s2(rand_city(1));
s2(rand_city(1))=s2(rand_city(2));
s2(rand_city(2))=w;
s2_distance=0;
for i=1:length(X) % 计算改变路线后的总距离
s2_distance=s2_distance+dis(s2(i),s2(rem(i,length(X))+1));
end
ds=s1_distance-s2_distance;
if ds>0 % 选择两个方案的最优解
s1=s2;
s1_distance=s2_distance;
elseif exp(ds/T0)>=rand % 如新的值为非最优解,依靠概率判断是否接受非最优解
s1=s2;
s1_distance=s2_distance;
end
count=count+1;
end
disp(s1)