模拟退火算法(SA)
模拟退火是很经典的算法,针对大多数模型、应用,受限于SA运行时间长等特点,已不能直接应用SA,这样的算法值得去改进,我试图找一些缩短运行时间的方法,已经在测试,这里是模拟退火第一篇文章,介绍模拟退火,给出基础代码(经过多次测试,可直接运行)。
参考了https://blog.csdn.net/qq_34554039/article/details/90294046(该文介绍了模拟退火)
1.简介
模拟退火算法的思想:
借鉴于固体的退火过程,当固体的温度很高时,内能比较大,固体内的粒子处于快速无序运动状态,当温度慢慢降低,固体的内能减小,粒子逐渐趋于有序,最终固体处于常温状态,内能达到最小,此时粒子最为稳定。
思路:
一开始为算法设定一个较高的值T(模拟温度),算法不稳定,选择当前较差解的概率很大;随着T的减小,算法趋于稳定,选择较差解的概率减小,最后,T降至终止迭代的条件,得到近似最优解。
2.算法步骤
模拟退火算法,有很多文章进行了介绍,这里不赘述,算法思想也简单,看流程图一般就很清晰了。
其中,
代码(一个求函数极值的程序):
运行方式:全部复制保存到一个m文件中,直接运行
function main_fcn_extreme_value()T=1000;%初始化温度值
T_min=1e-12;%设置温度下界
alpha=0.98;%温度的下降率
k=1000;%迭代次数(解空间的大小)x=getX;%随机得到初始解
while(T>T_min)for I=1:kfx=Fx(x);x_new=getX;if(x_new>=-2&&x_new<=2)fx_new=Fx(x_new);delta=fx_new-fx;if(delta<0)x=x_new+(2*rand-1);elseP=getP(delta,T);if(P>rand)x=x_new;endendend
end
T=T*alpha;
end
disp('最优解为:')
disp(x)%%getX.m
function x=getX
x=4*rand-2;
end%%Fx.m
function fx=Fx(x)
fx=(x-2)^2+4;
end%%getP.m
function p=getP(c,t)
p=exp(-c/t);
end
end