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