一些随机算法

这里是一些关于随机乱搞算法的介绍。(待更。。。

爬山算法

顾名思义,你可以想象一下蒙上眼睛以后是怎么爬山的。

那就是随机一个当前位置的临近状态,如果这个状态的比当前位置牛逼,那么就移动到这个位置上。

显然,这样的思路很容易陷入局部最优解然后出不来。

解决方案是使用模拟退火多爬几遍。

模拟退火

英文名:Simulated Annealing。

顾名思义 $\times 2$。你可以想象一下你从愤怒变为冷静的过程。

实际上是退火是与物理相关的词,指的是一个高温的晶体冷却时的过程。

跟爬山类似,退火的过程是从当前的状态转移到另一状态,只不过这个转移的过程跟当前的温度之类的是有关系的。可以理解为随机下一状态的范围是与当前温度相关的。

流程

一开始我们先随机一个状态,以及设定一个初始的温度。然后温度随着迭代的次数增加而降低。

对于每一状态:设当前温度为 $T$,状态为 $x_n$,然后你根据当前温度找到了下一个状态 $x_{n+1}$。

设状态 $x$ 的能量为 $E(x)$。这个能量跟爬山的高度是类似的。

为了不陷入局部最优解,我们需要一个东西来判定。

显然,当 $E(x_{n+1})\geq E(x_n)$ 时,也就是 $x_{n+1}$ 比 $x_n$ 优,我们将当前位置转移到 $E(x_{n+1})$ 上。

那么当 $E(x_{n+1})<E(x_n)$ 时,我们要以一定的概率转移到 $E(x_{n+1})$ 上,以保证不陷入局部最优解。而这个概率我们用 $e^{-\frac{E(x_n)-E(x_{n+1})}{T}}$(我也不知道为什么要用这个)。

最后来看这个温度 $T$ 该怎么降低法。

实际上,一般通过指数式的下降来时限这个温度 $T$ 的下降。即 $T_{n+1}=\lambda T_n$,这个 $\lambda$ 可以随你挑。

如果 $\lambda$ 太大,则容易陷入局部最优解;如果 $\lambda$ 太小,则时间复杂度会增加。具体数值就去调参叭,大概是 $0.99$ 左右的样子。

然后退火退到一定程度,即温度过小的时候就可以结束了。

trick0

调参,比如 $\lambda$ 的值,退火次数,以及随机种子。

trick1

跟爬山一样,我们可以退多几次火来增加找到最优解的概率。

trick2

分块模拟退火,当这个函数的峰有很多很多的时候,往往直接退火也无法找到最优解,这时我们将函数分为连续的一些块,每个快内做一次退火,然后合并。

一些例题