首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用来自SimplexSolver的ojAlgo的双重成本和降低成本

使用来自SimplexSolver的ojAlgo的双重成本和降低成本
EN

Stack Overflow用户
提问于 2022-08-23 13:13:33
回答 1查看 29关注 0票数 1

我想用ojAlgo (版本51.4.0)的单纯形来解决一个线性问题,并且能够检索它的对偶变量以及它降低的成本。我期望getMultipliers()方法从Result返回双变量,但在我的示例中并非如此(参见下面的代码)。

我的问题如下:

  1. 如何检索双变量?
  2. 如何检索降低的成本?
  3. 是强制使用一个求解器的最佳方法(在我的例子中是SimplexSolver)?

对于问题3,我使用了primModel.options.debug(SimplexSolver.class),因为不推荐addPreferredSolver()。在工作的时候,我想知道是否有更好的方法。

我希望能够在ojAlgo分叉之外检索这些信息( PrimalSimplexDualSimplex类在这里看起来很有趣,但不能使用,因为它们不能从包外部访问)。

代码语言:javascript
复制
/**
 * 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());

任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-23 14:06:13

LinearSolver确实返回了对偶变量,但是:

  1. 当LP是从ExpressionsBasedModel生成的,从LP约束到模型的变量和表达式的下/上限的反向映射没有实现。因此,ExpressionsBasedModel返回的结果不包含对偶变量。要获得双变量,您必须跳过使用ExpressionsBasedModel,而不是直接使用LinearSolver中的构建器。

  1. 在线性求解程序/构建器代码中,如果需要或不需要对偶,则需要处理逻辑。不记得这到底是怎么回事。我认为,当你使用建设者,你总是得到二元化。你得检查一下。

如果要控制ExpressionsBasedModel将选择哪个求解器,则必须编写ExpressionsBasedModel.Integration的实现代码,然后使用ExpressionsBasedModel#addIntegration(Integration<?>)注册该实现。此功能能够使用3:d的解决方案,如CPLEX、GUROBI、MOSEK和其他。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73459391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档