模拟退火算法
一、概念
模拟退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis [1] 等人于1953年提出。1983 年,S. Kirkpatrick 等成功地将退火思想引入到组合优化领域。它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用,诸如VLSI、生产调度、控制工程、机器学习、神经网络、信号处理等领域。
模拟退火算法是通过赋予搜索过程一种时变且最终趋于零的概率突跳性,从而可有效避免陷入局部极小并最终趋于全局最优的串行结构的优化算法。
基于神经网络动态转移过程,状态掉进了局部最优解里了,就是能量函数没有达到最低,只是掉进了局部能量最低的状态,这和我们梯度容易获得局部最优解差不多,大家这样理解就好,想要深入理解的建议自己多参考文献。为了解决伪吸引子的问题,人们提出了模拟退火算法和玻尔兹曼机彻底解决了伪吸引子的问题。
模拟退火算法与初始值无关,算法求得的解与初始解状态S(是算法迭代的起点)无关;模拟退火算法具有渐近收敛性,已在理论上被证明是一种以概率收敛于全局最优解的全局优化算法;模拟退火算法具有并行性。
物理退火过程 :
- 加温过程——增强粒子的热运动,消除系统原先可能存在的非均匀态;
- 等温过程——对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态;
- 冷却过程——使粒子热运动减弱并渐趋有序,系统能量逐渐下降,从而得到低能的晶体结构。
热力学中的退火现象指物体逐渐降温时发生的物理现象:
温度越低,物体的能量状态越低,到达足够的低点时,液体开始冷凝与结晶,在结晶状态时,系统的能量状态最低。缓慢降温时,可达到最低能量状态;但如果快速降温,会导致不是最低能态的非晶形。
模仿自然界退火现象而得,利用了物理中固体物质的退火过程与一般优化问题的相似性从某一初温度开始,伴随温度的不断下降,结合概率突跳特性在解空间中随机寻找全局最优解。
组合优化问题 | 对应物理状态 |
---|---|
解 | 粒子状态 |
最优解 | 能量最低的状态 |
设定初温 | 溶解过程 |
Metropolis抽样过程 | 等温过程 |
控制参数的下降 | 冷却 |
目标函数 | 能量 |
模拟退火算法的计算步骤:
- 初始化,任选初始解
i
∈
S
i \in S
i∈S,给定初始温度
T
0
T_{0}
T0,终止温度
T
f
T_{f}
Tf,令迭代指标
k
=
0
,
T
k
=
T
0
k=0,T_{k}=T_{0}
k=0,Tk=T0。
选择时 T 0 T_{0} T0,要足够高,使 E i T k → 0 \frac{{{E_i}}}{{{T_k}}} \to 0 TkEi→0
初始化:初始温度T(充分大),初始解状态S(是算法迭代的起点),每个T值的迭代次数L循环由此开始,对k=1, …, L做第2至第步5 - 随机产生一个领域解, j ∈ N ( i ) j \in N(i) j∈N(i),(其中 N ( i ) N(i) N(i)表示i的领域)。计算目标值增量 Δ f = f ( j ) − f ( i ) Δf=f(j)-f(i) Δf=f(j)−f(i)
- 若
Δ
f
<
0
\Delta f<0
Δf<0,令
i
=
j
i=j
i=j转步 ④(j比i优秀无条件赋值)否则产生概率
e
−
Δ
f
T
k
{e^{\frac{{ - \Delta f}}{{{T_k}}}}}
eTk−Δf使得
e − Δ f T k = f ( j ) {e^{\frac{{ - \Delta f}}{{{T_k}}}}} = f(j) eTk−Δf=f(j)
这里实质上是当 T k T_{k} Tk高时,进行广域搜索; T k T_{k} Tk低时,局域搜索。 - 若达到热平衡(内循环次数大于 n ( T k ) n(T_{k}) n(Tk))时,转至步⑤,否则转步②。
-
k
=
k
+
1
k=k+1
k=k+1降低
T
k
T_{k}
Tk,若
T
k
<
T
f
T_{k}<T_{f}
Tk<Tf则停止否则转步②。
降低 T k T_{k} Tk的方法有以下两种:- 较好的方法 T k + 1 = T k ∗ r T_{k+1}=T_{k}*r Tk+1=Tk∗r,其中 r ∈ ( 0.95 , 0.99 ) r \in (0.95,0.99) r∈(0.95,0.99)。
-
T
k
+
1
=
T
k
−
Δ
T
T_{k+1}=T_{k}-\Delta T
Tk+1=Tk−ΔT
二、Python代码实现
给定函数 f ( x ) = x ⋅ s i n ( x ) , x ∈ [ 0 , 12.55 ] f(x)=x·sin(x),x \in[0,12.55] f(x)=x⋅sin(x),x∈[0,12.55],求函数在给定区域的最大值。
import numpy as np
# 自定义目标函数C
def C(s):
return 1 / (s * np.sin(s) + 12)
# 初始化
# 设定初始温度
# 函数原型:numpy.random.uniform(low,high,size)
# 从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
t0 = np.var(np.random.uniform(0, 12.55, 100))
# 设定初始解
s0 = np.random.uniform(0, 12.55, 1)
# 设定迭代次数
iters = 3000
# 设定终止条件,连续ct个新解都没有接受(ct/cn大于某个值)时终止算法
ct = 200
ct_array = []
# 保存历史最好的状态,默认取上边界值
best = 12.55
for t in range(1, iters + 1):
# 在s0附近,产生新解,但又能包含定义内的所有值
s1 = np.random.normal(s0, 2, 1)
while s1 < 0 or s1 > 12.55:
s1 = np.random.normal(s0, 2, 1)
# 计算能量增量
delta_t = C(s1) - C(s0)
if delta_t < 0:
s0 = s1
ct_array.append(1)
else:
p = np.exp(-delta_t / t0)
if np.random.uniform(0, 1) < p:
s0 = s1
ct_array.append(1)
else:
ct_array.append(0)
best = s0 if C(s0) < C(best) else best
# 更新温度
t0 = t0 / np.log(1 + t)
# 检查终止条件
if len(ct_array) > ct and np.sum(ct_array[-ct:]) == 0:
print("迭代 ", t, " 次,连续 ", ct, " 次没有接受新解,算法终止!")
break
# 状态最终停留位置
s0
# array([7.98092592])
# 最佳状态,即对应最优解的状态
best
# 迭代 363 次,连续 200 次没有接受新解,算法终止!
# array([7.98092592])
三、应用:
1、模拟退火算法在VLSI设计中的应用
利用模拟退火算法进行VLSI的最优设计,是目前模拟退火算法最成功的应用实例之一。用模拟退火算法几乎可以很好地完成所有优化的VLSI设计工作。如全局布线、布板、布局和逻辑最小化等等。
2、模拟退火算法在神经网计算机中的应用
模拟退火算法具有跳出局部最优陷阱的能力。在Boltzmann机中,即使系统落入了局部最优的陷阱,经过一段时间后,它还能再跳出来,再系统最终将往全局最优值的方向收敛。
3、模拟退火算法在图像处理中的应用
模拟退火算法可用来进行图像恢复等工作,即把一幅被污染的图像重新恢复成清晰的原图,滤掉其中被畸变的部分。因此它在图像处理方面的应用前景是广阔的。
4、模拟退火算法的其他应用
除了上述应用外,模拟退火算法还用于其它各种组合优化问题,如TSP和Knapsack问题等。大量的模拟实验表明,模拟退火算法在求解这些问题时能产生令人满意的近似最优解,而且所用的时间也不很长。