由于 Excel Solver 在进行数千次优化时运行速度非常慢(原因是它使用电子表格作为界面),我试图在 C++ 中实现一个类似的(特定于问题的)求解器(使用 Visual Studio 2010,在 Win 7 64 位平台上)。我会通过 VBA 中的 Declare 语句包含 DLL 并且已经有这样做的经验,所以这不是问题。
我的问题是最小化经验数据和非线性但平滑的目标函数之间的误差平方和,该问题将包括非负性 (X>=0) 甚至正性约束(例如 X> =0.00000001), X 表示决策变量。
我正在寻找一个可靠的、经过验证的实现方案。它可能是已建立的图书馆的一部分。 例如,我已经研究过 ALGLIB 中的内容(请参阅 http://www.alglib.net/optimization/ ),似乎他们的算法中只有一种接受有界约束。但是我不知道它的值(value)是多少,这就是为什么我试图收集一些意见。
或者,换句话说,是否建议使用此类基本约束来增强 ALGLIB 的 Levenberg-Marquardt 算法,例如拒绝所有不满足我的约束的中间解决方案? (估计不行,但还是值得一问)
最佳答案
对 Levenberg-Marquardt 方法进行了修改,增加了对不等式约束的支持。我知道一个实现这种算法的库: levmar (GPL)。
如果您想修改现有算法,拒绝不好的解决方案是不行的,优化很可能会卡住。但是您可以进行变量替换,例如为确保 X > 0.1,您可以使用 t^2+0.1 而不是 X。 我使用此方法作为我的程序中缺少内置框约束的解决方法。以下是彼得·甘斯 (Peter Gans) 对化学科学中的数据拟合 的引述,对它进行了更好的描述: https://github.com/wojdyr/fityk/wiki/InequalityConstraints
关于algorithm - 在 C++ 中寻找优化算法来替换 Excel Solver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5690966/