我有一个有界非凸二维函数,我想找到它的最小值。功能相当流畅。评估它的成本很高。可接受的误差大约是每个轴上函数域的 3%。
我尝试在 NLOPT 库中运行 DIRECT 算法的实现,但在所需精度所需的函数评估量方面,它并没有比蛮力搜索有相当大的改进,并且存在一些异常值。
我应该考虑哪些其他全局优化求解器?
我有一个有界非凸二维函数,我想找到它的最小值。功能相当流畅。评估它的成本很高。可接受的误差大约是每个轴上函数域的 3%。
我尝试在 NLOPT 库中运行 DIRECT 算法的实现,但在所需精度所需的函数评估量方面,它并没有比蛮力搜索有相当大的改进,并且存在一些异常值。
我应该考虑哪些其他全局优化求解器?
与其他答案相比,我想提出一种稍微不同的方法,尽管@barron 间接讨论了同样的事情。
而不是直接优化你的函数,即通过在一系列点上评估它点(希望)收敛到(本地)最佳,您可以使用的概念,它非常适合您描述的类型的问题(高成本、平滑、有界、低维,即少于 20 个未知数)。
具体来说,代理建模的工作原理是为你的真实函数建立一个模型函数 ^d \rightarrow \mathbb{R} 。关键是虽然当然不能完美地代表,但评估起来要便宜得多。
因此,典型的优化过程如下:
一般来说,正如@barron 所建议的那样,这就是 EGO(高效全局优化)的含义。我想强调一下,对于您的应用程序,这似乎非常合适——您基于相对较少的评估获得了一个令人惊讶的准确模型,然后可以使用您想要的任何优化算法。通常也很有趣的是,您现在可以在网格上评估并绘制它,从而深入了解的一般外观。另一个有趣的点是,大多数代理建模技术还提供统计误差估计,从而允许进行不确定性估计。
如何构造当然是一个悬而未决的问题,但通常使用克里金法或所谓的空间映射模型。
当然,这都是相当多的编码工作,但是很多其他人已经做了非常好的实现。在Matlab中,我只知道DACE软件工具箱DACE是免费的。TOMLAB 也可能提供一个 Matlab 包,但要花钱——不过,我相信它也可以在 C++ 中工作,并且比 DACE 拥有的功能要多得多。(注:我是新版 DACE 的开发者之一,即将发布,将增加对 EGO 的支持。)
希望这个粗略的概述对您有所帮助,如果有可以更清楚的要点或我遗漏的内容,或者您想要有关该主题的更多材料,请提出问题。
由于函数是光滑的,牛顿法将是找到最小值的最有效的方法。由于该函数不是凸函数,因此您必须应用通常的技巧来使牛顿方法收敛(Levenberg-Marquardt 修正、线搜索或信任区域以进行全球化)。如果您无法获得函数的导数,请尝试通过有限差分或使用 BFGS 更新来计算它。如果您怀疑该问题具有多个局部最小值,则只需从一堆随机或不太随机选择的点开始牛顿法,然后查看它们收敛的位置。