模拟退火算法(Simulate Anneal,SA)是一种通用概率演算法,用来在一个大的搜寻空间内找寻命题的最优解。模拟退火是由S.Kirkpatrick, C.D.Gelatt和M.P.Vecchi在1983年所发明的。V.Černý在1985年也独立发明此演算法。模拟退火算法是解决TSP问题的有效方法之一。
模拟退火的出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法是一种通用的优化算法,其物理退火过程由加温过程、等温过程、冷却过程这三部分组成。——百度百科
- 核心:随机化,贪心
- 算法流程:随机一个新解,当新解比旧解更优时,选择新解,当新解比旧解劣时,以一定概率选择新解,每次随机新解后降一次温,最后当温度小于一个临界值时,退出退火过程,就有很大概率找到了最优解
就像这样
选择劣解的概率
这里的概率计算公式如下
(至于为什么,问S.Kirkpatrick, C.D.Gelatt,M.P.Vecchi和V.Černý去)
p = p= p= e d e t l a t e m p e r a t u r e {e}^{\frac{detla}{temperature}} etemperaturedetla
temperature指当前退到的温度,detla是新解与旧解的差(小于零)
易得此值随着温度的降低而渐渐趋近于1
于是在程序中,我们如果将得到劣解是否接受的判定条件设为
e d e t l a t e m p e r a t u r e {e}^{\frac{detla}{temperature}} etemperaturedetla>rand()/RAND_MAX
由于0<rand()/RAND_MAX<=1且概率均等,那么随着温度的降低,不等号左侧,为一个底数为e的指数函数,由于指数分子无限趋近于0,故整个指数函数趋近于1,右侧等于[0,1]的概率均等,故条件满足的可能性就越小,选择较劣解的可能性就越小
一些其他的参数问题
1.上文提到的
- T(temperature)
- detla=s现-s原
2.其他必要的
- eps(下限温度)
- D(降温速率)
对于参数的设置,我们可以尝试一下手动二分,由于T,D与运行时间成正比,eps与运行时间成反比,故可以调整这三个参数,使保证精度的同时保证时间上限