模拟退火(SA,Simulated Annealing)
这是一种随机算法,其实模拟退火也算一种贪心算法。但是它在搜索过程中引入了随机因素。模拟退火算法以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解。
顺便说一下爬山算法:爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。
爬山算法的原理很简单,但是他很容易陷入进一个局部的最优解从而得不出想要的答案。
这里网上有一个非常好的关于爬山算法和模拟退火算法的比喻:
爬山算法:兔子朝着比现在高的地方跳去。它找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是爬山算法,它不能保证局部最优值就是全局最优值。
模拟退火:兔子喝醉了。它随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,它渐渐清醒了并朝最高方向跳去。这就是模拟退火。
当然,作为一种随机算法,模拟退火有可能不能每一次都正确的得到需要的最优值。。不过,在参数设置的合适的情况下,得到最优解的概率还是很高的。这种情况下,模拟退火的效率比穷举要高。所以,有时候还是要拼RP的。。。
而模拟退火在计算几何中的应用多是:求平面最近点对,最远点,多边形的费马点,等等。还可以结合其他算法对搜索进行优化,用的地方还是挺多的。
几道简单的模拟退火的题目:
POJ 1379 Run Away http://poj.org/problem?id=1379 POJ 2420 A Star not a Tree? http://poj.org/problem?id=2420 POJ 2069 Super Star http://poj.org/problem?id=2069