Gurobi报50步模型不可行但手动有解且49步可行的原因咨询
问题核心原因
你遇到的50步场景不可行问题主要来自两个约束配置错误:
- D更新约束的步长参数偏移错误
你手动构造可行解时,D的更新公式用的是(step+1)/113880,但Gurobi模型里的D更新约束写的是(step)/113880,步长少了1,导致每一步D的下降幅度都比手动计算的更大,50步时D会提前跌破下界0,触发约束冲突。 - 初始约束重复添加
你把D[0]==1、C[0]==0.8*A、K[0]==0三个仅需执行一次的初始约束写在了for step in steps循环内部,相当于重复添加了num_steps次相同约束,虽然逻辑上不会直接导致不可行,但属于冗余配置,建议移到循环外部。
排查思路
你可以按以下步骤验证和修复:
- 先修复D更新约束的step偏移问题,把
f.addConstr(D[step + 1] == D[step] - (K[step] + (step)/113880)*0.2, name = 'D constr')里的step改成step+1,和手动逻辑对齐,再运行看是否可行。 - 如果修复后仍有问题,调用Gurobi自带的不可行约束集分析工具定位冲突:
生成的# 求解报不可行后运行 f.computeIIS() f.write("infeasible_model.ilp")infeasible_model.ilp文件会列出所有互相冲突的约束,你可以直接对应检查和手动逻辑不一致的地方。 - 你可以把自己手动构造的可行解作为初始解传入Gurobi,验证是否满足所有约束:
# 按你手动计算的结果给每个变量赋值 A.start = 500 B.start = 2 # 其他变量依次赋值,再运行求解,Gurobi会提示哪些约束不满足
内容的提问来源于stack exchange,提问作者midav
相关产品推荐
相关产品推荐

