Ojalgo中ExpressionsBasedModel.minimise()求解整数规划的有效性与结果获取
关于Ojalgo整数规划求解与结果获取的问题
1. model.minimise()是否足以求解整数模型?
默认情况下,ExpressionsBasedModel的minimise()方法不会自动适配整数规划(MILP)场景。如果模型包含整数变量,必须显式指定适配的MILP求解器,否则只会求解线性松弛问题,得到非整数解甚至像你遇到的均匀分配这类不符合预期的结果。
Ojalgo提供了多种MILP求解器实现,比如第三方的CoinMP、OOMPH,或内置的IntegerSolver。你需要在求解前为模型绑定合适的求解器,示例代码如下:
// 以CoinMP为例,需确保项目引入对应依赖 MIPSolver solver = new CoinMP(); model.setSolver(solver); // 执行求解并检查状态 Optimisation.Result result = model.minimise(); if (result.getState().isFeasible()) { // 求解成功,处理结果 } else { // 处理无解/不可行情况 }
注意:使用第三方求解器需添加对应依赖(如Maven引入org.ojalgo:ojalgo-coinmp);若不想依赖第三方库,可使用内置IntegerSolver,但它在大数据量场景下性能可能不如专业MILP求解器。
2. 获取求解结果的规范方式
求解成功后,有两种可靠的取值方式:
- 按变量名称获取(推荐):利用创建变量时指定的
obj.identifierString作为名称定位,避免索引顺序混乱,尤其适合大数据量场景:
for (DataObject obj : myData) { Variable var = model.getVariable(obj.identifierString); // 因变量设为整数约束,直接调用getIntValue()获取整数值 int varValue = var.getIntValue(); // 业务逻辑处理... }
- 按变量列表索引获取:若确定变量顺序与创建时完全一致,可遍历
model.getVariables():
List<Variable> variables = model.getVariables(); for (Variable var : variables) { int varValue = var.getIntValue(); // 业务逻辑处理... }
另外,也可通过Optimisation.Result对象按索引取值,但需注意索引与变量创建顺序严格对应:
Optimisation.Result result = model.minimise(); if (result.getState().isFeasible()) { for (int i = 0; i < result.countVariables(); i++) { // 因是整数变量,对结果取整 int varValue = (int) Math.round(result.get(i)); // 业务逻辑处理... } }
额外注意事项
- 大数据量场景下优先选择专业MILP求解器(如CoinMP),避免内置求解器性能不足;
- 检查约束配置:确认
cont.lower/cont.upper的取值、setLinearFactors传入的变量与系数对应关系是否符合业务逻辑,这是求解结果不符合预期的常见原因。
内容的提问来源于stack exchange,提问作者lmcdev
相关产品推荐
相关产品推荐

