本算法建议谨慎使用,否则一不小心就会变成模拟退役

爬山算法

爬山算法是一种贪心搜索,每次从当前状态的所有后继状态中选择一个最优解继续搜索,直到达到一个局部最优解后不再搜索。

优点:好写

缺点:容易陷入局部最优解出不来

就像下图一样

多随机几个初始状态就能减小(不能消除)缺点

模拟退火

模拟退火来源于金属的冷却过程

先看看金属冷却:

温度高时,金属内能较大,原子活动范围大。

温度低时,金属内能较小,原子活动范围小。

我们搜索的时候也类似,设一个变量T,可以理解为金属冷却过程中的温度

T(温度)初始值很大,但是搜索过程中每走一步就乘上一个小于1的常数。

搜索过程中从当前状态随机搜索(这个随机的范围也和T有关)就能找到下一步可以走的一个状态,那走不走呢?这里给出一个策略:下一步可以走的一个状态如果比当前好就直接走,否则,T越大,选择走的概率越大。

要注意,上一句话中下一步可以走的一个状态可能会比当前状态好,也可能差。

通俗一点来说的话:

T比较大的时候,即使下一个状态会变坏,也会大概率转移

T比较小的时候,下一个状态会变坏的时候只会小概率转移,类似爬山算法

可以看最下面那个视频理解

为了保证正确性,可以多做几轮。

或者可以用上ctime,控制程序运行时间,卡题目时限,在规定时间多运行几次

就像下面这样

while(clock()<Time){}

注意不同的系统返回的时间的单位可能不同!

所以可以写成这样

while((DB)clock()/CLOCKS_PER_SEC<=多少秒){}

其中(DB)clock()/CLOCKS_PER_SEC是程序运行的时间,单位是秒


P1337 [JSOI2004]平衡点 / 吊打XXX 题解

P2538 [SCOI2008]城堡

在各种题目中都能用到,正确性不能保证,很少用作正解,但好的时候能媲美标算。

还有在各种提交答案题中都能用到

附:模拟退火可视化视频