除了 fmincon 之外还有其他更快、更高效的求解器吗?我正在使用 fmincon 来解决特定问题,但对于中等大小的向量变量来说,我的内存不足。我也没有任何超级计算机或云计算选项可供使用。我知道任何替代解决方案仍然会耗尽内存,但我只是想看看问题出在哪里。
附:我不想要一个会改变我处理实际问题的方式的解决方案。我知道凸优化是可行的方法,并且我已经做了足够的工作才能到达这里。
P.P.S 我看到了有关开源替代方案的另一个问题。那不是我要找的。我正在寻找更高效的解决方案,如果有人遇到同样的问题并转向更好的解决方案。
Hmmm...
如果没有进一步的信息,我猜fmincon
内存不足,因为它需要 Hessian(假设你的决策变量是 10^4,它将是10^4 x numel(f(x1,x2,x3,....))
大的)。
确定 Hessian 矩阵的值也需要花费很多时间,因为fmincon
如果您没有明确指定导数,通常会使用有限差分。
您可以采取一些措施来加快速度。
如果您事先知道 Hessian 矩阵中会有很多零,则可以通过以下方式传递 Hessian 矩阵的稀疏模式HessPattern
。这节省了大量的内存和计算时间。
如果很容易得出目标函数的 Hessian 矩阵的显式公式,请创建一个计算 Hessian 矩阵的函数并将其传递给fmincon
通过HessFcn
optimset 中的选项。
这同样适用于梯度。这GradConstr
(对于您的非线性约束函数)和/或GradObj
(对于您的目标函数)在此处申请。
我可能忘记了一些选项,它们也可以帮助您。只需浏览优化工具箱中的所有选项即可”optimset http://www.mathworks.nl/help/optim/ug/optimization-options-reference.html看看他们是否可以帮助你。
如果这一切都没有帮助,你真的必须切换优化器。鉴于fmincon
是 MATLAB 优化工具箱的骄傲和乐趣,确实没有更好的工具可用,您必须在其他地方搜索。
TOMLAB http://tomopt.com/tomlab/是一个非常好的MATLAB商业解决方案。如果你不介意使用 C 或 C++...有SNOPT http://www.sbsi-sol-optimize.com/asp/sol_product_snopt.htm(这是 TOMLAB/SNOPT 的基础)。您可以在 GSL 中尝试很多东西(尽管我还没有看到任何像 SNOPT 那样先进的东西......)。
我不知道您使用的是哪个版本的 MATLAB,但我知道在 R2009b(也可能更高版本)中,fmincon
对于某些类型的问题有一些真正的弱点。我知道这个很好,因为我曾经输掉了一场非常有声望的比赛(GTOC http://www.esa.int/Our_Activities/Operations/Global_Trajectory_Optimisation_Competition) 因为它。我们的方法结果是一模一样与获胜者一样,除了他们可以使用 SNOPT,这使得他们的数百万变量优化问题在几次迭代中收敛,而fmincon
无法收敛at all,无论我们尝试过什么(相信我,WE TRIED)。直到今天我仍然不知道为什么会发生这种情况,但是当我访问 SNOPT 时我自己验证了这一点。一旦我有无限多的时间,我就会发现这一点并将其报告给MathWorks。但直到那时...我失去了一点信任fmincon
:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)