现代优化算法属于启发式算法,包括:禁忌搜索、模拟退火、遗传算法、人工神经网络。它们都有一个共同的目标——求NP难组合优化问题的全局最优解。
1. 模拟退火算法
1.1 物理学中的退火过程
1.1.1 温度T下的状态转移
用粒子的能量定义材料的状态,Metropolis算法用一个简单的数学模型描述了退火过程。假设材料在状态i之下的能量为E(i),那么材料在温度T时从状态i进入了状态j遵循如下规律:
- 如果 E ( j ) ⩽ E ( i ) E(j)\leqslant E(i) E(j)⩽E(i),则接受该状态被装换。
- 如果 E ( j ) > E ( i ) E(j)>E(i) E(j)>E(i),则状态转换以如下概率被接受 e E ( i ) − E ( j ) K T e^{\frac{E(i)-E(j)}{KT}} eKTE(i)−E(j)式中,K为玻尔兹曼常数;T为材料温度。
1.1.2 温度T下平衡后的状态分布
在某一特定温度下,进行了充分的转换后,材料达到热平衡状态。此时材料处于状态i的概率满足玻尔兹曼分布
P
T
(
X
=
i
)
=
e
−
E
(
i
)
K
T
∑
j
∈
S
e
−
E
(
j
)
K
T
P_T(X=i)=\cfrac{e^{-\frac{E(i)}{KT}}}{\mathop{\sum}\limits_{j\in S}e^{-\frac{E(j)}{KT}}}
PT(X=i)=j∈S∑e−KTE(j)e−KTE(i)式中,X为材料当前状态的随机变量;S为状态空间集合。有
lim
T
→
∞
e
−
E
(
i
)
K
T
∑
j
∈
S
e
−
E
(
j
)
K
T
=
1
∣
S
∣
\lim_{T\to\infty}\cfrac{e^{-\frac{E(i)}{KT}}}{\mathop{\sum}\limits_{j\in S}e^{-\frac{E(j)}{KT}}}=\cfrac{1}{|S|}
T→∞limj∈S∑e−KTE(j)e−KTE(i)=∣S∣1式中,|S|为集合S中状态的数量。这表明所有状态在高温下具有相同的概率。当温度下降时
lim
T
→
0
e
−
E
(
i
)
−
E
min
K
T
∑
j
∈
S
e
−
E
(
j
)
−
E
min
K
T
=
{
1
∣
S
min
∣
,
i
∈
S
min
0
,
其
他
\lim_{T\to0}\cfrac{e^{-\frac{E(i)-E_{\min}}{KT}}}{\mathop{\sum}\limits_{j\in S}e^{-\frac{E(j)-E_{\min}}{KT}}}=\begin{cases}\cfrac{1}{|S_{\min}|},\ i\in S_{\min} \\\\ 0, 其他\end{cases}
T→0limj∈S∑e−KTE(j)−Emine−KTE(i)−Emin=⎩⎪⎪⎪⎨⎪⎪⎪⎧∣Smin∣1, i∈Smin0,其他式中,
E
min
=
min
j
∈
S
E
(
j
)
E_{\min}=\mathop{\min}\limits_{j\in S}E(j)
Emin=j∈SminE(j);
S
min
=
{
i
∣
E
(
i
)
=
E
min
}
S_{\min}=\left\{i|E(i)=E_{\min}\right\}
Smin={i∣E(i)=Emin}。上式表明当温度降至很低时,材料会以很大概率进入最小能量状态。
1.2 模拟退火寻找优化问题的最小值
1.2.1 优化问题模型
考虑一个组合优化问题:优化函数
f
:
x
∈
R
+
f:x\in \bm{R}^+
f:x∈R+,其中
x
∈
S
x\in S
x∈S,它表示优化问题的一个可行解,
R
+
=
{
y
∣
y
∈
R
,
y
⩾
0
}
\bm{R}^+=\left\{y|y\in \bm{R},y\geqslant0\right\}
R+={y∣y∈R,y⩾0},S表示函数的定义域。
N
(
x
)
⊆
S
N(x)\subseteq S
N(x)⊆S表示x的一个邻域集合。
1.2.2 优化问题的求解过程
首先给定一个初始温度
T
0
T_0
T0和该优化问题的一个初始解x(0),并由x(0)生成下一个解
x
′
∈
N
[
x
(
0
)
]
x'\in N[x(0)]
x′∈N[x(0)],是否接受
x
′
x'
x′作为一个新解x(1)依赖于如下概率
P
(
x
(
0
)
→
x
′
)
=
{
1
,
f
(
x
′
)
<
f
(
x
(
0
)
)
e
f
(
x
′
)
−
f
(
x
(
0
)
)
T
0
,
其
他
P(x(0)\to x')=\begin{cases}1,\ f(x')<f(x(0))\\e^{\frac{f(x')-f(x(0))}{T_0}},\ 其他\end{cases}
P(x(0)→x′)={1, f(x′)<f(x(0))eT0f(x′)−f(x(0)), 其他于是,对于某一个温度
T
i
T_i
Ti和该优化问题的一个解x(k),可以生成
x
′
x'
x′。接受
x
′
x'
x′作为下一个新解x(k+1)的概率为
P
(
x
(
k
)
→
x
′
)
=
{
1
,
f
(
x
′
)
<
f
(
x
(
k
)
)
e
f
(
x
′
)
−
f
(
x
(
k
)
)
T
i
,
其
他
P(x(k)\to x')=\begin{cases}1,\ f(x')<f(x(k))\\e^{\frac{f(x')-f(x(k))}{T_i}},\ 其他\end{cases}
P(x(k)→x′)={1, f(x′)<f(x(k))eTif(x′)−f(x(k)), 其他在温度
T
i
T_i
Ti下,经过多次转移后,降低温度,得到
T
i
+
1
<
T
i
T_{i+1}<T_i
Ti+1<Ti。在
T
i
+
1
T_{i+1}
Ti+1下重复上述过程。因此整个优化过程就是不断寻找新解和缓慢降温的交替过程。
1.2.3 平衡后的状态分布
在每个
T
i
T_i
Ti下,所得到的一个新状态x(k+1)完全依赖于前一个状态x(k),因此这是一个马尔科夫过程。使用马尔科夫过程对上述模拟退火的步骤进行分析,结果表明从任何一个状态x(k)生成
x
′
x'
x′的概率,在
N
[
x
(
k
)
]
N[x(k)]
N[x(k)]中使均匀分布的,且新状态
x
′
x'
x′被接受的概率满足上述公式,那么经过有限次的转换,在温度
T
i
T_i
Ti下的平衡态
x
i
x_i
xi的分布由下式给出
P
i
(
T
i
)
=
e
−
f
(
x
i
)
T
i
∑
j
∈
S
e
−
f
(
x
j
)
T
i
P_i(T_i)=\cfrac{e^{-\frac{f(x_i)}{T_i}}}{\mathop{\sum}\limits_{j\in S}e^{-\frac{f(x_j)}{T_i}}}
Pi(Ti)=j∈S∑e−Tif(xj)e−Tif(xi)当温度T降为0时,
x
i
x_i
xi的分布为
P
i
∗
=
{
1
∣
S
min
∣
,
x
i
∈
S
min
0
,
其
他
P_i^*=\begin{cases}\cfrac{1}{|S_{\min}|},\ x_i\in S_{\min} \\ 0, 其他\end{cases}
Pi∗=⎩⎨⎧∣Smin∣1, xi∈Smin0,其他其中
∑
x
i
∈
S
min
P
i
∗
=
1
\mathop{\sum}\limits_{x_i\in S_{\min}}P_i^*=1
xi∈Smin∑Pi∗=1。表明如果温度下降十分缓慢,在每个温度都有足够多次的状态转移,使之在每一个温度下达到热平衡,则全局最优解将以概率1倍找到。因此可以说模拟退火算法可以找到最优解。
1.2.4 模拟退火算法要注意的问题
- 理论上,降温过程要足够缓慢,使得在每一温度下达到热平衡。若降温速度过快,很可能得不到全局最优解。实际使用中要综合考虑解的性能和算法速度,在两者间折中。
- 要确定在每一温度下状态转换的结束准则。实际操作中可考虑当连续m次的转换过程没有使状态发生变化时结束该温度下的状态转换。最终的温度可提前定为一个较小的值 T c T_c Tc,或连续几个温度下转换过程没有使状态发生变化算法就结束。
- 选择初始温度和确定某个可行解的邻域的方法也要恰当。
1.3 模拟退火算法求解旅行商问题
- 确定解空间S:S包括固定起点和终点的所有循环排列集合。可先用蒙特克罗方法求得一个较好地初始解。
- 确定目标函数:目标函数为总路径长度。
- 产生新解的规则:利用改良圈算法每次修改2条边或3条边得到新解(新路径)。
- 计算新解与原解的目标函数之差 Δ f = f ( 新 ) − f ( 原 ) \Delta f=f(新)-f(原) Δf=f(新)−f(原),若 Δ f < 0 \Delta f<0 Δf<0则接受新解,若 Δ f ⩾ 0 \Delta f\geqslant0 Δf⩾0则以概率 exp ( − Δ f / T ) \exp(-\Delta f/T) exp(−Δf/T)接受新解, T 0 = 1 T_0=1 T0=1。
- 降温:利用选定的降温系数 α \alpha α进行降温,取新的温度为 α T \alpha T αT,可选 α = 0.999 \alpha=0.999 α=0.999。简单起见,每产生一个新解就降一次温。
- 确定结束条件:选定终止温度 e = 1 0 − 30 e=10^{-30} e=10−30,若 T < e T<e T<e,则算法结束,输出当前状态。
2. 遗传算法
2.1 遗传算法简介
遗传算法是一种基于自然选择原理和自然遗传机制的搜索算法,其实质是通过群体搜索技术,根据适者生存的原则逐代优化,最终得到最优解或准最优解。它必须做以下操作:初始群体的产生、求每一个个体的适应度、根据适者生存的原则选择优良个体、被选出的优良个体两两配对,通过随机交叉并随机变异产生下一代群体,按此方法使群体逐代进化,直到满足进化终止条件。其实现方法如下:
- 根据具体问题确定可行解域,确定一种编码方法,能用数值串或字符串表示可行解域的每一解。
- 对每一解应有一个度量好坏的依据,用适应度函数表示,一般由目标函数构成。
- 确定进化参数群体规模M、交叉概率 p c p_c pc、变异概率 p m p_m pm、进化终止条件。
为便于计算,一般每一代群体的个体数目都取相等。群体规模越大,越容易找到最优解,但计算时间也相应地增加。
2.2 遗传算法求解旅行商问题
- 设定算法参数:种群大小M;最大代数G;交叉率 p c p_c pc;变异率 p m p_m pm
- 指定编码策略:对于有N个地点的旅行商问题,产生N个0-1的随机数排列作为问题的编码(基因序列、染色体),随机数的升序编号即为地点编号
- 选取初始种群:可利用改良圈算法求得一个较好地初始种群,共有M个初始种群
- 设置目标函数:选取总路径长度为目标函数
- 交叉操作:使用单点交叉,即对两个父代个体 f 1 f_1 f1和 f 2 f_2 f2,随机选择第t个基因处为交叉点,一个父代的t前基因列与另一个父代的t后基因列连接生成子代个体。当交叉率为1时,共产生M个子代
- 变异操作:按照给定的变异率,对选定的变异个体,随机选择3个整数u,v,w,把u,v之间的基因段插到w后面
- 选择:将父代种群、子代种群、变异种群中目标函数最小的M个个体作为下一代,继续进化直至G代进化完成
2.3 改进的遗传算法
在传统的遗传算法结构中,变异操作在交叉操作基础上进行。改进后的遗传算法将变异操作从交叉操作中分离出来,使其成为独立的并列与交叉的寻优操作。在交叉操作中,以“门当户对”原则进行个体的配对,利用混沌序列确定交叉点,实行强度最弱的单点交叉,以确保算法收敛精度,削弱和避免寻优抖振问题;在变异操作中,利用混沌序列对染色体中多个基因进行变异,以避免算法早熟。
2.3.1 改进的交叉操作
以“门当户对”原则,对父代个体进行配对,即父代中目标函数值小的与小的配对,大的与大的配对。然后利用混沌序列确定交叉点的位置,最后对确定的交叉项进行交叉。
2.3.2 改进的变异操作
根据给定的变异率,随机选取两个在基因序列中的整数,对这两个数对应位置的基因进行变异,变异时利用混沌序列把这两个位置的基因换成新的基因值,得到新的基因序列。