模拟退火算法(simulated annealing,SA)是一种概率算法,用来在一个大的搜索空间内找到命题的最优解。
模拟退火是来自冶金学的专有名词退火。退火是将材料加热后再经冷却,使得增大晶粒的体积,并减少晶格的缺陷。
模拟退火的思想
模拟退火是一种贪心算法,但在搜索过程中加入了随机因素,即在一定的概率下接受一个比当前解要差的解,这样就可能跳出局部最优解,可以证明,模拟退火以概率达到全局最优解。
模拟退火算法过程
模拟退火算法中最重要的一步就是怎样才是接受一个比当前解要差的解。
若
J
(
y
(
i
+
1
)
)
−
J
(
y
(
i
)
)
<
0
J(y(i+1))-J(y(i)) < 0
J(y(i+1))−J(y(i))<0(
J
J
J为评价函数)则总是接受该移动,因为移动之后能量降低了。
若
J
(
y
(
i
+
1
)
)
−
J
(
y
(
i
)
)
>
0
J(y(i+1))-J(y(i)) > 0
J(y(i+1))−J(y(i))>0(移动之后能量没有降低,反而升高了),则以一定的概率接受该移动。那么,根据热力学原理,当温度为
T
T
T时,出现能量差为
△
E
\triangle E
△E的降温概率为
p
(
△
E
)
p(\triangle E)
p(△E),表示为:
p
(
△
E
)
=
e
x
p
(
−
△
E
/
(
k
T
)
)
p(\triangle E)=exp(-\triangle E/(kT))
p(△E)=exp(−△E/(kT))
其中,
k
k
k为常数,
e
x
p
exp
exp为自然对数。也就是说,温度越高,出现能量降低的概率就越大。因为
−
△
E
/
(
k
T
)
<
0
-\triangle E/(kT)<0
−△E/(kT)<0,所以
p
(
△
E
)
p(\triangle E)
p(△E)范围在
(
0
,
1
)
(0,1)
(0,1)之内。这样,就以这个概率来接受比原解要差的解。
伪代码
#J(y):在状态y时的评价函数值
#y(i):表示当前状态
#y(i+1):表示新的状态
#r:用于降温的快慢
#T:系统的温度,初始温度应处于一个高温状态
#T_min:温度下限,搜索的停止条件
while(T>T_min):
dE = J(y(i+1))-J(y(i))
if (dE <= 0): #表示移动后得到更优解,总接受该移动
y(i+1) = y(i)
else:
if (exp(-dE/T) > random(0,1)) #如果接受概率比随机产生的(0,1)之间的概率要大
y(i+1)=y(i)#则接受移动
T = r * T #进行降温,0<r<1,r越大降温越慢,越小,降温越快。
i = i + 1
算法的优缺点
优点:计算过程简单,通用,鲁棒性强,适用于并行处理,可用于求解复杂的非线性优化问题
缺点:收敛速度慢,执行时间长,算法性能与初始值有关及参数敏感等缺点
经典模拟退火算法的缺点:
- 如果降温过程足够缓慢(即r过大),多得到的解的性能会比较好,但与此相对的
是收敛速度太慢; - 如果降温过程过快(即r过小),很可能得不到全局最优解。
#算法的改进
(1) 设计合适的状态产生函数,使其根据搜索进程的需要
表现出状态的全空间分散性或局部区域性。
(2) 设计高效的退火策略。
(3) 避免状态的迂回搜索。
(4) 采用并行搜索结构。
(5) 为避免陷入局部极小,改进对温度的控制方式
(6) 选择合适的初始状态。
(7) 设计合适的算法终止准则。
也可通过增加某些环节而实现对模拟退火算法的改进。主要的改
进方式包括:
(1) 增加升温或重升温过程。在算法进程的适当时机,将温度适当提
高,从而可激活各状态的接受概率,以调整搜索进程中的当前状
态,避免算法在局部极小解处停滞不前。
(2) 增加记忆功能。为避免搜索过程中由于执行概率接受环节而遗失
当前遇到的最优解,可通过增加存储环节,将一些在这之前好的态记忆下来。
(3) 增加补充搜索过程。即在退火过程结束后,以搜索到的最优解为
初始状态,再次执行模拟退火过程或局部性搜索。
(4) 对每一当前状态,采用多次搜索策略,以概率接受区域内的最优
状态,而非标准SA的单次比较方式。
(5) 结合其他搜索机制的算法,如遗传算法、混沌搜索等。
(6)上述各方法的综合应用。