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

ojAlgo中使用ConvexSolver后如何获取Optimisation.Result的变量值

解决ojAlgo 51.4.1中ConvexSolver求解后变量值获取问题

当你手动实例化ConvexSolver而非调用model.minimise()时,求解器不会自动将结果同步回原模型的Variable实例,且求解器返回的Optimisation.Result内部变量索引和模型变量顺序不匹配。可以通过保留ModelIntegration实例来解决这个问题,它维护了模型变量与求解器内部变量的映射关系。

方法一:手动映射变量索引取值

先保留ModelIntegration实例,求解后通过它找到每个模型变量对应的求解器索引,再从Result中取值,甚至可以把值同步回原变量:

// 保留ModelIntegration实例,不要直接链式调用
ConvexSolver.ModelIntegration integration = new ConvexSolver.ModelIntegration();
ConvexSolver solver = integration.build(model);
Optimisation.Result result = solver.solve();

if (result.getState().isOptimal()) {
    // 获取求解器输出的所有变量值数组
    double[] solverValues = new double[result.length()];
    result.get(solverValues);
    
    // 遍历模型变量,通过integration找到对应索引并取值
    for (Variable var : model.getVariables()) {
        int solverIndex = integration.indexOf(var);
        double value = solverValues[solverIndex];
        // 可选:将值同步回原Variable,这样就能用你原来的getVariablesValues方法了
        var.setValue(value);
    }
    
    // 现在可以用原方法获取值
    double[] finalValues = getVariablesValues(result);
}

方法二:一键同步结果到原模型

利用ModelIntegration的toModelState方法,直接将求解结果同步回原模型的所有变量,之后就能复用你原来的取值逻辑:

ConvexSolver.ModelIntegration integration = new ConvexSolver.ModelIntegration();
ConvexSolver solver = integration.build(model);
Optimisation.Result result = solver.solve();

if (result.getState().isOptimal()) {
    // 把求解结果同步到原模型的变量中
    integration.toModelState(result);
    // 直接调用原方法获取变量值
    double[] variableValues = getVariablesValues(result);
}

为什么会出现索引不匹配?

ConvexSolver内部会对变量做预处理(比如排序、合并等),导致其内部变量顺序和你添加到ExpressionsBasedModel的顺序不一致。ModelIntegration在构建求解器时记录了这种映射关系,所以必须通过它来关联模型变量和求解器的结果索引。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:57:49