4

由于 Excel Solver 在数以千计的优化上运行起来非常慢(原因是它使用电子表格作为界面),我试图在 C++ 中实现一个类似的(特定于问题的)求解器(使用 Visual Studio 2010,在 Win 7 64 位平台)。我将通过 VBA 中的 Declare 语句包含 DLL,并且已经有这样做的经验,所以这不是问题。

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

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

或者,另一方面,是否建议使用此类基本约束来增强 ALGLIB 的 Levenberg-Marquardt 算法,例如通过拒绝每个不满足我的约束的中间解决方案?(猜猜不会这样做,但仍然值得一问)

4

3 回答 3

2

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

如果你想修改现有的算法,拒绝糟糕的解决方案是不行的,优化很可能会卡住。但是您可以进行变量替换,例如,为了确保 X > 0.1,您可以使用 t^2+0.1 代替 X。我使用此方法作为我的程序中缺少内置框约束的解决方法。这是Peter Gans 在化学科学中的数据拟合的引述,它更好地描述了它: https ://github.com/wojdyr/fityk/wiki/InequalityConstraints

于 2011-04-17T14:16:50.210 回答
0

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

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

于 2011-04-17T15:40:36.813 回答
0

您是否查看过Microsoft Solver Foundation?快速版是免费的,并带有一个 .NET 4.0 dll。我发现它相当容易使用。另一方面,我不知道你说的问题有多大:特快版的变量数量有一些限制。

于 2011-07-25T00:36:11.393 回答