模拟退火算法是一种启发式算法;关于启发式算法可以简单总结为下面两点:
1):任何有助于找到最优解,但不能保证最优解的方法均是启发式算法;
2):有助于加速求解过程和找到较优解的方法是启发式方法
另:爬山法是于模拟退火算法有着相似地方的启发式算法的一种,知道爬山法有助于理解模拟退火算法。
以一元函数找最值为例
a.在解空间随机生成初始解;
b.向左或向右邻域走一步(走的步数越小越好,但会增加计算量)
c.比较不同的走法下的目标函数的大小,并决定下一步往哪个方向走
d.不断重复这个步骤,直到找到一个极大值(极小值)或在定义域边缘,此时结束搜索
缺点:爬山算法实际是一种“眼光狭隘”的搜索算法(贪心算法—是一种算法思想)
模拟退火算法也称金属的冷却过程,其核心思想是:如果需要解决一个问题,我们使用迭代的方法解决;在每一步,我们都会在解决方案中进行小的更改。如果得到更好的解决方案,我们会始终接受;如果得到更差的解决方案,我们也(以一定的概率)期望它变好,但这种可能性随着时间而降低。(区别于爬山法)
例:求y=11sinx+7cos(5x)在[-3,3]内的最大值
旧的解:xi对应的函数值f(xi)
新的解:在xi附近随机找一个新的解xj,对应的函数值为f(xj)
(1):如果f(xj)>f(xi),则接受新解xj
(2):如果f(xj)<=f(xi),那么我们应该直接拒绝xj吗
答:不应该,如果拒接就是爬山法了
解决方法:为了不直接拒绝xj,我们定义一个接受xj的概率p,p位于[0,1]之间,且f(xj)和f(xi)越接近,p越大。即:
[注]p=0时=爬山法,p=1时=蒙特卡洛,(符号意思为 正比于)
由于,值域[0,1];所以我们可以假设
1 接受新解的概率p越大意味着在解空间中搜索范围越大,因为接受新解的概率p越大意味着我们的搜索更容易接受不好的解,相当于增加了我们的搜索范围。
2 假设我们将搜索过程看作一个“工序”,那么搜索前期我们搜索的范围应该尽量的大(避免陷入局部最优解),搜索后期我们搜索的范围应该尽量的小(更倾向于局部搜索)。
3 在寻找最优解过程中新解接受概率p应该也要随着时间变长而变小才合理;对于式子:
以此为例,我们的搜索过程(假设搜索最大值问题)可以用下面这个简单流程表示
(1) 随机生成一个解A,计算解A对应的目标函数f(A)
(2) 在A附近生成一个解B,计算B对应的目标函数f(B)
(3) 如果f(B)>f(A),则将B赋值给解A,然后重复上述步骤(爬山法思想)
如果f(B)<=f(A),那么接受B的概率Pt(上面公式),然后生成一个[0,1]之间的随机数r,如果r
这里的t在编程中怎么实现,可以看成我们迭代的次数。(循环)
问题1:优化问题有约束条件怎么办?
1.生成解B做一个判断2.增加罚函数,内生到目标函数
问题2:Ct怎么设置?
Ct的设置:模拟退火过程
退火是一种金属热处理工艺,指的是将金属缓慢加热到一定温度,保持足够时间,然后以适宜速度冷却。目的是降低硬度,改善切削加工性;降低残余应力,稳定尺寸,减少变形与裂纹倾向;细化晶粒,调整组织,消除组织缺陷。准确的说,退火是一种对材料的热处理工艺,包括金属材料、非金属材料。而且新材料的退火目的也与传统金属退火存在异同。
定义初始温度T0=100,温度下降公式为:
常取0.5到0.99之间,例如取0.95,那么t时刻温度:
其中Ct可以看作一个和时间相关的系数,因此在搜索过程中,我们接受新解的概率就和时间有关了,显然时间越长Ct越大。
问题3:什么时候停止搜索?
很多准则:1.达到指定的迭代次数,例如迭代500次;2.我们找到最优解连续M(例如30)次迭代都 没有变化。
问题4:怎么样在A附近随机生成一个新解B?
高效求解NP问题(如TSP问题,0-1背包问题) | 使用不当,可能会陷入局部最优 |
相较于其他非线性与优化算法,模拟退火算法编程工作量小且易实现 | 参数难以控制,所得结果可能接近最优解但并非最优解 |