学习基于Java的模拟退火算法
前言
智能优化方法通常包括进化计算和群智能等两大类方法,是一种典型的元启发式随机优化方法,已经广泛应用于组合优化、机器学习、智能控制、模式识别、规划设计、网络安全等领域,是21世纪有关智能计算中的重要技术之一。
以上描述出自山东大学陈竹敏教授的课件第6章 智能计算及其应用
在之前的博客里,初步学习了群智能算法,详情见:学习基于Java的高斯分布逃逸的粒子群算法。本篇,就来了解下另一类方法:进化算法。说到进化算法,典型代表就是遗传算法与模拟退火算法,下面就让我们学习下模拟退火算法
模拟退火算法
简要介绍
模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。
以上出自百度百科对于《模拟退火算法》的解释。
算法主要涉及以下原理
- 固体退火原理
- Metropolis接受准则
首先是固体退火原理,其主要由三个过程组成
- 加温过程:增强粒子的热运动,消除系统原先可能存在的非均匀态;
- 等温过程:对于与环境换热而温度不变的封闭系统,系统状态的自发变化总是朝自由能减少的方向进行,当自由能达到最小时,系统达到平衡态;
- 冷却过程:使粒子热运动减弱并渐趋有序,系统能量逐渐下降,从而得到低能的晶体结构;
然后是Metropolis准则:1953 年,Metropolis 提出重要性采样,即以概率来接受新状态,而不是使用完全确定的规则,称为 Metropolis 准则,可以显著减小计算量。
假设前一状态为x,系统受到一定扰动,状态变成y,相对的,系统能源也从E(x)变成E(y),定义系统接收新状态的概率为p
p
=
{
1
E
(
y
)
<
E
(
x
)
e
E
(
x
)
−
E
(
y
)
T
E
(
y
)
>
=
E
(
x
)
p=\begin{cases} 1 & E(y)<E(x) \\ e^\frac{E(x)-E(y)}{T} & E(y)>=E(x) \end{cases}
p={1eTE(x)−E(y)E(y)<E(x)E(y)>=E(x)
算法描述
算法涉及的符号说明如下
符号 | 说明 |
---|---|
n | 问题维度 |
top | 解空间的上界 |
down | 解空间的下界 |
tMax | 最大迭代次数 |
ts | 最高温度 |
te | 最低温度 |
d | 温度下降系数 |
t | 当前温度 |
x | 当前解 |
y | 当前解值 |
newx | 新解 |
newy | 新解值 |
bestx | 历史最优解 |
besty | 历史最优解值 |
rand() | 0-1的随机数 |
step | 扰动步长 |
f(x) | 目标函数 |
初始化阶段
初始解可以用下述公式表示
x
=
r
a
n
d
(
)
∗
(
t
o
p
−
d
o
w
n
)
+
d
o
w
n
x=rand()*(top-down)+down
x=rand()∗(top−down)+down
y
=
f
(
x
)
y=f(x)
y=f(x)
最优解等于初始解
b
e
s
t
x
=
x
bestx=x
bestx=x
b
e
s
t
y
=
y
besty=y
besty=y
当前温度
t
=
t
s
t=ts
t=ts
迭代阶段
根据温度差与最大迭代次数,开始双重迭代,外层迭代温度,进行冷却过程,内层迭代次数,进行等温过程。
冷却过程
t
=
t
∗
d
t=t*d
t=t∗d
等温过程
每次迭代,系统扰动生成新解,这里扰动方式要结合具体问题与解空间规模,这里考虑到全局搜索,设定步长
s
t
e
p
=
(
u
p
−
d
o
w
n
)
/
t
M
a
x
step=(up-down)/tMax
step=(up−down)/tMax
n
e
w
x
=
x
+
r
a
n
d
(
)
∗
s
t
e
p
newx=x+rand()*step
newx=x+rand()∗step
校验边界值,防止跑出解空间
n
e
w
x
=
{
t
o
p
n
e
w
x
>
=
t
o
p
n
e
w
x
d
o
w
n
<
n
e
w
x
<
t
o
p
d
o
w
n
n
e
w
x
<
=
d
o
w
n
newx=\begin{cases} top & newx>=top \\ newx & down<newx<top \\ down & newx<=down \end{cases}
newx=⎩
⎨
⎧topnewxdownnewx>=topdown<newx<topnewx<=down
根据Metropolis准则,计算接受概率,函数是求最大值,与准则的符号相反,同时,算法上有改进,借助历史最优解的数值,替换当前解的数值,算法效果更佳。
p
=
{
1
n
e
w
y
>
=
y
e
n
e
w
y
−
b
e
s
t
y
t
n
e
w
y
<
y
p=\begin{cases} 1 & newy>=y\\ e^\frac{newy-besty}{t} & newy<y \end{cases}
p={1etnewy−bestynewy>=ynewy<y
x
=
{
n
e
w
x
p
>
r
a
n
d
(
)
x
p
<
=
r
a
n
d
(
)
x=\begin{cases} newx & p>rand() \\ x & p<=rand() \end{cases}
x={newxxp>rand()p<=rand()
同步更新y值
接着更新的历史最优解
b
e
s
t
x
=
{
x
y
>
=
b
e
s
t
y
b
e
s
t
x
y
<
b
e
s
t
y
bestx=\begin{cases} x & y>=besty \\ bestx & y<besty \end{cases}
bestx={xbestxy>=bestyy<besty
当达到最大迭代次数时,算法结束,输出最优解bestx以及对应的值besty
示例
对于一个50维的sphere函数
y
=
∑
i
=
1
n
x
i
2
y=\sum_{i=1}^nx_i^2
y=i=1∑nxi2
(
−
100
<
x
i
<
100
)
(-100<x_i<100)
(−100<xi<100)
n
=
50
n=50
n=50
求其最小值,一眼便知道其最小值为0,解为(0,0,0,0,0,0,0)
我们假设:初始温度10000 ,最低温度1,温度下降系数0.9,最大迭代次数4000
多次执行模拟退火算法,算法运行图如下:
后记
本期的内容对应的代码库:evolutionarycomputation
从运行结果图,对于连续单峰高维函数,模拟退火效果优于粒子群算法。