2

我对线性编程很陌生,我确实用 lpsolve 解决了我的第一个问题(从 Java 调用的二进制 dll,通过 JavaILP 包装器具有更多面向对象的代码),而且速度非常快(50 毫秒)。

然后我决定避免使用本机代码(如果可能)并使用 ojAlgo 重新编写所有内容,对于我的 2100 个变量问题,求解时间从 50 毫秒增加到 1089 毫秒。

这个速度是正常/预期的吗?

是不是因为 ojAlgo 正在使用BigDecimal(不太确定是这样,我double在那里和那里的代码中看到了 s)并且 lpsolve 可能正在使用ints?

我能做点什么吗?

另一方面,发现的最大值从1013增加到OPTIMAL 1249,这很好。(使用 lpsolve 我什至不知道存在更好的解决方案)

编辑:我没有注意到一些表达式名称发生冲突,我猜这使它们相互覆盖;现在我解决了这个问题,并OPTIMAL 1013在 8270 毫秒内找到了解决方案。

4

1 回答 1

2

纯 java 求解器比本机代码慢是完全正常的。

你有整数变量吗?如果你这样做了,那么这就是一个 MIP,而且这些问题可能很难解决。

ojAlgo 将模型和求解器分开。该模型在内部使用 BigDecimal。该模型分析问题并根据问题特征调用不同的求解器。求解器可以使用他们想要的任何数字类型。内置的 ojAlgo 求解器使用原始双精度。

您可以在 ojAlgo 中插入您喜欢的任何求解器。已经集成了 3 个顶级商业求解器:

https://github.com/optimatika/ojAlgo-extensions/tree/develop/ojAlgo-cplex

https://github.com/optimatika/ojAlgo-extensions/tree/develop/ojAlgo-gurobi

https://github.com/optimatika/ojAlgo-extensions/tree/develop/ojAlgo-mosek

还有其他可用的纯 java、开源、LP 求解器:

https://github.com/optimatika/ojAlgo-extensions/tree/develop/ojAlgo-joptimizer

https://github.com/optimatika/ojAlgo-extensions/tree/develop/ojAlgo-commons-math3

lpsolve 还没有集成...

于 2018-10-19T07:47:38.263 回答