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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 01:52:41