模拟退火算法是一种通用的概率算法,用于在一个大的搜寻空间内寻找问题的最优解。这种思想来源于物理中固体退火的过程,即将固体加热到足够的温度的时候,再缓慢冷却。温度升高时候,固体内部粒子随着温度升高变为无序状态,内能增大,而缓慢冷却的时候粒子却又逐渐趋近于有序状态。实际上这一思想是在一个过程中寻求系统能量最小的一种算法方式,在任意温度下,系统的能量都可以达到热平衡状态,而冷却到最低温度的时候是系统能量最低的状态。在任意一个温度下都可以达到热平衡状态,这是一个重要的步骤,可以由Monte Carlo模拟,但是这需要大量采样处理,工作量非常大。Metropolis提出这样的一种采样的方法,即设从当前的状态 i i i生成新的状态 j j j,如果新状态的内能小于状态 i i i,( E j < E i E_{j}
物理退火算法由以下三个过程组成:
算法中需要控制的参数有:
① 令 T = T 0 T=T_{0} T=T0,即开始退火的最初始温度,随机生成一个初始解 x 0 x_{0} x0,并且计算相应的目标函数值 E ( x 0 ) E(x_{0}) E(x0)。
② 令 T T T等于下一个冷却进度表中的值 T i T_{i} Ti。
③ 根据当前解 x i x_{i} xi进行扰动,并产生一个新的解 x j x_{j} xj,计算相应的目标函数值 E ( x j ) E(x_{j}) E(xj),得到 Δ E = E ( x j ) − E ( x i ) \Delta E=E(x_{j})-E(x_{i}) ΔE=E(xj)−E(xi)。
④ 若 Δ E < 0 \Delta E<0 ΔE<0,那么新的解 x j x_{j} xj被接受并作为当前状态的新的解;若 Δ > 0 \Delta>0 Δ>0,那么新的解 x j x_{j} xj按照概率 e x p ( − Δ E T i ) exp(-\frac{\Delta E}{T_{i}}) exp(−TiΔE)接受, T i T_{i} Ti为当前温度。
⑤ 判断 T T T是否已经达到 T f T_{f} Tf。若是则停止算法,否则继续执行步骤②。
控制参数 T T T的初始值 T 0 T_{0} T0:一般意义上来说,对于退火算法都采用大范围下的粗略搜索与局部的精细搜索相结合来搜索全局最小值,所以足够大的 T 0 T_{0} T0才能满足算法的条件,但是对于不同问题有不同的取值。
控制温度 T T T的衰减函数:一般有多种控制温度 T T T的衰减函数,常用的衰减函数可以表示为
T k + 1 = α T k , k = 0 , 1 , 2 , . . . T_{k+1}=\alpha T_{k},k=0,1,2,... Tk+1=αTk,k=0,1,2,...
其中 α \alpha α是衰减常数,一般取值为 α = 0.5 ∼ 0.99 \alpha=0.5\sim 0.99 α=0.5∼0.99之间,这个常数决定了降温的过程。
Markov链选取的长度:Markov链选取的原则是:在控制参数 T T T的衰减函数已经选定的情况下, L k L_{k} Lk应当能够使得在控制参数 T T T的每一取值上达到平衡状态。
退火算法应用的场景有很多,我们现在对TSP问题、聚类问题以及在神经网络中的一些应用来进行探讨和分析。
TSP是最为典型的NP完全问题,即最坏情况下的时间复杂度随着问题规模的增大按照指数方式增长,目前来说并没有找到一种多项式时间内最有效的算法。
TSP问题可以描述为:已知 n n n个城市坐标信息,某一个旅行商从某个城市出发访问每个城市一次并且仅访问一次,最后回到出发的城市,如何安排使得其行走的路线最短。TSP问题的解空间是所有遍历 n n n个城市的路径,设城市的集合为 X = { 1 , 2 , . . , n } X=\{1,2,..,n\} X={1,2,..,n}, X X X中的元素表示对 n n n个城市的编号,其问题是寻求一个 n n n个城市的排列 π ( X ) = { V 1 , V 2 , . . . , V n } \pi(X)=\{V_{1},V_{2},...,V_{n}\} π(X)={V1,V2,...,Vn},使得代价函数:
S d = ∑ i = 1 n − 1 d ( V i , V i + 1 ) + d ( V n , V 1 ) S_{d}=\sum_{i=1}^{n-1}d(V_{i},V_{i+1})+d(V_{n},V_{1}) Sd=i=1∑n−1d(Vi,Vi+1)+d(Vn,V1)
取得最小值,其中 d ( V i , V i + 1 ) d(V_{i},V_{i+1}) d(Vi,Vi+1)表示城市之间的距离。
TSP问题中,新的解产生主要是通过以下两种方式来产生:
① 二变换方法:任意选取序号 u , v , ( u < v < n ) u,v,(u
② 三变换方法:任意选取序号 u , v , w , ( u ≤ v < w ) u,v,w,(u\leq v
目标函数差值:新求解的解与当前解的差值 Δ S = S d − S ′ d \Delta S=S_{d}-S{'}_{d} ΔS=Sd−S′d
Metropolis准则:以新的解与当前解的目标函数差定义接受概率,即
p = { 1 , Δ S e x p ( − Δ S T ) , Δ S > 0 p=\begin{cases} 1&,\Delta S\\ exp(-\frac{\Delta S}{T})&,\Delta S>0 \end{cases} p={1exp(−TΔS),ΔS,ΔS>0
我们选取这里的TSP问题数据集:TSP问题数据集。在本文中我们选取kroA200.tsp进行求解。
经过退火算法的计算之后,最优路径如下图所示:
退火算法中最短路径长度的求解在每一次迭代中的长度变化如下所示:
具体代码参见笔者github,退火模型有python版本和MATLAB版本。
模拟退火算法是一类以统计力学为基础的概率算法,通过求解系统能量最小的办法来在每一个Markov链中搜寻最优值。模拟退火算法具有较强的全局搜索能力,但是非常需要一些问题的经验和算法的实践过程。模拟退火算法非常适用于解决组合优化的问题,即目标针对有很多可能解的有限离散系统,最小化它的代价函数。上述算法中的能量分布解释称为数值意义上的代价函数,温度 T T T成为了控制参数。
模拟退火算法与传统的迭代算法是有些不同点的:
[1] MATLAB在数学建模中的应用,卓金武
[2] MATLAB智能算法30个案例分析(第2版)
[3] 神经网络与机器学习,Simon Haykin