我想用ojAlgo (版本51.4.0)的单纯形来解决一个线性问题,并且能够检索它的对偶变量以及它降低的成本。我期望getMultipliers()方法从Result返回双变量,但在我的示例中并非如此(参见下面的代码)。
我的问题如下:
SimplexSolver)?对于问题3,我使用了primModel.options.debug(SimplexSolver.class),因为不推荐addPreferredSolver()。在工作的时候,我想知道是否有更好的方法。
我希望能够在ojAlgo分叉之外检索这些信息( PrimalSimplex和DualSimplex类在这里看起来很有趣,但不能使用,因为它们不能从包外部访问)。
/**
* problem from https://www.cs.cmu.edu/afs/cs.cmu.edu/academic/class/15859-f11/www/notes/lecture05.pdf
*
* problem: maximize 2 * x1 + 3 *x2
* s.t. 4 * x1 + 8 * x2 <= 12
* 2 * x1 + x2 <= 3
* 3 * x1 + 2 * x2 <= 4
* x1, x2 >= 0
*/
ExpressionsBasedModel primModel = new ExpressionsBasedModel(); // problem to solve
Variable x1 = primModel.addVariable("X1").lower(0).weight(2); // maximize 2 * x1
Variable x2 = primModel.addVariable("X2").lower(0).weight(3); // ... + 3 * x2
Expression a1 = primModel.addExpression(); // constraints to respect
Expression a2 = primModel.addExpression();
Expression a3 = primModel.addExpression();
a1.set(x1, 4).set(x2, 8).upper(12); // 4 * x1 + 8 * x2 <= 12
a2.set(x1, 2).set(x2, 1).upper(3); // 2 * x1 + x2 <= 3
a3.set(x1, 3).set(x2, 2).upper(4); // 3 * x1 + 2 * x2 <= 4
// force the use of simplex (question 3)
primModel.options.debug(SimplexSolver.class);
Optimisation.Result result = primModel.maximise();
// does not give the dual variables: no value present within the optional
Optional<Access1D<?>> multipliers = result.getMultipliers();
System.out.println(result.toString());任何帮助都将不胜感激。谢谢!
发布于 2022-08-23 14:06:13
LinearSolver确实返回了对偶变量,但是:
ExpressionsBasedModel生成的,从LP约束到模型的变量和表达式的下/上限的反向映射没有实现。因此,ExpressionsBasedModel返回的结果不包含对偶变量。要获得双变量,您必须跳过使用ExpressionsBasedModel,而不是直接使用LinearSolver中的构建器。如果要控制ExpressionsBasedModel将选择哪个求解器,则必须编写ExpressionsBasedModel.Integration的实现代码,然后使用ExpressionsBasedModel#addIntegration(Integration<?>)注册该实现。此功能能够使用3:d的解决方案,如CPLEX、GUROBI、MOSEK和其他。
https://stackoverflow.com/questions/73459391
复制相似问题