模拟退火法是一种状态空间的局部搜索算法,它属于比较通用的寻找最优解的算法。
模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。
function Simulated-Annealing(problem, schedule) returns a solution state
inputs: problem, a problem schedule, a mapping from time to “temperature”
local variables: current, a node next, a node T, a “temperature” controlling prob. of downward steps
current←Make-Node(Initial-State[problem])
for t← 1 to ∞ do
T←schedule[t]
if T = 0 then return current
next←a randomly selected successor of current
ΔE←Value[next] – Value[current]
if ΔE > 0 then current←next
else current←next only with probability p
注:
①p = eΔE/T
模拟退火算法的主要优点之一就是能以一定的概率接受目标函数值不太好的状态, 这使得该算法即便落入局部最优的陷阱中,理论上经过足够长的时间也可以跳出局部最优
由模拟退火法的优势可以知道,模拟退火算法相对于爬山法来说,它可以从局部最优的陷阱中走出来,形象点说就是它可以“智能地下山”。从算法描述可以看出,该算法由一个概率决定该算法是否会选择”下山”, 这个概率就是p=eΔE/T, T为当前的温度,因此选择一个退火策略很重要。退火策略一般是设定一个温度初始值,然后根据实际情景设计迭代次数进行温度下降,当迭代满足次数时候,该算法就会终止。因此对于模拟退火法来说,合理设计一个初始温度值很重要,因为温度它影响着选择”下山”的概率,如果概率不合理,模拟退火算法可能从一个局部最优解走不出来,得不到全局最优解。
从google学术中找到关于模拟退火法的论文,它们多数都是优化退火策略的研究。其中一篇论文(作者是Hajek), 他提出要保证找到全局最优解所需要的迭代次数是很多的。在迭代的过程中,从一个状态i到一个状态j的转换概率可以表示如下:
Pij = Gij * Aij, 其中Gij是状态生成概率(generation probability), Aij是可接受概率(acceptance probability)
在这篇论文中, 作者给出了Aij的计算方法:
Aij = exp(−Ej−EiT) if Ej > Ei ,and Aij = 1 otherwise
通俗点讲,Aij就是eΔE/T
对于Gij, 假设状态生成概率是对称的(即Gij = Gji), 那么对于处于平衡状态的系统,我们就可以使用麦克斯韦-玻尔兹曼分布去描述:
其中,N(i)表示状态i附近的状态数目
根据Hajek的这篇论文,WALID BEN-AMEUR给出了一个对于在温度T下面计算状态转换可以接受的概率公式:
根据概率估计的方法,可以得出下面的公式:
有了可接受概率的近似估计公式之后,我们使用可接受概率的近似值替代复杂的可接受概率计算公式,从而简化初始温度值的计算复杂度。
计算模拟退火法温度值的方法
Step 1
(a)为了计算χˆ (T ) ,估算样本||s||的数目
(b)随机产生并存储||s||的正变换(正变换意思是说变换后的状态值要比变换前的状态值要大,即Δ E > 0)
(c)设定T1,T1是严格的正数,设置n=1(T1可能会比初始温度T0离得很远,但最后还是可以通过温度迭代的计算不断逼近T0)
Step 2
(a) 计算χˆ (Tn)
(b)If |χˆ(Tn)−χˆ(0)|≤ε return Tn(χˆ (0)是一开始定义的可接受概率,通过不断迭代,当χˆ (Tn)靠近χˆ (0)时候,则温度T1收敛到T0)
otherwise
-Tn+1 = Tn * χˆ (Tn)
-n = n + 1
-go to Step2 (a)
End
Computing the Initial Temperature of Simulated Annealing