模拟退火+爬山算法

转载:https://blog.csdn.net/niiick/article/details/82708589
爬山算法(Hill Climbing)
学习模拟退火前了解爬山算法是非常必要的

爬山算法依照一个很简单的贪心思路
每次在当前作为最优解的点附近随机一个新的点
比较这个新的点是否比当前更优,若是则更新

这个算法有一个比较明显的缺点,例如下图

我们想要的最终答案是A
但若当前记录的最优解是B
局部最优解B附近谷底的点又显然不能作为更优解更新答案

所以爬山算法最终得到的将有可能只是局部最优解

在这里插入图片描述
模拟退火(SA——Simulated Annealing)
为了解决上述爬山算法的不足
模拟退火算法应用了以一定概率接受一个非更优解的思路

加入当前记录的最优解为B
随机到的下一个点为C
爬山算法直接否定了这个点,但模拟退火决定以一定概率去接受
这样得到最终全局最优解A的概率就大大增加

在这里插入图片描述
关于如何确定接受概率,就应用到了金属退火原理

在温度为T TT的情况下
出现一次能量差为ΔE \Delta EΔE的降温的概率为P(ΔE)=eΔEk∗T P(\Delta E)=e^{\frac{\Delta E}{k*T}}P(ΔE)=e
k∗T
ΔE

这个要如何应用到OI中呢
我们设定一个初始温度T0 T_0T
0

和最小温度Tmin T_{min}T
min

,以及降温系数delta deltadelta
每次降温就是令T∗=delta T*=deltaT∗=delta
当温度下降到Tmin T_{min}T
min

时算法结束

假设在温度T TT时记录的最优解为F(x) F(x)F(x)
随机一个x xx附近的点x1 x_1x
1

并计算他的函数值F(x1) F(x_1)F(x
1

)
他们的差作为退火的能量差,即ΔE=F(x1)−F(x) \Delta E=F(x_1)-F(x)ΔE=F(x
1

)−F(x)
若ΔE>=0 \Delta E>=0ΔE>=0,说明这个新的点更优,直接更新
若ΔE<0 \Delta E<0ΔE<0,我们就以P(ΔE) P(\Delta E)P(ΔE)的概率接受这个非更优解

因为ΔE<0 \Delta E<0ΔE<0,所以P(ΔE) P(\Delta E)P(ΔE)的取值范围是(0,1) (0,1)(0,1)
显然温度T TT越小,接受的概率也越小

下面是模拟退火的伪代码

/*
F(x)在状态x时的评价函数值
x , nx 当前状态 与 新的状态 
delta: 用于控制降温的快慢
T: 系统的温度,系统初始应该要处于一个高温的状态
T_0 , T_min :初始温度 与 温度的下限,当温度T从T_0降温到T_min,算法结束
*/
T=T_0
while(T>T_min)
{
  nx=RADN(x);//在当前状态x附近随机一个新的状态 
	dE=F(nx)-F(x); //能量差 

  if(dE>=0) x=nx;//直接接受更优的移动 
  else if( exp( dE/T ) > random(0,1) ) x=nx;//以一定概率接受非更优的移动 
	//(exp是c++库函数) exp( dE/T )随温度降低而减小 ,好像exp(F(nx)<random(0,1)也是可以的,
//poj1379:https://blog.csdn.net/c___c18/article/details/86543013
//poj2420:https://blog.csdn.net/c___c18/article/details/86515348
  T=T*delta; //降温退火 ,0<delta<1 

	//delta越大,降温越慢, 反之delta越小,降温越快
	//若delta过大,则搜索到全局最优解的可能会较高,但搜索的过程也就较长。
	//若delta过小,则搜索的过程会很快,但最终可能会达到一个局部最优值
}

这板子可以用在HDU2899里面
要注意接受非更优解时只是接受点的移动,当前记录最优解的值不用更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值