我们知道打铁匠,打铁的时候总是不断用水冷却铁器,最后打出来的铁就很坚实、锋利。这里的算法也是根据这个而来。
模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,整齐排列,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。
通俗点的说法:一个锅底凹凸不平有很多坑的大锅,如何晃动这个锅才能使得一个小球使其达到全局最低点。首先一开始就使劲晃,小球的变化也就比较大,如果掉到一个小坑里面也有几率掉出来,大趋势总是向底部滑下去。在趋于全局最低的时候慢慢减小晃锅的幅度,直到最后不晃锅,小球达到全局最低。
其他算法有时候经常就掉在小坑里出不来了,就是所谓的达到局部最小值。模拟退火算法的优点就是:就算达到局部最小值了,我也给你一个机会滑出来,如果你是全局最小值,就算滑出来了,最后也会滑进去的。
这个算法经常使用于旅行商问题(TSP):就是要拜访n个地点,怎么走的距离最短。
解题思想:计算每两个地点之间的距离,得到距离矩阵。先一通乱走,计算一下走的距离。然后微调一下走的路线,如果调整过后的路线距离变变短了,就以这个路线作为下一步的基础,然后继续调整。但是如果路线变长了,我也给你一个概率,作为下一步的基础。但是这个概率会随着步数的增加,慢慢变小。最后这个概率也会趋于0,距离调整也会达到最小值。
总之如果要途径每一个点,方式就是一个1到N的数字排序问题,如果排序是1、7、4、2、9、6.。。。。,那么距离就等于W17、W74、W42、。。。。。等等,也就是下面的公式:
根据总距离公式,计算距离。然后微调,比如改变序列中两个数字的排序,得到新样本,然后再计算距离。
直到达到距离的最小值。
matlab代码:私信回复 模拟退火算法
閱讀更多 科研IT生活 的文章