在C ++中寻找优化算法来取代Excel Solver

时间:2011-04-17 01:59:39

标签: algorithm excel optimization solver levenberg-marquardt

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

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

我正在寻找一种强大的,经过验证的实施方案。它可能是已建立的图书馆的一部分。 例如,我已经查看了ALGLIB存储的内容(参见http://www.alglib.net/optimization/),似乎只有一个算法接受有界约束。但我不知道它的价值是多少,这就是我试图收集一些意见的原因。

或者,另一方面,建议用这样的基本约束来增加ALGLIB的Levenberg-Marquardt算法,例如拒绝每个不满足我约束条件的中间解决方案吗? (猜测不会这样做,但仍然值得一提)

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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