本文是偏应用的简要总结。
关于模拟退火的基础知识和具体代码,网上有很多,不重复写了。本文没有代码,而是展示一个实例中的代码运行产生的中间结果,用于辅助理解算法流程。
本文分为四个部分:
第一部分,算法简要流程
第二部分,简单实例,按照第一部分的流程整理的代码运行时的迭代过程
第三部分,关于算法的全局搜索和局部搜索的理解
第四部分,算法思路整理
1. 简要流程
Step 1. 产生一个初始解,作为当前解
(开始进入迭代,迭代环节为Step 2 ~ Step 3)
Step 2. 创建随机增量,添加到当前解上,产生一个新解
Step 3. 如果新解的目标函数值优于当前解的目标函数值,当前解更新为新解
否则,以概率接受当前解更新为新解
(当满足迭代终止条件时,跳出迭代环节,执行Step 4)
Step 4. 输出搜索到的最优解
2. 流程应用实例——求一元函数最小值
例子:求函数最小值
函数为y = (x-π)^2 + 20cos(x), x∈[-5,5]
最小值:取x=π时,目标函数最小值为-20
自定义:
等差降温
(算法里的每种操作都可以自由设计,而且设计方式非常多)
代码运行迭代过程:(按第一部分的流程整理标注)
Step 1. 初始化时
当前解:0.3029 对应目标函数值:27.1473
此时最优解:0.3029 对应目标函数值:27.1473
第一轮迭代:
温度值:100
Step 2. 创建的新解:-0.7255 新解的目标函数值:29.9173
Step 3. 新解的目标函数值劣于当前解的目标函数值,计算出新解的接受概率:0.9726
此时,接受新解为当前解了
当前解:-0.7255 对应目标函数值:29.9173
此时最优解:0.3029 对应目标函数值:27.1473
第二轮迭代:
温度值:99
Step 2. 创建的新解:1.3722 新解的目标函数值:7.0760
Step 3. 新解的目标函数值优于当前解的目标函数值,接受新解为当前解
当前解:1.3722 对应目标函数值:7.0760
此时最优解:1.3722 对应目标函数值:7.0760
第三轮迭代:
温度值:98
Step 2. 创建的新解:-0.2304 新解的目标函数值:30.8419
Step 3. 新解的目标函数值劣于当前解的目标函数值,计算出新解的接受概率:0.7846
此时,接受新解为当前解了
当前解:-0.2304 对应目标函数值:30.8419
此时最优解:1.3722 对应目标函数值:7.0760
迭代以此类推
3. 全局搜索 VS 局部搜索
全局搜索:理论上通过不断的随机变化得到的解也能覆盖全部的解空间
局部搜索:偏向于局部搜索,不断的把当前的一个解通过随机增量变化为新的解
4. 核心思路
搜索到比当前解好的解,一定接受,搜索到比当前解差的解,以一定的概率接受