模拟退火算法
模拟退火 (Simulated Annealing): 它是一种通过模拟物理退 火过程搜索最优解的方法.
题目示例
旅行商问题(TSP): 假设有一个旅行商人要拜访 n 个城市, dij 表 示两城市间距离. xij为 0,1 变量, 表示拜访路径是否包函路径 dij.
**约束条件:**通过n个城市后最终回到起点
约
束
条
件
:
∑
i
=
0
n
x
i
j
=
∑
j
=
0
n
x
i
j
=
1
约束条件:\sum_{i=0}^n x_{ij} = \sum_{j=0}^nx_{ij}=1
约束条件:i=0∑nxij=j=0∑nxij=1
目标:
m
i
n
∑
i
≠
j
d
i
j
x
i
j
min \sum_{i\neq j}d_{ij}x_{ij}
mini=j∑dijxij
以第一个城市为始终点, 计算任意一条路径 [1, i2, · · · , in, 1] 的长度的基本运算为两两城市间距离求和, 基本操作次数为 n. 路径的条数为 (n−1)!. 求和运算的总次数为(n−1)!×n = n!.
若只通过枚举法求解:假设计算机每秒计算24个城市
城市数量 | 25 | 26 | 28 | 29 | 30 |
---|---|---|---|---|---|
计算时间 | 1s | 10m | 4.9d | 136.5d | 10.8y |
所以靠暴力枚举法求解,所花销的时间复杂度是难以忍受的,而使用模拟退火算法,收敛速度会更加能够接受
算法思想
通过模拟物理退火的过程,取不断的逼近最优解。物理退火是物体在高温状态,慢慢通过准静态过程降温,不断达到能量较小的状态。模拟退火的重点就是类似这个过程取趋近于目标函数的最优解的过程
与贪心算法的区别
**贪心算法:**贪心算法不断的尝试领域内的值,若在A点的左边或者右边出现较优解,就将当前最优解更新,若不存在,则当前值为最优解,最终会停在B点作为最优解
**模拟退火算法:**与贪心类似寻找邻域内是否存在更优解,是则更新解,或者满足一定的概率(类似玻尔兹曼分布)将邻域的值作为优解,所以模拟退火算法可以跳出当前局部优解得到D点为最优解
模拟退火与物理退火过程对应
模拟退火 | 物理退火 |
---|---|
解 | 粒子状态 |
目标函数 | 能量 |
最优解 | 能量最低状态 |
设定初温 | 加温过程 |
Metropolis采样 | 热平衡,粒子状态满足玻尔兹曼分布 |
控制参数下降 | 冷却 |
拟退火算法伪代码
initial solution x_0,x^current = x0 //初始化值
set initial temperature T = T_0
while temperature < T_k
for i to T_L
generate randomly a neighbouring solution x′ ∈ N(x^current)//随机产生邻域内的值
compute change of cost ∆C = C(x′) − C(x^current) //计算差值
f ∆C ≤ 0 or random(0, 1) < exp(−∆C^kT ) then
x^current = x′ //更新当前最优值
set new temperature T = decrease(T) //设置新的温度下降值
return solution
算法实现细节
初始解生成
- 通常使用随机解作为初始解,并保证此解是解空间中的一个解
临解生成函数
- 临解的生成京可能保证所产生的候选解能够遍布解空间
- 领域应该尽可能小,能够在少量循环中充分探测解分布,但值变化不应太大
初始温度
- 初始温度尽可能的高,以确保最终温度不受初始解的影响
- 均匀抽取样本值,选取方差作为初始温度
- 通过升温不断尝试增加温度
等温步数
- 等温步数也称 Metropolis 抽样稳定准则, 用于决定在各温度 下产生候选解的数目. 通常取决于解空间和邻域的大小.
- 等温目的使得系统平衡,目标函数的均值是否稳定
如何降温
-
经典降温算法
T ( t ) = T l o g ( 1 + t ) T(t) = \frac{T}{log(1+t)} T(t)=log(1+t)T -
快速降温
T ( t ) = T 0 1 + t T(t) = \frac{T_0}{1+t} T(t)=1+tT0 -
其他 其中 0.8 ≤ α ≤ 0.99
T ( t + Δ t ) = α T ( t ) T(t+\Delta t) = \alpha T(t) T(t+Δt)=αT(t)
花费函数
花费函数 COST 一般由目标函数来构造. 目标函数, 或目标 函数的倒数/相反数经常直接作为花费函数.
终止条件
- 理论上温度要降为 0 才终止退火算法. 但实际上温度较低时, 尝试的接受概率就几乎为 0 了
- 设置终止温度的阈值, 或设置外循环迭代次数.
- 算法搜索到的最优值连续若干步保持不变.