优化算法导论

在许多应用中,优化是最重要的,例如工程,商业活动和工业设计。显然,优化的目的可以是任何事情——从最小化能耗和成本到最大化利润、产出、性能和效率。可以毫不夸张地说,从工程设计到商业规划,从互联网路由到假日规划,优化无处不在。由于现实世界中资源、时间和金钱总是有限,所以我们必须找到解,以便在各种限制条件下优化使用这些宝贵的资源。数学优化或规划是利用数学工具进行上述规划和设计问题的研究。由于大多数现实世界的应用往往是高度非线性的,因此需要复杂的优化工具来处理。目前,计算机模拟已经成为解决这类优化问题不可或缺的工具(通过使用各种有效的搜索算法)。

在任何计算机模拟和计算方法背后,总有一些算法在工作。基本的组件和它们交互方式决定了算法的工作方式以及算法的效率和性能。

本文介绍算法并分析算法的本质。然后讨论优化问题的一般表达式,并描述群体智能、生物启发式计算之类的现代方法。最后,回顾自然启发算法简史。

什么是算法?

实质上,算法是提供计算或指令的分步过程。 许多算法是迭代的过程。 实际的步骤和程序取决于所使用的算法和感兴趣的上下文。 然而,这里,我们主要关注优化算法,因此我们更重视构建算法的迭代过程。

例如,找任何正数 $k>0$$x$ 的平方根的简单算法,可以这样写

$$x_{t+1}=\frac{1}{2}(x_t+\frac{k}{x_t}), \tag 1$$

算法开始于一个猜测值 $x_0 \ne 0$,假设 $x_0=1$。这里,t 是迭代计数器或索引,也称为伪时间(pseudo-time)或生成计数器(generation counter)。

该迭代等式来自对 $x^2=k$ 的重排,形式如下:
$$\frac{x}{2} = \frac{k}{2x},\quad \Rightarrow \quad x=\frac{1}{2}(x+\frac{k}{x}), \tag 2$$
例如,对于 $k=7, x_0=1$,我们有
$$x_1 = \frac{1}{2}(x_0+\frac{7}{x_0}) = \frac{1}{2}(1+\frac{7}{1})=4. \tag 3$$
$$x_2 = \frac{1}{2}(x_1+\frac{7}{x_1}) = 2.875, \quad x_3 \approx 2.6554891304, \tag 4$$
$$x_4 \approx 2.645767044, \quad x_5 \approx 2.6457513111. \tag 5$$

可以看到 $x_5$ 仅过了 5 次迭代后就非常接近真实值 $\sqrt{7} = 2.64575131106459 ...$,这表明该迭代方法非常有效。

迭代过程起作用的原因数列 $x_1, x_2, ... , x_t$ 收敛于真实值 $\sqrt{k}$,由于以下事实
$$\frac{x_{t+1}}{x_t} = \frac{1}{2}(1+\frac{k}{x_t^2}) \to 1, \quad x_t \to \sqrt{k} \tag 6$$
随着 $t \to \infty$。然而,选择一个好的初始值 $x_0$ 会加速收敛。选择错误的 $x_0$ 会导致迭代失败。例如,我们不能使用 $x_0 = 0$ 作为初始猜测值,也不能使用 $x_0 < 0$ 因为 $\sqrt{k} > 0$

因此,明智的选择是有根据的猜测。在最初的一步,如果 $x_0^2 < k$,则 $x_0$ 是下界 $k/x_0$ 是上界。如果 $x_0^2 > k$,则 $x_0$ 是上界 $k/x_0$ 是下界。对于其他迭代,新的界将是 $x_t$$k/x_t$。事实上,$x_{t+1}$ 总是在两界 $x_t$$k/x_t$ 之间,并且新的 $x_{t+1}$ 是上下界的均值。这保证了数列收敛到 $\sqrt{k}$ 的真实值。该方法类似于著名的二分法。

值得指出的是,在这里尽管最终结果很好的收敛了,但它取决于开始的猜测值。这是确定性程序(或算法)的一个普遍特性和缺点。

细心的读者可能已经想过为什么 $x^2=k$ 要被转换为式 (1)?为什么不像下面这样写迭代公式呢:
$$x_t = \frac{k}{x_t}, \tag 7$$
$x_0 = 1, k = 7$ 开始, 我们有
$$x_1 = \frac{7}{x_0} = 7, \quad x_2 = \frac{7}{x_1}=1, \quad x_3=7, \quad x_4=1, \quad x_5=7, \quad … , \tag 8$$
这导致在 1 和 7 两个状态振荡。你会想可能是初始值 $x_0$ 的问题。实际上,对于任何初始值 $x_0 \ne 0$,这个公式都会导致在 $x_0$ 和 k 之间振荡。这清楚地说明了设计一个好的迭代公式是非常重要的。

从数学的角度来看,对于给定的问题,算法 A 往往会在迭代/时间 t 内从当前解 $x_t$ 上生成一个新的并且更好的解 $x_{t+1}$。也就是说,
$$x_{t+1} = A(x_t), \tag 9$$
其中 A 是 $x_t$ 的数学函数。事实上,A 可以是一组数学方程。在一些文献中,特别是在数值分析中,n 常用于迭代索引。在许多教科书中,常用的是上索引形式 $x^{(t+1)}$$x^{t+1}$。这里,$x^{t+1}$ 表示的不是 x 的 t+1 次方。适当的使用这样的符号会很有用且不会产生混淆。在这里,我们使用这样的符号。

牛顿法

牛顿法是一种广泛使用的经典方法,用于寻找区间 [a,b] 上非线性单变量函数 $f(x)$ 的零点。它是由牛顿于 1669 年发现的,后来在 1690 年,Raphson 将其应用于多项式。该方法也被称为牛顿-拉弗森方法(Newton-Raphson method)。

在任意给定的点 $x_t$,我们可以用泰勒级数来近似该函数
$$f(x_{t+1}) = f(x_t + \Delta x) \approx f(x_t) + f^{‘}(x_t) \Delta x, \tag {10}$$
其中 $\Delta x = x_{t+1} - x_t$,则有
$$x_{t+1} - x_t = \Delta x \approx \frac{f(x_{t+1}) - f(x_t)}{f^{‘}(x_t)}, \tag {11}$$

$$x_{t+1} \approx x_t + \frac{f(x_{t+1}) - f(x_t)}{f^{‘}(x_t)}. \tag {12}$$

因为我们试图用 $f(x_{t+1})$ 找到 $f(x) = 0$ 时 x 的近似值,所以在上式中我们可以使用近似值 $f(x_{t+1}) \approx 0$。因此我们有了标准的牛顿迭代公式
$$x_{t+1} = x_t - \frac{f(x_t)}{f^{‘}(x_t)}. \tag {13}$$

迭代过程开始于一个初始猜测值 $x_0$,一直持续到满足一定的停止标准。

好的初始猜测值只需较少的迭代步骤就能得到满意的结果。但是,如果没有明显的、好的、初始起始点,那么在区间 [a,b] 上的任意一点都可以作为起始点。但是如果初始值离得太远,那么迭代过程可能会失败。所以最好要限制迭代次数。

牛顿法是一种非常有效的方法,因而得到了广泛的应用。对于非线性方程,通常有多个根,初始猜测值可能会影响到根的收敛。对于某些初始猜测值,迭代根本不起作用。通过一个例子可以更好地说明这一点。

我们知道下面的非线性方程
$$x^x = e^x, x \in [0, \infty),$$
有两个根$x_1^* = 0, x_2^* = e = 2.718281828459$。现在让我们用牛顿法来求解。首先,我们把它写成
$$f(x) = x^x - exp(x) =0.$$
如果我们从 $x_0 = 5$ 开始,我们有 $f^{'}(x) = x^x(\ln x + 1) - e^x$,和
$$x_1 = 5 - \frac{5^5 - e^5}{5^5(\ln 5 + 1) - e^5} = 4.6282092.$$
$$x_2 = 5.2543539, \quad x_3 \approx 3.8841063, … ,$$
$$x_7 = 2.7819589, … , \quad x_{10} = 2.7182818.$$

$x_{10}$ 非常接近真正的解 $e$。然而,如果我们将 $x_0 = 10$ 作为初始猜测值,则需要约 25 次迭代才能得到 $x_{25} \approx 2.7182819$。收敛速度非常慢。

另一方面,如果我们从 $x_0 = 1$ 开始,则迭代式为
$$x_{t+1} = x_t - \frac{x_t^{x_t} - e^{x_t}}{x_t^{x_t}(\ln x_t +1) - e^{x_t}}, \tag {14}$$
我们得到
$$x_1 = 1 - \frac{1^1 - e^1}{1^1(\ln 1 + 1) - e^1} = 0,$$
这是根 $x^* = 0$ 的精确解,如果我们继续迭代,表达式可能会变成奇异的。

另外,如果我们从 $x_0 =0$ 或 $x_0 < 0$ 开始,那么,由于对数的奇异性,该公式就不成立了。实际上,如果我们从 0.001 到 0.99 或者 $x_0 = 2$ 开始也不会成功。这证明了选择正确起始点的重要性。

另一方面,Newton-Raphson 方法可以扩展到用于寻找 f(x) 的最大值、最小值,这等价于在 d 维空间寻找 $f^{'}(x) = 0$ 的临界点或根。也就是说,
$$x^{t+1} = x^t - \frac{f^{‘}(x^t)}{f^{“}(x^t)} = A(x^t). \tag {15}$$
这里 $x = (x_1, x_2, ... , x_d)^T$ 是一个 d 维的向量,而上标 T 表示转置,将行向量转换为列向量。这种符号标记使得从单变量函数扩展到多变量函数变得更容易。

显然,当 $f^{'}(x) \to 0$ 时,收敛速度变得会非常慢,x 会非常缓慢地接近最优值。一般来说,Newton-Raphson 方法具有二次幂收敛速度。有时真正的收敛速度可能不会那么快,可能具有非二次幂收敛特性。

在这种情况下,改进收敛性的一种方法是引入一个参数 p 。稍微修改前面的公式,我们有
$$x^{t+1} = x^t - p\frac{f^{‘}(x^t)}{f^{“}(x^t)}. \tag {16}$$

如果最优解,即,迭代的不动点是 $x_* $。那么我们可以将 p 设为
$$p = \frac{1}{1 - A^{‘}(x_* )}. \tag {17}$$

前面的迭代方程可以写成
$$x^{t+1} = A(x^t, p). \tag {18}$$

值得指出的是,Newton-Raphson 方法的最优收敛会有一个最优参数设置(即 p 的设置),其取决于迭代公式和最优 $x_* $ 以及要优化的目标函数 $f(x)$

优化

从数学上讲,可以写出大多数优化问题一般的形式
$$
\begin{equation*}
\begin{aligned}
& \underset{x \in \Re^d}{\text{minimize}}
& & f_i(x), ; (i=1,2,…,M), \
& \text{subject to}
& & h_j(x) = 0, ; (j=1,2,…,J), \
&&& g_k(x) \le 0, ; (k=1,2,…,K),
\end{aligned}
\end{equation*}
$$
其中 $fi(x)$$h_j(x)$$g_k(x)$ 是向量 $x=(x_1,x_2,...,x_d)^T$ 的函数。

这里 $x$ 的分量 $x_i$ 称为设计决策变量,它们可以是实连续的,离散的,或者混合的。

函数 $f_i(x), \; i=1,2,...,M$ 被称为目标函数成本函数,且在 $M = 1$ 的情况下,仅有单个目标。由决策变量所产生的空间称为设计空间搜索空间 $\Re^d$,而由目标函数值构成的空间称为解空间响应空间。等式 $h_j$ 和不等式 $g_k$ 被称为约束。值得指出的是,我们还可以将不等式写成 $\ge 0$ 的形式,我们也可以目标表示为最大化问题。

一个罕见的,极端的情况是根本没有优化目标,只有约束。这样的问题被称为可行性问题,任何可行解都是最优解。

如果我们根据目标的数量对优化问题进行分类,可以分为两类:单目标 $M = 1$ 和多目标 $M > 1$。在文献中,多目标优化(multiobjective optimization)也被称为多准则(multicriteria)优化,甚至是多属性(multiattribute)优化。在实际问题中,大多数优化任务都是多目标的。虽然这里讨论的算法进行一些修改也适用于多目标优化,但我们主要讨论的是单目标优化问题。

同样的,我们也可以根据约束数量 $J+K$ 来对优化问题进行分类。如果没有约束 $J=K=0$,则称为无约束优化 问题。如果 $K = 0, J \ge 1$,它被称为等式约束 问题,如果 $J = 0, K \ge 1$,则称为不等式约束 问题。

值得指出的是,在关于优化的文献中,一些公式没有明确地包含等式,只包括不等式。这是因为等式可以写成两个不等式。例如,$h(x)= 0$ 等价于 $h(x) \le 0$$h(x) \ge 0$。等式约束具有特殊性质,需要特殊的处理。其中一个缺点是在搜索空间中很难找到满足等式的抽样点。在实践中会使用 tolerance 或 allowance。

我们还可以根据实际函数的形式进行分类。目标函数可以是线性的,也可以是非线性的。如果约束 $h_j$$g_k$ 都是线性的,则是线性约束问题。如果约束条件和目标函数都是线性的,则是线性规划问题。这里的“规划(programming)”与计算编程(programming)无关,它意味着规划(planning)和/或优化(optimization)。另外,如果 $f_i$$h_j$$g_k$ 都是非线性的,则称为非线性优化问题。

基于梯度的算法

早期引入的牛顿法仅用于单变量函数。现在让我们把它扩展到多变量函数。

对一个连续可微函数 $f(x)$ 进行优化,我们有已知点 $x=x_t$ 以及 $\Delta x=x−x_t$ 的泰勒展开式:
$$f(x) = f(x_t) + (\nabla f(x_t))^T \Delta x + \frac 12 \Delta x^T \nabla^2 f(x_t) \Delta x + …$$
它被写成二次形式(quadratic form)。当 $\Delta x$ 是以下线性方程的解时,$f(x)$ 在临界点附近最小:
$$\nabla f(x_t) + \nabla^2 f(x_t) \Delta x = 0.$$

这将导致
$$x = x_t - H^{-1} \nabla f(x_t),$$
这里,$H = \nabla^2 f(x_t)$ 是海森矩阵(Hessian matrix),定义为
$$
H(x) \equiv \nabla^2 f(x) \equiv
\begin{pmatrix}
\frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_d} \
\frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_d} \
\vdots & \vdots & \ddots & \vdots \
\frac{\partial^2 f}{\partial x_d \partial x_1} & \frac{\partial^2 f}{\partial x_d \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_d^2}
\end{pmatrix}.
$$

这个矩阵是对称的,基于以下事实
$$\frac{\partial^2 f}{\partial x_i \partial x_j} = \frac{\partial^2 f}{\partial x_j \partial x_i}.$$

如果迭代过程从初始向量 $x^{(0)}$ (通常是决策变量可行域中的猜测点)开始,那么牛顿公式的第 t 次迭代公式可以写成
$$x^{(t+1)} = x^{(t)} - H^{-1} (x^{(t)}) f(x^{(t)}),$$
其中,$H^{-1}(x^{(t)})$ 是海森矩阵的逆。值得指出的是,如果 $f(x)$ 是二次方程,可以在单步中找到解。然而,这种方法对于非二次函数无效。

为了加快收敛,我们可以使用更小的步长 $\alpha \in (0,1]$,我们有修改的牛顿法
$$x^{(t+1)} = x^{(t)} - \alpha H^{-1}(x^{t})f(x^{(t)}).$$

有时计算二阶导的海森矩阵可能很耗时。使用单位矩阵 $H=I$ 作为替换是一个不错的选择,这样就有 $H^{-1} = I$,于是我们有拟牛顿法(quasi-Newton method)
$$x^{(t+1)} = x^{(t)} - \alpha I \nabla f(x^{(t)}),$$
这就是最速下降法(steepest descent method)。

最速下降法的本质是,从当前点 $x^{(t)}$ 中找到尽可能低的目标函数 $f(x)$。对于函数 $f(x)$ 关于 $x^{(t)}$ 的泰勒展开式,我们有
$$f(x^{(t+1)}) = f(x^{(t)} + \Delta s) \approx f(x^{(t)}) + (\nabla f(x^{(t)}))^T \Delta s,$$
其中 $ \Delta s = x^{(t+1)} - x^{(t)}$ 是增量向量。因为我们想找到对目标函数更好的近似,所以要求右边的第二项是负的。所以,
$$f(x^{(t)} + \Delta s) - f(x^{(t)}) = (\nabla f)^T \Delta s < 0.$$

我们知道两个向量 $u$$v$ 平行但方向相反时,点积为负,内积 $u^Tv$ 最大。所以我们有
$$\Delta s = - \alpha \nabla f(x^{(t)}),$$
其中 $\alpha > 0$ 是步长。这是方向 $\Delta s$ 沿负梯度方向最速下降的情况。在寻找最大值的情况下,这种方法通常被称为爬山(hill climbing)。

步长 $\alpha$ 的选择非常重要。非常小的步长意味着向局部极值方向移动缓慢,而大的步长可能会超调(overshoot)、并远离局部极值。因此,步长 $\alpha = \alpha^{(t)}$ 在每次迭代时应该是不同的,并且应该选择最小化目标函数 $f(x^{(t+1)}) = f(x^{(t)}, \alpha^{(t)})$ 的步长。所以,最速下降法可以写成
$$f(x^{(t+1)}) = f(x^{(t)}) - \alpha^{(t)}(\nabla f(x^{(t)}))^T \nabla f(x^{(t)}).$$

在每次迭代中,会计算梯度和步长。同样,对于起始点和步长而言一个好的初始猜测值也是有用的。

现在,让我们最小化以下函数
$$f(x_1,x_2) = 10x_1^2 + 5x_1x_2 + 10(x_2 -3)^2,$$
其中$(x_1,x_2) \in [-10, 10] \times [-15, 15]$。使用最速下降法,以 $x^{(0)} = (10, 15)^T$ 作为初始猜测值,则梯度为
$$\nabla f = (20x_1 + 5x_2, 5x_1 + 20x_2 - 60)^T$$
因此,$\nabla f(x^{(0)}) = (275, 290)^T$。在第一次迭代中,我们有
$$x^{(1)} = x^{(0)} - \alpha_0 \begin{pmatrix}275 \ 290 \end{pmatrix}.$$
选择的步长 $\alpha_0$ 应使得 $f(x^{(1)})$ 处于最小值,这意味着
$$f(\alpha_0) = 10 (10-275\alpha_0)^2 \ + 5 (10 - 275\alpha_0)(15 - 290\alpha_0)+ 10(12-290\alpha_0)^2$$
应该最小。这就变成了单自变量 $\alpha_0$ 的优化问题。所有用于单变量优化问题的技术(如牛顿法)都可以用来求 $\alpha_0$。我们也可以通过设
$$\frac{df}{d\alpha_0} = -159725 + 3992000\alpha_0 = 0,$$
来求解。得到解 $\alpha_0 \approx 0.04001$。在第二步,我们有
$$\nabla f(x^{(1)}) = (−3.078, 2.919)^T, \quad x^{(2)} = x^{(1)} - \alpha_1 \begin{pmatrix} −3.078 \ 2.919 \end{pmatrix}.$$

$\alpha_1 \approx 0.066$ 时 $f(\alpha_1)$ 最小,新解是
$$x^{(2)} \approx (−0.797, 3.202)^T.$$

在第三次迭代中,我们有
$$\nabla f(x^{(2)}) = (0.060, 0.064)^T, \quad x^{(3)} = x^{(2)} - \alpha_2 \begin{pmatrix} 0.060 \ 0.064 \end{pmatrix}.$$

最小化 $f(\alpha_2)$ 得到 $\alpha_2 \approx 0.040$,因此
$$x^{(3)} \approx (−0.8000299, 3.20029)^T.$$
然后,迭代持续下去,直到满足规定的误差范围(tolerance)。

使用微积分的基本概念,我们可以知道第一个偏导数等于零:
$$\frac{\partial f}{\partial x_1} = 20x_1 + 5x_2 = 0, \quad \frac{\partial f}{\partial x_2} = 5x_1 + 20x_2 - 60 = 0.$$
我们知道最小值发生在
$$x_* = (-4/5, 16/5)^T = (-0.8, 3.2)^T.$$

我们可以发现,最速下降法仅仅在经过 3 次迭代后就给出了几乎确切的解。

在上述最速下降法寻找步长 $\alpha_t$ 的过程中,我们使用了 $df(\alpha_t)/d\alpha_t = 0$。你可能会说,如果我们可以对 $f(\alpha_0)$ 使用这个静止的条件,为什么不在第一个地方使用相同的方法来得到 $f(x)$ 的最小值点呢?这里有两个原因。首先,这只是一个简单的例子,仅仅是用来演示最速下降法是如何工作的。第二个原因是,即使对于多变量的复杂函数 $f(x_1,x_2,...,x_d)$ 假设 d = 500,$f(\alpha_t)$ 在任何一步 t 仍是单变量函数,优化 $f(\alpha_t)$ 相对于优化多变量问题要简单得多。此外,通过简单高效的优化算法,可以得到最优步长。

值得指出的是,在我们的示例中,从第二个迭代到第三个迭代的收敛是缓慢的。事实上,一旦局部极值临近,最速下降法通常是缓慢的。这是因为在局部极值附近,梯度几乎为零,因此下降速率也很慢。如果在局部极值附近需要较高的精度,则应该使用其他局部搜索方法。

在某些情况下,可能根本不存在最大值或最小值。然而,在这里,我们总是假设它们存在。现在,我们的任务变成了如何在各种优化问题中找到最大或最小值。

具有随机重启的爬山法

前面几节讨论的问题相对简单。有时看似简单的问题很难解决。

例如,下面的函数,
$$f(x,y) = (x - y)^2 exp (-x^2-y^2),$$
有两个全局最大值 $(1/\sqrt{2}, -1/\sqrt{2}), (-1/\sqrt{2}, 1/\sqrt{2}), f_{max} = 0.735758882$。

如果我们使用基于梯度的方法,如爬山,最终结果可能取决于初始猜测值 $x_0 =(x_0,y_0)$。事实上,你可以尝试使用多种算法和软件包,你会发现最终的结果很大程度上取决于你的初始猜测值。本节的最大化问题相当于爬到两个相等的峰上,但一次只能到达一个峰。换句话说,你到达的顶峰很大程度上取决于你开始的地方。最后的结果具有随机性。为了使达到两个峰的可能性相等,起始点必须在搜索空间中随机分布。如果我们将有偏样本作为一个区域的起点,那么另一个峰可能永远无法到达。

一个确保所有峰都能到达的通用策略,是用多次随机重启进行爬山。这就是所谓的具有随机重启的爬山(hill climbing with random restart)。这是一个简单但非常有效的策略。

有多个峰或谷的函数是多模态函数。随着爬山随机重启,问题似乎解决了。假设一个函数有 k 个峰,且随机重启 n 次来进行爬山。如果 $n \gg k$ 并且样本来自不同的搜索区域,那么它很可能达到该多模态函数的所有峰。然而,现实并非如此简单。首先,我们可能不知道一个函数有多少峰和谷,而且通常也不能保证所有的峰都被采样。其次,大多数实际问题根本没有分析或显式的函数。第三,许多问题需要连续值和离散值,它们的导数可能不存在。

例如,即使对于连续变量,以下函数
$$g(x,y) = (|x|+|y|)exp(-x^2-y^2)$$
在 (0,0) 处有全局最小值 $f_{min} = 0$,但在 (0,0) 处导数不存在(由于绝对值函数)。对于这种情况,所有基于梯度的方法都不起作用。

你可能会想,如果我们把 (0,0) 的局部区域弄平滑会发生什么。
二次函数近似可以解决这个问题。事实上,信赖域方法(trust-region
methods )是建立在适当区域(信赖域)的局部平滑和近似的基础上,并且这些方法在实践中很有效。

在实际中,在各种复杂的约束条件下,优化问题要复杂得多,而导数的计算要么是不可能的要么计算代价太大。因此,采用无梯度的方法更好。事实上,现代自然启发式算法几乎都是无梯度的优化方法。

搜索最优

在优化问题得到正确的表述后,主要的任务是用正确的数学方法找到最优解。

形象地说,寻找最优解就像寻宝一样。想象一下,我们想要在一定的时间限制下寻找一个隐藏的宝藏。一个极端的情况是,假设我们被蒙住眼睛没有任何指导。在这种情况下,搜索过程本质上是一个纯粹的随机搜索,通常是无效的。
另一个极端情况是,如果我们已知晓宝藏被放在已知区域的最高峰,我们将会直接爬上最陡的悬崖,以达到最高峰。这个场景对应经典的爬山法。对于大多数情况,我们的搜索处于这两种极端之间。我们没有被蒙住眼睛,也不知道去哪找。在非常大的区域搜寻每一寸土地以找到宝藏是一个不切实际的想法。

最可能的情况是,我们会随机行走并寻找一些提示。我们几乎随机地搜寻一个地方,然后移动到另一个可能的地方,然后另一个,如此重复。这种随机行走是现代搜索算法的主要特征。显然,我们也可以独自寻宝,这样整个路径就是基于轨迹的搜索。模拟退火是这样一种搜索。另外,
我们可以让一群人去搜寻并分享信息(任何宝藏的发现)。这一场景使用了所谓群体智能,对应于粒子群优化和萤火虫算法,稍后我们将详细讨论。如果宝藏真的很重要并且搜寻区域非常大,那么搜寻过程将会花费很长时间。如果没有时间限制并且任何区域都可以到达(例如,湖中没有岛屿),理论上可以找到最终的宝藏(全局最优解)。

显然,我们可以进一步完善我们的搜索策略。有些宝物猎人比其他宝物猎人强。我们只留住更好的猎人,招募新的猎人。这类似于改进搜索代理的遗传算法或进化算法。事实上,在几乎所有的现代元启发式算法中,我们都在尝试使用最好的解或代理,并随机化(或替换)不那么好的解,同时与系统历史(使用内存)相结合评估每个个体的能力(适应性)。有了这样的平衡,我们就能设计出更好更高效的优化算法。

可以用多种方法对优化算法进行分类。一种简单的分类方法是依据算法的性质,可以将算法分为两类:确定性算法(deterministic algorithms)和随机算法(stochastic algorithms)。确定性算法 遵循严格的过程,设计变量(design variables)和函数的路径和值都是可重复的。例如,爬山法是一种确定性算法,对于相同的起点,不管你什么时候运行这个程序,算法都会遵循同样的路径。另一方面,随机算法总有一些随机性。遗传算法就是一个很好的例子。在每次运行程序时,种群的字符串或解都是不同的,因为算法使用了伪随机数,尽管最终结果可能没有很大的差别,但是每个个体的路径都不是完全可重复的。

第三种类型是确定性算法和随机算法的混合(mixture/hybrid)。随机重启爬山是一个很好的例子。基本思想是使用确定性算法但从不同的起始点开始。这种方法相对于简单的爬山法有一定的优势,但可能会被困在局部的峰值。然而,由于这种混合算法中有随机成分,在优化文献中我们通常将它归类为随机算法。

没有免费午餐定理

有一个问题一直困扰着许多研究人员,特别是年轻的研究人员:优化算法这么多,哪一个才是最好的?

这是一个简单的问题,但不幸的是没有简单的答案,我们不能简单地回答这个问题。这里有很多原因,其中一个原因是现实世界中问题的复杂性和多样性往往意味着一些问题能够轻易地解决,而另一些问题却很难解决。因此,不太可能有某一种方法能够处理所有类型的问题;另一个原因是,有一个所谓的没有免费午餐(NFL)定理,表明没有一种通用算法能够处理所有问题。

NFL 定理

至于 NFL 定理,事实上,有一些类似的定理,如 Wolpert 和 Macready 在 1997 年证明的 [23]。但是,主要的定理如下:如果任何算法 A 在搜索目标函数的极值时,优于另一个算法 B,那么算法 B 在其他一些目标函数上优于算法 A。原则上,NFL 定理适用于以下场景,不管确定性算法还是随机算法,一组连续(或离散或混合)的参数 $\theta$ 将目标函数或成本函数映射到一个有限集。

$n_{\theta}$$\theta$ 值的个数(由于离散值或有限的机器精度)和 $n_f$ 是目标函数值的个数。目标函数所有可能的组合是 $N = n_f^{n_{\theta}}$,这是有限的(但通常非常大)。NFL 定理表明,所有可能的目标函数的平均性能对任何搜索算法都是一样的。
从数学上讲,如果 $P(s_m^y|f,m,A)$ 表示一个算法 A 在样本集 $s_m$ 上、目标函数 $f$ 上迭代 $m$ 次,统计意义上的性能,那么我们有以下关于两种算法的平均性能的表述:
$$\sum_f P(s_m^y|f,m,A) = \sum_f P(s_m^y|f,m,B)$$
其中 $s_m = \{ (s_m^x(1),s_m^y(1)),(s_m^x(2),s_m^y(2)),...,(s_m^x(m),s_m^y(m)) \}$ 是有 m 个不同访问点的时间有序集,其样本大小为 m。

使用归纳法的证明步骤大致如下:搜索空间是有限的(尽管相当大)。因此,可能的“目标”值空间也是有限的。目标函数为 $f: \mathcal X \mapsto \mathcal Y$$\mathcal F = \mathcal{Y^X}$ 是所有可能问题的空间。这里的主要假设是搜索域是有限的,没有访问点的重访,而有限集在置换(closed under permutation,c.u.p)下是封闭的。

对于 $m=1, s_1=\{s_1^x,s_1^y\}$ 的情况,$s_1^y$ 的唯一可能值是 $f(s_1^x)$
因此 $\delta (s_1^y,f(s_1^x))$,这里 $\delta$ 表示狄拉克函数。也就是说
$$\sum_f P(s_1^y|f,m=1,A) = \sum_f \delta (s_1^y, f(s_1^x)) = \mathcal{|Y|}^{\mathcal{|X|}-1},$$
独立于算法 A,这里 $\mathcal{|Y|}$$\mathcal Y$ 的大小或基数。

如果上述条件对 $m$ 为真,或者说 $\sum_f P(d_m^y|f,m,A)$ 独立,那么对于 $m+1$,我们有 $s_{m+1} = s_m \bigcup \{x, f(x)\}, \, s_{m+1}^x(m+1) = x, \, s_{m+1}^y(m+1)=f(x)$。因此,我们有(使用贝叶斯方法)
$$
\begin{align}
P(s_{m+1}^y|f,m+1,A) = & P(s_{m+1}^y(m+1)|s_m,f,m+1,A) \
& \times P(s_m^y|f,m+1,A).
\end{align}
$$
所以有
$$
\begin{align}
\sum_f P(s_{m+1}^y|f,m+1,A) = & \sum_{f,x} \delta(s_{m+1}^m(m+1),f(x)) \
& \times P(x|d_m^x,f,m+1,A)P(d_m^y|f,m+1,A).
\end{align}
$$
使用 $P(x|d_m,A) = \delta(x,A(s_m))$$P(s_m|f,m+1,A)=P(s_m|f,m,A)$,前面的表达式变成
$$\sum_f P(s_{m+1}^y|f,m+1,A) = \frac{1}{\mathcal{|Y|}} \sum_f P(d_m^y|f,m,A),$$
也独立于 A。

换句话说,性能与算法本身无关。也就是说,所有的优化算法在所有可能的函数上平均时,都会得到相同的平均性能,这意味着对于所有的优化问题都不存在通用最佳方法。在通用语言中,这也意味着任何算法与随机搜索一样好(或差)。

你可能会说没有必要制定新的算法,因为所有的算法都是一样的。但这不是 NFL 定理的真正含义。这里的关键词是平均性能所有可能的函数/问题(在非常大的有限集统计意义上的测量)。这并不意味着所有的算法在某些特定的函数或特定的问题集上的性能都是一样的。实际情况是,任何优化问题都不需要在所有可能的函数上具有平均性能。

尽管 NFL 定理在数学上是有效的,但它对优化的影响是有限的。对于任何特定的目标函数集,一些算法表现的比其他的算法好。事实上,对于给定的特定目标函数的特定问题,如果不需要度量它们的平均性能,通常存在一些比其他算法更有效的算法。主要的任务可能是如何找到针对特定类型问题的表现更好算法。

值得指出的是,所谓的 NFL 定理已经被证明是针对单一目标优化问题的,对于多目标问题,它们的扩展仍在研究中。

最近的一些研究表明,NFL 定理的基本假设可能对连续域不成立。例如,2010 年 Auger 和 Teytaud 提出连续问题可以是免费的 [1]。此外,Marshall 和 Hinton 认为,时间有序集有 m 个不同的点(非重访条件)的假设对现实算法来说是无效的,从而违背了在置换下不重访和封闭的基本假设 [15]。

另一方面,原 NFL 研究人员证明,对于协同进化系统,比如一组玩家共同进化产生一个冠军,免费午餐确实存在 [24]。在这种情况下,单个玩家(或两者)都想产生下一个最佳移动,因此适应度取决于两个玩家的移动。对于多目标优化,Corne 和 Knowles 证明了一些算法比其他算法更好 [2]。

选择算法

把这些定理放在一边,让我们想一下,如何选择一个算法,以及要解决什么问题?这里有两个选择,因此有两个相关问题:

  • 对于给定类型的问题,最好的算法是什么?
  • 对于给定的算法,它能解决什么类型的问题?

第一个问题比第二个问题更难回答,尽管回答其中任何一个问题都不容易。对于给定类型的问题,可能有一组有效的算法来解决这些问题。然而,在许多情况下,在我们尝试之前,我们可能并不知道一个算法多有效。在某些情况下,这种算法可能还需要开发。即使存在算法,选择很大程度上取决于决策者的专业知识、可用资源和问题类型。理想情况下,最好的算法和工具应该用于解决给定的问题。然而,这些工具的正确使用可能仍然依赖于用户的经验。此外,计算成本、软件可用性和生成解的时间等资源也将成为决定使用何种算法和方法的重要因素。

另一方面,对于给定的算法,可以通过利用它来解决各种问题,然后进行比较和排序,从而找出它的有效程度。通过这种方法,可以识别出算法的优缺点,然后。使用这些知识来指导算法的选择和要解决问题的类型。好在大部分文献(包括数百本书)都非常重视回答这个问题。

因此,对于传统的算法,诸如基于梯度的算法和单纯形方法,我们通常知道它们能解决什么类型的问题。然而,对于新的算法,如大部分自然启发式算法,我们必须进行大量的研究来验证和测试它们的性能。这里目标之一是介绍和回顾最近的算法及其不同的应用。

值得指出的是,对于特定问题的任何特定知识总是有助于为优化过程的最佳和最有效的方法提供适当地选择。毕竟,专业知识在很多应用中都有所帮助。例如,我们想要使用工具在桌子上设计出飞机(尽管它可能不可行),如果设计从鱼或鸟的形状开始,设计将更有可能是有用的。从算法发展的角度来看,如何更好地结合特定问题具体的知识,仍然是一个持续而富有挑战性的问题。

自然启发、元启发式 算法

大多数传统的或经典的算法都是确定性的。例如,线性规划中的单纯形法是确定性的。一些确定性优化算法使用了梯度信息,它们被称为基于梯度的算法。例如,众所周知的 Newton-Raphson 算法是基于梯度的(因为它使用函数值及其导数),它对平滑的单峰问题非常有效。然而,如果目标函数有一些不连续点,它就不能很好地工作。在这种情况下,首选非梯度算法。非梯度(nongradient)或无梯度(gradient-free)算法不使用任何导数,只用函数值。Hooke-Jeeves 模式搜索和 Nelder-Mead 下山单纯形是无梯度算法的例子。

对于随机算法,一般来说有两种类型:启发式(heuristic)和元启发式(metaheuristic),它们的差别很小。宽泛地说,启发式的意思是“发现”或“通过试错发现”。在合理的时间内可以找到一个棘手的优化问题的高质量解,但是并不能保证达到最佳解。可以预料,这些算法在大多数情况下能够工作。当我们不需要最好的解而是容易到达的解时,这是很好的。

启发式算法的进一步发展是所谓的元启发式算法。这里的 元(meta) 意思是“超越”或“更高层次”,这些算法通常比简单的启发式算法表现得更好。此外,所有的元启发式算法都使用了随机化和局部搜索的折衷(tradeoff)。值得指出的是,文献中没有关于启发式和元启发式的公认定义,有些时候可以互换使用术语启发式和元启发式。然而,最近的趋势倾向于将所有带有随机化和局部搜索的随机算法命名为元启发式算法。这里我们也使用这个约定。随机化提供了一种从局部搜索到全局搜索的好方法。因此,几乎所有的元启发式算法都适合全局优化。

启发式是一种通过试错(trial and error)在合理的时间内为复杂的问题提供可接受解的方法。感兴趣问题的复杂性使得搜索每一个可能的解或组合变得不可能。我们的目标是在一个可接受的时间范围内找到好的、可行的解。我们不能保证找到最好的解,甚至不知道算法是否可行、为什么它有效。我们的想法是要有一个高效但实用的算法,它在大多数时候都能够工作,并能够产生高质量的解。在发现的高质量解的过程中,我们认为有些解几乎是最优的,但并不能(在数学上)保证这种最优性。

元启发式算法的两个主要组成部分是强化(intensification)和多样化(diversification),或开发(exploitation)和探索(exploration)。多样化意味着产生不同的解,从而在全局范围探索搜索空间;强化意味着利用在该区域找到的当前良好解的信息,来关注局部搜索。将这些与最佳解的选择相结合。最佳解的选择保证了解将收敛到最优,而通过随机化、多样化避免了被困在局部最优解,同时增加了解的多样性。这两个主要组成部分的良好结合通常会确保全局最优性可实现。

元启发式算法可以以多种方式进行分类。一种方式是,将它们分为基于种群的(population-based)或基于轨迹的(trajectory-based)。例如,遗传算法是基于种群的,因为他们使用一组字符串,还有粒子群算法(PSO)、萤火虫算法(FA)和布谷鸟搜索(cuckoo search),因为它们都使用了多个代理或粒子。

另一方面,模拟退火(simulated annealing)使用单个代理或解,以分段的方式在设计空间或搜索空间中移动。更好的移动或解总是被接受,不那么好的移动被以一定的概率接受。这些步骤或移动在搜索空间中形成轨迹,而非零的概率使得这种轨迹可以达到全局最优。

在我们详细介绍所有流行的元启发算法之前,让我们先简要回顾一下它们的历史。

元启发式算法简史

纵观历史,特别是早期人类历史,人类解决问题的方法一直是启发式的或元启发式的(通过不断的试错)。许多重要的发现常常是偶然的“跳出框框思考”,这就是启发式。阿基米德 "Eureka!" 那一刻,是一场启发式的胜利。事实上,人类的日常学习经历(至少在儿童时期)是显性的启发式。

作为一种解决问题的科学方法,元启发式尽管无处不在,但它确实是一种现代方法,虽然很难确定何时首次出现元启发式方法。数学家艾伦·图灵(Alan Turing)可能是第一个使用启发式算法的人,在第二次世界大战期间,当时他正在布莱切利公园(Bletchley Park)破解恩尼格玛密码(Enigma ciphers)。图灵把他的搜索方法称为启发式搜索,因为它在大部分时候能工作,但不保证能够找到正确的解。然而,他的方法取得了巨大的成功。1945 年,图灵被招募到英国国家物理实验室(National Physical Laboratory,NPL),在那里他设计了自动计算引擎(Automatic Computing Engine,ACE)。1948 年,在 Intelligent Machinery 上的 NPL 报告中,他概述了他关于机器智能和机器学习、神经网络以及进化算法的创新思想。

20 世纪 60 年代和 70 年代是进化算法发展的重要时期。首先,科学家和工程师约翰·霍兰德(John Holland)和他在密歇根大学(University of Michigan)的合作者开发了遗传算法。早在 1962 年,霍兰德就研究了自适应系统,并率先使用交叉和重组操作来建模这类系统。他于 1975 年出版的重要著作总结了遗传算法的发展 [9]。同年,计算机科学家 Kenneth De Jong 完成了他的重要论文,展示了遗传算法在广泛的目标函数、噪声、多模态、甚至不连续情况下潜力和能力 [4]。

本质上,遗传算法(genetic algorithm,GA)是一种搜索方法基于对达尔文进化论和生物系统自然选择的抽象,并用数学运算符表示它们:交叉或重组、变异、适应度以及适者生存(selection of the fittest)。遗传算法已经非常成功地解决了各种各样的优化问题,并且在这个问题上已经写了几千篇研究论文和数百本书籍。一些统计数据显示,绝大多数的财富 500 强公司现在都在使用它们来解决诸如计划、数据挖掘和调度等棘手的组合优化问题。

在同一时期,柏林工业大学(Technical University of Berlin)的两名学生,Ingo Rechenberg 和 Hans-Paul Schwefel,在 1963 年开发了一种用于解决航天工程优化问题的搜索技术,称为进化策略(evolutionary strategy)。后来,同学 Peter Bienert 加入他们,开始用简单的突变和选择规则构造一个自动实验装置。这项技术没有使用交叉只用突变来产生后代,并且每一代都保存一个改进的解。基本上是一个简单的具有随机化的轨迹式爬山算法。早在 1960 年,航天工程师 Lawrence J. Fogel 就打算将模拟进化作为一种研究人工智能的学习过程的工具。然后在 1966 年,Fogel 和 A. J. Owen 与 M. J. Walsh 通过将解表示为有限状态机并随机地突变其中一个,共同开发出进化规划(evolutionary programming)技术 [6]。这些创新的思想和方法已经演化为一种更广泛的学科,称为进化算法(evolutionary algorithms)或进化计算 (evolutionary computation)[10,18]。

虽然这里重点是元启发式算法,但其他算法一些也可以被认为是启发式优化技术。这些方法包括人工神经网络、支持向量机以及许多其他的机器学习技术。事实上,它们都试图通过反复的试错来最小化的学习错误和预测错误。

现在,人工神经网络在许多应用中经常被使用。1943 年,神经生理学家和控制学者 Warren McCulloch 和逻辑学家 Walter Pitts 提出将人工神经元作为简单的信息处理单元。神经网络的概念很可能是艾伦·图灵于 1948 年在 Intelligent Machinery 上发表的 NPL 报告中首次提出的 [3,21]。从 20 世纪 40 年代到 20 世纪 90 年代,神经网络领域得到了重大发展 [19]。

支持向量机(support vector machine)作为一种分类技术,可以追溯到 1963 年 Vladimir Vapnik 对线性分类器的早期研究,具有核的非线性分类技术由 Vapnik 和他的合作者在 20 世纪 90 年代开发完成。Vapnik 于 1995 年出版的 The Nature of Statistical Learning Theory 有系统的总结 [22]。

上世纪 80 年代到 90 年代这几十年对元启发式算法而言是最令人兴奋的时间。一个重要阶段是 1983 年开发的模拟退火(simulated annealing,SA),这是由 Scott Kirkpatrick 、C. Daniel Gellat 和 Mario P. Vecchi 首创的一种优化技术 [13]。它是一种基于轨迹的搜索算法,从高温的初始猜测解开始,逐渐冷却系统。如果有更好的选择,就会接受新解,否则,新解就会被以一定概率接受,这使得系统可以跳出局部最优。可以想到,如果系统冷却得足够慢,最终会达到全局最优解。

现代元启发式算法中首次使用记忆(memory)的,可能是 1986 年 Fred Glover 的禁忌搜索,尽管他在禁忌搜索上的影响深远的著作是在 1997 年出版的 [8]。

1992 年,Marco Dorigo 完成了他关于优化和自然算法的博士论文 [5],在论文中他描述了他对蚁群优化(ant colony optimization,ACO)的创新研究。这一搜索技术受到蚂蚁社会使用信息素作为化学信使的群体智能的启发。然后,在 1992 年,斯坦福大学的计算机科学家约翰·R·科扎(John R. Koza)发表了一篇关于遗传编程的论文,为机器学习的全新领域奠定了基础,革新了计算机编程 [14]。早在 1988 年,科扎就第一次申请了遗传编程专利。其基本思想是利用遗传原理来培育计算机程序,从而逐步为给定类型的问题生成最好的程序。

稍后的 1995 年,美国社会心理学家詹姆斯·肯尼迪(James Kennedy)和工程师罗素·E·埃伯哈特(Russell C. Eberhart)在粒子群优化(particle swarm optimization,PSO)的发展方面取得了重大的进展。简单地说,PSO 是一种受鱼类和鸟类的群体智能以及人类行为启发的优化算法。这些围绕搜索空间群集的代理被称为粒子,开始于初始猜测值。群体沟通当前最好的,分享全局最好的,以专注于高质量解。自开发以来,已有大约 20 种不同的粒子群优化技术,已应用于几乎所有困难的优化问题领域。尽管还远远没有定论,但有一些有力的证据表明,PSO 比传统的搜索算法更好,甚至比遗传算法更适合于许多不同类型的问题。

在 1996 年和 1997 年左右,Rainer Storn 和 Kenneth Price 开发了一种基于向量的进化算法,称为差分进化(differential evolution,DE)[20],在许多应用中被证明比遗传算法更有效。

1997年,由 David H.Wolpert 和 William G. Macready 发表的最优化没有免费的午餐定理,给优化界带来了冲击波 [23,24]。研究人员一直在努力寻找更好的算法甚至是普遍的健壮算法来进行优化,特别是对困难的NP-hard优化问题进行优化。然而,该定理表明,如果算法 A 在某些优化函数上优于算法 B,那么 B 将在其他函数上比 A 的性能好。也就是说,如果在所有可能的函数空间上取平均值,两个算法 A 和 B 的平均性能都是一样的。或者说,不存在普遍更好的算法。这是令人失望的。后来,人们意识到对于给定的优化问题,我们不需要在所有可能函数的平均值。我们想要的是找到最好的解,它与所有可能的函数空间没有任何关系。此外,我们可以接受这样一个事实,即没有万能的或神奇的(优化)工具,但我们从经验中知道,某些算法确实比其他算法在给定类型的优化问题上表现得更好。因此,现在的研究可能集中在寻找一组给定问题的最佳和最有效的算法。其目标是为大多数类型的问题设计更好的算法,而不是针对所有问题。因此,搜索仍在继续。

在 21 世纪之交,事情变得更加令人兴奋。首先,在 2001 年,Zong Woo Geem 等人开发了 和声搜索(harmony search,HS) 算法 [7],广泛应用于求解各种优化问题,如水资源分配、交通建模、调度等。2004 年,Sunil Nakrani 和 Craig Tovey 提出了蜜蜂算法(honeybee algorithm)及其优化互联网托管中心的应用 [16],2005 年 Xin-She Yang 开发了虚拟蜂算法(virtual bee algorithm)。与此同时,2005 年 D. T. Pham 等人开发了蜂算法(bees algorithm)[17],2005 年 Dervis Karaboga 开发了人工蜜蜂群(artificial bee colony,ABC) [11]。

2007 年底 2008 年初,Xin-She Yang 开发了萤火虫算法(firefly algorithm,FA) [25,26],该算法备受关注,2013 年 10 月在谷歌学者的搜索中显示,迄今为止已有 800 多份出版物。2009 年,英国剑桥大学的 Xin-She Yang 和印度拉曼工程学院的 Suash Deb 提出了一种高效的布谷鸟搜索(cuckoo search,CS)算法 [27,28],已被证明,CS 可以比大多数现有的元启发式算法更有效,其中包括粒子群优化。2010 年,基于小蝙蝠的回声定位行为,Xin-She Yang 开发了蝙蝠算法用于连续优化 [29]。2012 年由 Xin-She Yang 开发的花授粉算法(flower pollination algorithm),其效率非常高。

随着相关文献的迅速发表,自然启发式算法数量急剧增加。由 Iztok Fister Jr. 等人做的简要调查显示,有超过 40 种自然启发式算法。如我们所见,越来越多的元启发式算法正在开发中。

参考文献

[1] Auger A, Teytaud O. Continuous lunches are free plus the design of optimal optimization algorithms. Algorithmica 2010;57(2):121–46.

[2] Corne D, Knowles J. Some multiobjective optimizers are better than others. Evol Comput 2003;4(2):2506–12.

[3] Copeland BJ. The essential turing. Oxford, UK: Oxford University Press; 2004.

[4] De Jong K. An analysis of the behavior of a class of genetic adaptive systems. Ph.D. thesis, University of Michigan, Ann Arbor, MI, USA; 1975.

[5] Dorigo M. Optimization, learning and natural algorithms. Ph.D. thesis, Politecnico di Milano, Italy; 1992.

[6] Fogel LJ, Owens AJ, Walsh MJ. Artificial intelligence through simulated evolution. New York, NY, USA: Wiley; 1966.

[7] Geem ZW, Kim JH, Loganathan GV. A new heuristic optimization: harmony search. Simulation 2001;76(2):60–8.

[8] Glover F, Laguna M. Tabu search. Boston, MA, USA: Kluwer Academic Publishers; 1997.

[9] Holland J. Adaptation in natural and artificial systems. Ann Arbor, MI, USA: University of Michigan Press; 1975.

[10] Judea P. Heuristics. New York, NY, USA: Addison-Wesley; 1984.

[11] Karaboga D. An idea based on honeybee swarm for numerical optimization. Technical Report, Erciyes University, Turkey; 2005.

[12] Kennedy J, Eberhart R. Particle swarm optimization. In: Proceedings of the IEEE International Conference on Neural Networks, Piscataway, NJ, USA; 1995. p. 1942–48.

[13] Kirkpatrick S, Gellat CD, Vecchi MP. Optimization by simulated annealing. Science 1983;220(4598):671–80.

[14] Koza JR. Genetic programming: on the programming of computers by means of natural selection. Cambridge, MA, USA: MIT Press; 1992.

[15] Marshall JA, Hinton TG. Beyond no free lunch: realistic algorithms for arbitrary problem classes. WCCI 2010 IEEE world congress on computational intelligence, Barcelona, Spain, July 18–23; 2010. pp. 1319–1324.

[16] Nakrani S, Tovey C. On honeybees and dynamic server allocation in Internet hosting centers. Adapt Behav 2004;12(3):223–40.

[17] Pham DT, Ghanbarzadeh A, Koc E, Otri S, Rahim S, Zaidi M. The bees algorithm. Technical Note, Manufacturing Engineering Center, Cardiff University, Cardiff, UK; 2005.

[18] Schrijver A. On the history of combinatorial optimization (till 1960). In: Aardal K, Nemhauser GL, Weismantel R, editors. Handbook of discrete optimization. Amsterdam, Netherlands: Elsevier; 2005. p. 1–68.

[19] Siegelmann HT, Sontag ED. Turing computability with neural nets. Appl Math Lett 1991;4(1):77–80.

[20] Storn R, Price K. Differential evolution: a simple and efficient heuristic for global optimization over continuous spaces. J Global Optim 1997;11(4):341–59.

[21] Turing AM. Intelligent machinery. National Physical Laboratory, UK, Technical Report; 1948.

[22] Vapnik V. The nature of statistical learning theory. New York, NY, USA: Springer-Verlag; 1995.

[23] Wolpert DH, Macready WG. No free lunch theorems for optimization. IEEE Trans Evol Comput 1997;1(1):67–82.

[24] Wolpert DH, Macready WG. Coevolutionary free lunches. IEEE Trans Evol Comput 2005;9(6):721–35.

[25] Yang XS. Nature-inspired metaheuristic algorithms. Bristol, UK: Luniver Press; 2008.

[26] Yang XS. Firefly algorithms for multimodal optimization. In: Watanabe O, Zeugmann T, editors. Proceedings of fifth symposium on stochastic algorithms, foundations and applications, SAGA 2009. Lecture Notes in Computer Science, vol. 5792; 2009. p. 169–78.

[27] Yang XS, Deb S. Cuckoo search via Lévy flights. In: Proceedings of world congress on nature & biologically inspired computing (NaBic 2009). USA: IEEE Publications; 2009. p. 210–14.

[28] Yang XS, Deb S. Engineering optimization by cuckoo search. Int J Math Modelling Num Optim 2010;1(4):330–43. (2010).

[29] Yang XS. A new metaheuristic bat-inspired algorithm. Nature-inspired cooperative strategies for optimization (NICSO 2010), vol. SCI 284. Springer; 2010. p. 65–74.

本文翻译自 Yang X S. Nature-inspired optimization algorithms[M]. Elsevier, 2014. 有删节