我对线性编程还很陌生,我确实使用lpsolve解决了我的第一个问题(通过JavaILP包装器从Java调用二进制dll,以获取更多面向对象的代码),而且速度非常快(50毫秒)。
然后,我决定避免使用本机代码(如果可能的话),并使用ojAlgo重新编写所有内容,对于2100个变量的问题,解决时间从50毫秒增加到1089毫秒。
这个速度正常吗?
是因为ojAlgo在使用BigDecimal
(不是很确定,我在那里的代码中看到过double
s),而lpsolve可能正在使用int
s ?
我可以做些什么吗?
另一方面,找到的最大值从1013
增加到OPTIMAL 1249
,这很好。 (使用lpsolve我什至不知道存在更好的解决方案)
edit:我没有注意到几个表达式名称发生冲突,我想这会使它们彼此覆盖;现在我解决了这个问题,并在8270毫秒内找到了OPTIMAL 1013
解决方案。
答案 0 :(得分:1)
纯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的集成...