现代优化算法是 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),接受该状态被转换。(2)如果E(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),接受该状态被转换。(2)如果f(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)
这里将以最优路径为例详细介绍模拟退火法的具体步骤(有关图论问题,请参阅图论(一)基本概念:
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=⎝⎜⎜⎜⎛d11d21⋮dm1d12d22⋮dm2d13d23⋮dm3⋯⋯⋱⋯d1nd2n⋮dmn⎠⎟⎟⎟⎞
其中 d i , j d_{i,j} di,j表示从 2 ⇒ 3 2\Rightarrow3 2⇒3的距离。关于邻接矩阵,请参见邻接矩阵。
解空间 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,⋯,πn−1),πn}其中 ( π 2 , ⋯ , π n − 1 ) (\pi_2,\cdots,\pi_{n-1}) (π2,⋯,πn−1)为节点 2 , 3 , ⋯ , n − 1 2,3,\cdots,n-1 2,3,⋯,n−1的随机组合,这里我们采用 ( π 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⋯πu−1πuπu+1⋯πv−1πvπv+1⋯πn(1)
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))
这里采用的是 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⋯πu−1πvπv−1⋯πu+1πuπv+1⋯πn(2)
δ 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πu−1πv+dπuπv+1)−(dπu−1πu+dπvπv+1)(3)
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)
T = α T (5) T= \alpha T\tag{5} T=αT(5)
理论上, lim T → − ∞ \lim_{T \to -\infty} \quad T→−∞lim时,系统将有且仅有 一 个 最 优 解 \color{#00F}{一个最优解} 一个最优解,但实际上不可能有这种情况,于是将限定一个 e e e,使 T < e T
代码如下(示例):
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';%获得邻接矩阵(对称阵)
代码如下(示例):
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