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
相关产品推荐
相关产品推荐

