浅析模拟退火算法及其MATLAB程序实现

浅析模拟退火算法及其MATLAB程序实现

前言

现代优化算法是 80 年代初兴起的启发式算法。这些算法包括禁忌搜索(tabusearch),模拟退火(simulated annealing),遗传算法(genetic algorithms),人工神经网络(neural networks)。它们主要用于解决大量的实际应用问题。目前,这些算法在理论和实际应用方面得到了较大的发展。无论这些算法是怎样产生的,它们有一个共同的目标-求 NP-hard 组合优化问题的全局最优解。虽然有这些目标,但 NP-hard 理论限制它们只能以启发式的算法去求解实际问题。

本文主要讨论的是 模 拟 退 火 ( s i m u l a t e d a n n e a l i n g ) \color{#00F}{模拟退火(simulated annealing)} 退simulatedannealing
算法参见:《数学建模算法与应用》

一、模拟退火的基本原理

材料统计力学中的退火现象

模拟退火算法得益于材料的统计力学的研究成果。统计力学表明材料中粒子的不同结构对应于粒子的不同能量水平。在高温条件下,粒子的能量较高,可以自由运动和重新排列。在低温条件下,粒子能量较低。如果从高温开始,非常缓慢地降温(这个过程被称为退火),粒子就可以在每个温度下达到热平衡。当系统完全被冷却时,最终形成处于低能状态的晶体。如果用粒子的能量定义材料的状态,Metropolis 算法用一个简单的数学模型描述了退火过程。假设材料在状态i 之下的能量为 E(i) ,那么材料在温度T 时从状态i 进入状态 j 就遵循如下规律:
(1)如果 E ( j ) ≤ E ( i ) , 接 受 该 状 态 被 转 换 。 ( 2 ) 如 果 E ( j ) > E ( i ) E( j) \leq E(i) ,接受该状态被转换。 (2)如果 E( j) > E(i) E(j)E(i)2E(j)>E(i) ,则状态转换以如下概率被接受: e E ( i ) − E ( j ) K T e^{\frac{E(i)-E(j)}{KT}} eKTE(i)E(j)

其中 K 是物理学中的波尔兹曼常数,T 是材料温度
概括来说,该物理现象的实质为:温度越高(即能量较高),系统越不稳定:温度越低(即能量较低),系统越稳定。
我们可以考虑如下极限问题:当温度降至很低时,材料会以很大概率进入最小能量状态(该结论有详细的理论推导,参见随机数学)。假定我们要解决的问题是一个寻找最小值的优化问题。将物理学中模拟退火的思想应用于优化问题就可以得到模拟退火寻优方法。

模拟退火

事实上,系统的能量常常形象为数学建模中一个 目 标 函 数 f ( x ) \color{#00F}{目标函数}f(x) f(x),比如:成本路程收益 … … \ldots\ldots
在对目标函数进行模拟退火之后,可以得到问题的优化解 x m i n \color{#00F}{x_{min}} xmin
通过对比材料统计力学中的模拟退火现象,我们可以得到模拟退火算法的如下规律:

(1)如果 f ( x i ) ≤ f ( x j ) , 接 受 该 状 态 被 转 换 。 ( 2 ) 如 果 f ( x j ) > f ( x i ) f(x _i) \leq f(x_j ),接受该状态被转换。 (2)如果 f(x_ j) > f(x_i) f(xi)f(xj)2f(xj)>f(xi) ,则状态转换以如下概率被接受: e f ( x i ) − f ( x j ) K T e^{\frac{f(x_i)-f(x_j)}{KT}} eKTf(xi)f(xj)
这里将以最优路径为例详细介绍模拟退火法的具体步骤(有关图论问题,请参阅图论(一)基本概念

( 1 ) (1) 1组装邻接矩阵D

D = ( d 11 d 12 d 13 ⋯ d 1 n d 21 d 22 d 23 ⋯ d 2 n ⋮ ⋮ ⋮ ⋱ ⋮ d m 1 d m 2 d m 3 ⋯ d m n ) D=\begin{pmatrix} d_{1 1}& d_{12} & d_{1 3}& \cdots & d_{1n} \\ d_{2 1}& d_{2 2} & d_{2 3}& \cdots & d_{2n }\\ \vdots & \vdots & \vdots & \ddots & \vdots \\ d_{m1}& d_{m2} & d_{m 3} & \cdots & d_{m n}\\ \end{pmatrix} D=d11d21dm1d12d22dm2d13d23dm3d1nd2ndmn
其中 d i , j d_{i,j} di,j表示从 2 ⇒ 3 2\Rightarrow3 23的距离。关于邻接矩阵,请参见邻接矩阵

( 2 ) (2) 2解空间

解空间 S S S可表示为 S = { ( π 1 , ⋯   , π n ) ∣ π 1 = 1 , ( π 2 , ⋯   , π n − 1 ) , π n } S=\lbrace(\pi_1,\cdots,\pi_n)\lvert\pi_1=1,(\pi_2,\cdots,\pi_{n-1}),\pi_n\rbrace S={(π1,,πn)π1=1,(π2,,πn1)πn}其中 ( π 2 , ⋯   , π n − 1 ) (\pi_2,\cdots,\pi_{n-1}) (π2,,πn1)为节点 2 , 3 , ⋯   , n − 1 2,3,\cdots,n-1 2,3,,n1的随机组合,这里我们采用 ( π 1 , ⋯   , π n ) \color{#00F}{(\pi_1,\cdots,\pi_n)} (π1,,πn)的初始路径顺序 π 1 ⋯ π u − 1 π u π u + 1 ⋯ π v − 1 π v π v + 1 ⋯ π n (1) \pi_1\cdots\pi_{u-1}\pi_u\pi_{u+1}\cdots\pi_{v-1}\pi_v\pi_{v+1}\cdots\pi_n\tag{1} π1πu1πuπu+1πv1πvπv+1πn(1)

( 3 ) (3) 3目标函数

f ( x ) = d m i n ( f ( π 1 , π 2   ⋯   , π n ) ) f(x)=d_{min}( f(\pi_1,\pi_2\,\cdots,\pi_n)) f(x)=dmin(f(π1,π2,πn))

( 4 ) (4) 4新解的产生

这里采用的是 2 2 2变换法:任选序号 u , v u,v u,v,交换 u u u v v v之间的顺序,变成 逆 序 \color{#F00}{逆序} ,此时新路径为:
π 1 ⋯ π u − 1 π v π v − 1 ⋯ π u + 1 π u π v + 1 ⋯ π n (2) \pi_1\cdots\pi_{u-1}\pi_v\pi_{v-1}\cdots\pi_{u+1}\pi_u\pi_{v+1}\cdots\pi_n\tag{2} π1πu1πvπv1πu+1πuπv+1πn(2)

( 5 ) (5) 5代价函数差

δ f = f ( x i ) − f ( x j ) = ( d π u − 1 π v + d π u π v + 1 ) − ( d π u − 1 π u + d π v π v + 1 ) (3) \delta f=f(x_i)-f(x_j)=(d_{\pi_{u-1}\pi_{v}}+d_{\pi_{u}\pi_{v+1}})-(d_{\pi_{u-1}\pi_{u}}+d_{\pi_{v}\pi_{v+1}})\tag{3} δf=f(xi)f(xj)=(dπu1πv+dπuπv+1)(dπu1πu+dπvπv+1)(3)

( 6 ) (6) 6接受准则

P = { 1 , δ f < 0 e δ f K T , δ f > 0 (4) P= \begin{cases} 1, & \text{$\delta f <0$} \\[2ex] e^{\frac{\delta f}{KT}}, & \text{$\delta f >0$} \\ \end{cases} \tag{4} P=1,eKTδf,δf<0δf>0(4)

( 6 ) (6) 6降温

T = α T (5) T= \alpha T\tag{5} T=αT(5)

( 7 ) (7) 7终止条件

理论上, lim ⁡ T → − ∞ \lim_{T \to -\infty} \quad Tlim时,系统将有且仅有 一 个 最 优 解 \color{#00F}{一个最优解} ,但实际上不可能有这种情况,于是将限定一个 e e e,使 T < e T<e T<e时跳出循环,得到一个相对最优解 x m i n x_{min} xmin

Created with Raphaël 2.2.0 开始 降温 T<e? 结束 yes no

二、MATLAB程序实现

1.组装邻接矩阵

代码如下(示例):

clear
sj=load('Desktop\数据2.txt');
sj=[sj,sj(:,1)]';
n=size(sj,1);
% x=sj0(:,[1:2:8]);x=x(:);
% y=sj0(:,[2:2:8]);y=y(:);
% sj=[70,40;x,y;70,40];%[70,40]为起点和终点坐标
% sj=sj*pi/180;
path=[1:n,1];%路径初始化
long=0;%距离初始化
d=zeros(n);%邻接矩阵初始化
for i=1:n-1
    for j=i+1:n
%         d(i,j)=6370*acos(cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2)));
        d(i,j)=sqrt((sj(i,1)-sj(j,1))^2+(sj(i,2)-sj(j,2))^2);
    end
end
d=d+d';%获得邻接矩阵(对称阵)

2.退火与新解产生

代码如下(示例):

T=1;e=0.1^300;dt=0.99;
while T>e
% c=sort(2+floor(100*rand(1,2)));
c=sort(2+floor((n-2)*rand(1,2)));
df=d(path(c(1)-1),path(c(2)))+d(path(c(1)),path(c(2)+1))-d(path(c(1)-1),path(c(1)))-d(path(c(2)),path(c(2)+1));
if df<0
    path=[path(1:c(1)-1),path(sort(c(1):c(2),'descend')),path(c(2)+1:n)];
elseif rand<=exp(-df/T)
     path=[path(1:c(1)-1),path(sort(c(1):c(2),'descend')),path(c(2)+1:n)];
end
T=T*dt;
end
for i=1:n-1
    long=long+d(path(i),path(i+1));
 end
 GreatX=sj(path,1);
 GreatY=sj(path,2);
 plot(GreatX,GreatY,'-*');
 path
 long
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值