You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ojAlgo SimplexSolver获取对偶变量、缩减成本及指定求解器

ojAlgo 51.4.0线性规划求解问题解答

针对使用ojAlgo 51.4.0版本Simplex求解线性规划时遇到的对偶变量、缩减成本获取及求解器指定问题,解答如下:


1. 获取对偶变量

result.getMultipliers()返回空的原因是未启用对偶变量计算,且需确保使用的求解器支持输出对偶信息。正确步骤:

  • 先指定使用SimplexSolver(见问题3)
  • 通过模型选项启用对偶变量计算:
    primModel.options.setParameter(SolverUtils.INCLUDE_DUALS, true);
    
  • 求解完成后,result.getMultipliers()即可获取对偶变量,其顺序与原模型中约束的添加顺序(a1、a2、a3)一一对应。

2. 获取缩减成本

缩减成本可直接从模型的Variable实例中读取,求解完成后调用getReducedCost()方法:

double x1ReducedCost = x1.getReducedCost();
double x2ReducedCost = x2.getReducedCost();

注:最优解中基变量的缩减成本为0,非基变量的缩减成本反映该变量增加单位值对目标函数的影响。


3. 强制使用SimplexSolver的最佳方式

你当前使用的debug(SimplexSolver.class)是调试专用方法,并非正式指定求解器的API。正确方式是使用Optimisation.Options的setSolver()方法:

primModel.options.setSolver(SimplexSolver.class);

该方法是替代已废弃addPreferredSolver()的官方推荐方案,能确保ojAlgo优先使用指定的SimplexSolver。


修改后的示例代码

/**
 * 问题:最大化 2*x1 + 3*x2
 * 约束条件:
 *      4*x1 + 8*x2 ≤ 12
 *      2*x1 + x2 ≤ 3
 *      3*x1 + 2*x2 ≤ 4
 *      x1, x2 ≥ 0
 */
ExpressionsBasedModel primModel = new ExpressionsBasedModel();
Variable x1 = primModel.addVariable("X1").lower(0).weight(2);
Variable x2 = primModel.addVariable("X2").lower(0).weight(3);

Expression a1 = primModel.addExpression();
Expression a2 = primModel.addExpression();
Expression a3 = primModel.addExpression();

a1.set(x1, 4).set(x2, 8).upper(12);
a2.set(x1, 2).set(x2, 1).upper(3);
a3.set(x1, 3).set(x2, 2).upper(4);

// 配置求解器并启用对偶计算
primModel.options.setSolver(SimplexSolver.class);
primModel.options.setParameter(SolverUtils.INCLUDE_DUALS, true);

Optimisation.Result result = primModel.maximise();

// 输出对偶变量
Optional<Access1D<?>> multipliers = result.getMultipliers();
if (multipliers.isPresent()) {
    Access1D<?> dualVars = multipliers.get();
    System.out.println("对偶变量(对应约束a1、a2、a3):");
    for (int i = 0; i < dualVars.count(); i++) {
        System.out.printf("λ%d = %.4f%n", i+1, dualVars.doubleValue(i));
    }
}

// 输出缩减成本
System.out.println("缩减成本:");
System.out.printf("X1: %.4f%n", x1.getReducedCost());
System.out.printf("X2: %.4f%n", x2.getReducedCost());

System.out.println(result.toString());

内容的提问来源于stack exchange,提问作者Taxation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:57:15