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

Gurobi判定模型不可行但手动可构造解的Python实现问题排查

Gurobi模型判定不可行的原因及解决方案

核心问题原因

  • 索引逻辑错位,和手动计算逻辑不匹配:你在D变量的更新约束中使用了J[step+1]参与计算,但J的绝对值约束仅绑定了J[step] = abs(E[step]-F[step]),J[step+1]没有绑定对应步的E、F差值;当循环到最后一步step=2时,J[3]完全没有约束,属于自由变量,会直接触发约束冲突。同时你手动计算时J取的是当前步的E、F差值,和模型中取下一个步J的逻辑完全不符。
  • D更新的步长系数不匹配:你模型循环的step取值为0、1、2,D更新式中用的是step/1000,但手动计算时step取值为1、2、3,系数差了1,逻辑不一致。
  • G变量上限约束冲突:你给G[step]设置的上限为8,但p约束定义为G[step] = 10 + E[step] - F[step],仅当E[step]-F[step] <= -2时G才符合上限要求,只要逻辑中E、F的差值不满足这个条件就会直接不可行,你手动给出的例子刚好卡到8的上限,模型求解时稍微有数值偏差就会触发冲突。
  • 初始化约束重复添加:D[0]==1和C[0]==0.8*A这两个全局初始化约束写在了step循环内,会被重复添加3次,属于不规范写法,容易引发隐式数值问题。

修复方案

  1. 修正D更新约束的索引:将J[step+1]改为J[step],保证用当前步的E、F差值的绝对值计算D的更新,和手动逻辑对齐。
  2. 修正步长系数:将D更新式中的step/1000改为(step+1)/1000,和手动计算的步长系数匹配。
  3. 调整G变量的上限:如果业务逻辑允许,将G的上限从8调高到至少10+E的最大可能值;如果G确实不能超过8,额外添加约束E[step] - F[step] <= -2保证G的取值符合上限要求。
  4. 把D[0]==1和C[0]==0.8*A两个初始化约束移到step循环外,避免重复添加。
  5. 可以调用Gurobi的IIS工具定位冲突:在f.optimize()后添加f.computeIIS()和f.write('infeasible.ilp'),输出的ilp文件会直接列出所有冲突的约束,方便快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:27:00