模拟退火算法
简介
模拟退火算法的思想借鉴于固体的退火过程,当固体的温度很高时,内能比较大,固体内的粒子处于快速无序运动状态,当温度慢慢降低,固体的内能减小,粒子逐渐趋于有序,最终固体处于常温状态,内能达到最小,此时粒子最为稳定。
MATLAB例子(出自智能优化算法MALTAB实现)
7.1
D=10;%变量维数
Xs=20;%上限
Xx=-20;%下限
%冷却表参数
L=200;%马尔可夫链长度
K=0.998;%衰减参数
S=0.01;%步长因子
T=100;%初始温度
YZ=1e-8;%容差
P=0;%Metropolis过程中总接受点
%随机选点初值设定
PreX=rand(D,1)*(Xs-Xx)+Xx;
PreBestX=PreX;
PreX=rand(D,1)*(Xs-Xx)+Xx;
BestX=PreX;
%每迭代一次退火一次,直到满足迭代条件为止
deta=abs(func1(BestX)-func1(PreBestX));
while (deta>YZ)&&(T>0.001)
T=K*T;
%在当前温度T下迭代次数
for i=1:L
%在此点附近随机选下一点
NextX=PreX+S*(rand(D,1)*(Xs-Xx)+Xx);
%边界条件处理
for ii=1:D
if NextX(ii)>Xs|NextX(ii)<Xx
NextX(ii)=PreX(ii)+S*(rand*(Xs-Xx)+Xx);
end
end
%是否全局最优解
if (func1(BestX)>func1(NextX))
%保留上一个最优解
PreBestX=BestX;
%此为新的最优解
BestX=NextX;
end
%Metropolis过程
if(func1(PreX)-func1(NextX)>0)
%接受新解
PreX=NextX;
P=P+1;
else
changer=-1*(func1(NextX)-func1(PreX))/T;
p1=exp(changer);
%接受较差的解
if p1>rand
PreX=NextX;
P=P+1;
end
end
trace(P+1)=func1(BestX);
end
deta=abs(func1(BestX)-func1(PreBestX));
end
disp('最小值在点:');
BestX
disp('最小值为:');
func1(BestX)
figure
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%适应度函数
function result =func1(x)
summ=sum(x.^2);
result=summ;
end
7.2
XMAX=5;%搜索变量x最大值
XMIN=-5;%搜索变量x最小值
YMAX=5;%搜索变量y最大值
YMIN=-5;%搜索变量y最小值
%冷却表参数
L=100;%马尔可夫链长度
K=0.99;%衰减参数
S=0.02;%步长因子
T=100;%初始温度
YZ=1e-8;%容差
P=0;%Metropolis过程中总接受点
%随机选点,初值设定
PreX=rand*(XMAX-XMIN)+XMIN;
PreY=rand*(XMAX-XMIN)+XMIN;
PreBestX=PreX;
PreBestY=PreY;
PreX=rand*(XMAX-XMIN)+XMIN;
PreY=rand*(XMAX-XMIN)+XMIN;
BestX=PreX;
BestY=PreY;
%每迭代一次退火一次,直到满足迭代条件为止
deta=abs(func2(BestX,BestY)-func2(PreBestX,PreBestY));
while (deta>YZ)&&(T>0.001)
T=K*T;
%在当前温度T下迭代次数
for i=1:L
%在此点附近随机选下一点
p=0;
while p==0
NextX=PreX+S*(rand*(XMAX-XMIN)+XMIN);
NextY=PreX+S*(rand*(XMAX-XMIN)+XMIN);
if(NextX>=XMIN&&NextX<=XMAX&&NextY>+...
YMIN&&NextY<=YMAX)
p=1;
end
end
%是否全局最优解
if (func2(BestX,BestY)>func2(NextX,NextY))
%保留上一个最优解
PreBestX=BestX;
PreBestY=BestY;
%此为新的最优解
BestX=NextX;
BestY=NextY;
end
%Metropolis过程
if(func2(PreX,PreY)-func2(NextX,NextY)>0)
%接受新解
PreX=NextX;
PreY=NextY;
P=P+1;
else
changer=-1*(func2(NextX,NextY)-func2(NextX,NextY))/T;
p1=exp(changer);
%接受较差的解
if p1>rand
PreX=NextX;
PreY=NextY;
P=P+1;
end
end
trace(P+1)=func2(BestX,BestY);
end
deta=abs(func2(BestX,BestY)-func2(PreBestX,PreBestY));
end
disp('最小值在点:')
BestX
BestY
disp('最小值为:')
func2(BestX,BestY)
plot(trace(2:end))
xlabel('迭代次数')
ylabel('目标函数值')
title('适配值进化曲线')
%适应度函数
function value=func2(x,y)
value=5*cos(x*y)+x*y+y*y*y;
end
7.3
clear all;
close all;
clc;
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
3238 1299; 4196 1044;4312 790;4386 570;3007 1970;2562 1756;...
2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...
3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
2370 2975];%31个省会的坐标
n=size(C,1);%TSP问题的规模,城市数目//此处返回C的行数
T=100*n;%初始温度
L=100;%马尔可夫链长度
K=0.99;%衰减参数
%城市坐标结构体
city=struct([]);
for i=1:n
city(i).x=C(i,1);
city(i).y=C(i,2);
end
l=1;%统计迭代次数
len(l)=func3(city,n);%每次迭代后的路线长度
figure(l);
while T>0.001%停止迭代温度
%多次迭代扰动,温度降低之前多次实验
for i=1:L
%计算原路线总距离
lenl=func3(city,n);
%产生随机扰动
%随机置换两个不同的城市坐标
p1=floor(1+n*rand());
p2=floor(1+n*rand());
while p1==p2
p1=floor(1+n*rand());
p2=floor(1+n*rand());
end
tmp_city=city;
tmp=tmp_city(p1);
tmp_city(p1)=tmp_city(p2);
tmp_city(p2)=tmp;
%计算新路线总距离
len2=func3(tmp_city,n);
%新老距离的差值,相当于能量
delta_e=len2-lenl;
%新路线好于旧路线,用新路线代替旧路线
if delta_e<0
city=tmp_city;
else
%以概率选择是否接受新解
if exp(-delta_e/T)>rand()
city=tmp_city;
end
end
end
l=l+1;
%计算新路线距离
len(l)=func3(city,n);
%温度不断下降
T=T*K;
for i=1:n-1
plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');
hold on;
end
plot([city(n).x,city(1).x],[city(n).y,city(1).y],'ro-');
title(['优化最短距离:',num2str(len(l))]);
hold off;
pause(0.005);
end
figure(2);
plot(len)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
%计算路线总长度
function len=func3(city,n)
len=0;
for i=1:n-1
len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);
end
len=len+sqrt((city(i).x-city(i+1).x)^2+(city(i).y-city(i+1).y)^2);
end
参考解释
深度学习 — 模拟退火算法详解(Simulated Annealing, SA)
详解模拟退火算法(含MATLAB代码)