2011-04-17 30 views
4

因为Excel求解器在数千次优化(原因是它使用电子表格作为接口)上运行速度很慢,我试图实现一个类似的(特定于问题的)解决方案在C++中(使用Visual Studio 2010,在Win 7 64位平台上)。我会通过VBA中的Declare语句来包含DLL,并且已经有这方面的经验,所以这不是问题。在C++中寻找优化算法来替换Excel求解器

我的问题是最小化经验数据与非线性但平滑的目标函数之间的平方误差的总和,问题将包括非负性(X> = 0)或甚至是正性约束(例如X > = 0.00000001),其中X表示决策变量。

我正在寻找一个强大的,经过验证的实现。它可能是已建立图书馆的一部分。例如,我已经研究了ALGLIB存储的内容(请参阅http://www.alglib.net/optimization/),似乎只有其中一个算法接受有界约束。但我不知道它有什么价值,因此我试图收集一些意见。

或者,在另一个说明中,最好是用这样的基本约束来增强ALGLIB的Levenberg-Marquardt算法,例如通过拒绝不符合我的约束条件的每个中间解决方案? (猜测不会这样做,但仍值得问)

回答

2

对Levenberg-Marquardt方法进行了修改,增加了对不等式约束的支持。我知道一个库实现了这样的算法: levmar(GPL)。

如果您想修改现有的算法,拒绝不良解决方案不会执行,优化可能会卡住。但是您可以进行变量替换,例如为确保X> 0.1,您可以使用t^2 + 0.1而不是X. 我使用此方法作为解决方案,以解决程序中缺少内置框约束的问题。下面是从数据在化学科学由彼得·甘斯,更好地描述它装修报价: https://github.com/wojdyr/fityk/wiki/InequalityConstraints

0

我们发现OPTIF9 and UNCMIN是选择的标准方法。 如果您不想打扰编译Fortran,您应该能够将它们链接到库中,并从C++, 中调用它们。

对搜索空间施加限制的一种方法是转换参数,例如通过logit函数。

0

你看过Microsoft Solver Foundation吗?快递版本是免费的,并附带.NET 4.0 dll。我发现它很容易使用。另一方面,我不知道你说的问题有多大:快递版中变量的数量有一些限制。