调用Mosek的getSolverIntInfo获取约束数返回0的问题咨询
Mosek获取约束数量返回0的问题原因及解决方法
核心原因
你调用的getSolverIntInfo("anaProNumCon")是求解器运行完分析/求解流程后才会赋值的内部统计字段,你在构造完模型后直接读取该字段,此时求解器还未对模型进行编译、预处理、分析操作,对应字段未被初始化,因此返回0。
修复方案
你可以根据使用场景选择两种解决方案:
- 方案1:先触发求解流程,再读取求解器内部统计值
只需要在调用getSolverIntInfo前添加求解触发代码即可:
运行后// 原有模型构建代码不变 M->objective("obj", ObjectiveSense::Minimize, Expr::sum(y)); // 新增:触发求解,完成模型分析流程 M->solve(); int anaProNumCon = M->getSolverIntInfo("anaProNumCon");anaProNumCon就会返回求解器分析后的有效约束数量。 - 方案2:无需求解,直接读取模型原生约束计数
如果你不需要运行求解,只需要统计自己主动添加的约束总数,直接调用Model类原生的计数接口即可:
该接口不需要触发求解流程,模型构建完成后即可直接调用,会返回你添加的1个线性约束+2个锥约束的总计数3,符合你的预期。int conNum = M->getNumConstraints();
补充说明
anaProNumCon统计的是求解器预处理后的内部约束数,可能和你主动添加的约束数存在细微差异:比如部分冗余约束被预处理合并、变量域约束被转为隐含约束等。如果仅需要统计用户显式添加的约束,优先使用getNumConstraints接口即可。
内容的提问来源于stack exchange,提问作者kstn
相关产品推荐
相关产品推荐

