\(1.\) 作用
找到函数的极值。
\(2.\) 原理
为了解决这一问题,科学家们想到了物理的退火降温的过程——
一个处于很高温度的物体,现在要给它降温,使物体内能降到最低。
我们常规的思维是,越快越好,让它的温度迅速地降低。
然而,实际上,过快地降温使得物体来不及有序地收缩,难以形成结晶。而结晶态,才是物体真正内能降到最低的形态。
正确的做法,是徐徐降温,也就是退火,才能使得物体的每一个粒子都有足够的时间找到自己的最佳位置并紧密有序地排列。开始温度高的时候,粒子活跃地运动并逐渐找到一个合适的状态。在这过程中温度也会越降越低,温度低下来了,那么粒子也渐渐稳定下来,相较于以前不那么活跃了。这时候就可以慢慢形成最终稳定的结晶态了。
那么,我们可不可以把找到最优解,与形成结晶态,这两个过程联系在一起呢?
于是,模拟退火诞生了
\(3.\) 步骤
若 \(f_{now} ? f_{Max}\) 直接接受。
若 \(f_{now} ¿ f_{Max}\) 在 \(e^{\dfrac{-|f_{now}-f_{Max}|}{T}}\) 的概率内通过。
?根据题目来,¿表示与?相反的运算符。
\(4.\) 代码
一种不需要脑子的判断。
能直接接受就直接接受。
不行的话若满足 if (exp(-fabs(Delta) / t) >= (double)rand()/RAND_MAX) ...
就接受