我是线性编程的新手,我确实使用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尚未集成...