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

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

这个速度正常吗?

是因为ojAlgo使用的是BigDecimal(不是很确定,我在那里的代码中看到过double),而lpsolve可能在使用int

我可以做些什么吗?

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

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

最佳答案

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

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

ojAlgo在模型和求解器之间进行分隔。该模型在内部使用BigDecimal。该模型分析问题并根据问题特征调用不同的求解器。求解器可以使用所需的任何数字类型。内置的ojAlgo求解器可与原始double一起使用。

您可以在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尚未集成...

09-12 00:21