除了fmincon之外,还有更快更有效的求解器吗?我正在使用fmincon来解决特定问题,而且我的内存不足以获得适当大小的矢量变量。我也没有任何超级计算机或云计算选项。我知道任何替代解决方案仍然会耗尽内存,但我只是想看看问题出在哪里。
P.S。我不想要一个能改变我接近实际问题的方法的解决方案。我知道凸优化是可行的方法,我已经做了足够的工作,直到这里起床。
P.P.S我看到了关于开源替代品的另一个问题。那不是我想要的。我正在寻找更高效的,如果有人遇到同样的问题,并转移到更好的解决方案。
答案 0 :(得分:3)
嗯...
如果没有进一步的信息,我猜测fmincon
内存不足,因为它需要Hessian(假设你的决策变量是10 ^ 4,那么10^4 x numel(f(x1,x2,x3,....))
会很大)。
确定Hessian的值也需要花费大量时间,因为如果没有明确指定派生,fmincon
通常会使用有限差分。
你可以采取一些措施来加快速度。
如果你事先知道你的Hessian会有很多零,你可以通过HessPattern
传递Hessian矩阵的稀疏模式。这节省了大量的内存和计算时间。
如果很容易想出目标函数的Hessian的显式公式,请创建一个计算Hessian的函数,并通过fmincon
选项将其传递给HessFcn
在优化中。
渐变也是如此。 GradConstr
(对于您的非线性约束函数)和/或GradObj
(对于您的目标函数)适用于此处。
我可能会忘记这里的一些选项,这也可以帮到你。只需浏览优化工具箱“optimset中的所有选项,看看它们是否可以为您提供帮助。
如果所有这些都无济于事,那么你真的必须切换优化器。鉴于fmincon
是MATLAB优化工具箱的骄傲和喜悦,实际上没有更好的可用性,你必须在别处搜索。
TOMLAB是一个非常好的MATLAB商业解决方案。如果你不介意去C或C ++ ......有SNOPT(这是TOMLAB / SNOPT所基于的)。你可以在GSL中尝试一些东西(虽然我没有看到像SNOPT那样先进的东西......)。
我不知道您的MATLAB版本是什么,但我知道在R2009b(可能还有以后)中,fmincon
对某些类型的问题有一些真正的弱点。我知道 非常好 ,因为我因此而失去了一场非常有声望的比赛(GTOC)。我们的方法与赢家的方法完全相同,除了他们可以访问SNOPT,这使得他们的几百万个变量优化问题在几次迭代中收敛,而{{1}无论我们尝试什么(并且相信我, WE TRIED ),无法将汇集到所有。直到今天,我仍然不知道为什么会发生这种情况,但是当我访问SNOPT时,我自己验证了这一点。有一次,当我有无限的时间时,我会发现这一点并向MathWorks报告。但在那之前......我对fmincon
:)