找到一个平滑的、有界的、非凸的 2D 函数的全局最小值,该函数的评估成本很高

计算科学 优化
2021-12-04 22:34:31

我有一个有界非凸二维函数,我想找到它的最小值。功能相当流畅。评估它的成本很高。可接受的误差大约是每个轴上函数域的 3%。

我尝试在 NLOPT 库中运行 DIRECT 算法的实现,但在所需精度所需的函数评估量方面,它并没有比蛮力搜索有相当大的改进,并且存在一些异常值。

我应该考虑哪些其他全局优化求解器?

4个回答

与其他答案相比,我想提出一种稍微不同的方法,尽管@barron 间接讨论了同样的事情。

而不是直接优化你的函数,即通过在一系列点上评估它点(希望)收敛到(本地)最佳,您可以使用的概念,它非常适合您描述的类型的问题(高成本、平滑、有界、低维,即少于 20 个未知数)。x1,x2,,xksurrogate modelling

具体来说,代理建模的工作原理是为你的真实函数建立一个模型函数 ^d \rightarrow \mathbb{R} 。关键是虽然当然不能完美地代表,但评估起来要便宜得多。cRdRfRdRcf

因此,典型的优化过程如下:

  1. 在一组个初始点处计算请注意,不需要导数。另请注意,这些点应均匀分布在整个搜索空间中,例如通过拉丁超立方采样或类似的空间填充设计。fjx1,x2,,xj
  2. 基于这个原始数据集,创建一个模型函数您可以使用交叉验证来验证您的模型(即仅使用原始点的一个子集来创建,然后使用数据集的其余部分来检查预测这些值的程度)cjcc
  3. 使用诸如预期改进 (EI) 标准之类的标准来找出“填充”更多样本的位置,以更准确这实际上在理论上比看起来要好得多,而且 EI 标准也得到了很好的研究。EI 标准也不是一个贪心标准,因此你们都可以很好地整体提高模型精度,同时优先考虑接近潜在最优值的精度。cf
  4. 如果您的模型不够准确,请重复步骤 3,否则使用您最喜欢的优化例程来找到的最优值,这将非常便宜(因此您可以使用任何您想要的例程,甚至是需要导数的例程,或者简单地在精细网格中评估函数)。c

一般来说,正如@barron 所建议的那样,这就是 EGO(高效全局优化)的含义。我想强调一下,对于您的应用程序,这似乎非常合适——您基于相对较少的评估获得了一个令人惊讶的准确模型,然后可以使用您想要的任何优化算法。通常也很有趣的是,您现在可以在网格上评估并绘制它,从而深入了解的一般外观。另一个有趣的点是,大多数代理建模技术还提供统计误差估计,从而允许进行不确定性估计。fcf

如何构造当然是一个悬而未决的问题,但通常使用克里金法或所谓的空间映射模型。c

当然,这都是相当多的编码工作,但是很多其他人已经做了非常好的实现。在Matlab中,我只知道DACE软件工具箱DACE是免费的。TOMLAB 也可能提供一个 Matlab 包,但要花钱——不过,我相信它也可以在 C++ 中工作,并且比 DACE 拥有的功能要多得多。(注:我是新版 DACE 的开发者之一,即将发布,将增加对 EGO 的支持。)

希望这个粗略的概述对您有所帮助,如果有可以更清楚的要点或我遗漏的内容,或者您​​想要有关该主题的更多材料,请提出问题。

LM Rios 和 NV Sahinidis, 无导数优化:算法回顾和软件实现比较

对于求解器的一个非常有用的最近比较。

DOI: 10.1007/s10898-012-9951-y

对于平滑函数,高效全局优化方法应该执行得相当好,并且比 DIRECT 更有效。TOMLAB (我自己没有使用过)和DAKOTA 我已经取得了一些成功)中提供了实现。

由于函数是光滑的,牛顿法将是找到最小值的最有效的方法。由于该函数不是凸函数,因此您必须应用通常的技巧来使牛顿方法收敛(Levenberg-Marquardt 修正、线搜索或信任区域以进行全球化)。如果您无法获得函数的导数,请尝试通过有限差分或使用 BFGS 更新来计算它。如果您怀疑该问题具有多个局部最小值,则只需从一堆随机或不太随机选择的点开始牛顿法,然后查看它们收敛的位置。