Pyomo中InfeasibleConstraintException错误原因及解决方法咨询
Pyomo模型求解报错问题处理
运行代码
from pyomo.environ import * model = ConcreteModel() model.q11, model.q12, model.q13, model.q21, model.q22, model.q23, model.q31, model.q32, model.q33 = [Var(bounds=(0.0, 11.0), within=Integers, initialize=0.0) for i in range(9)] model.s1, model.s2, model.s3 = [Var(bounds=(0.0, 1.0), within=Binary, initialize=0.0) for i in range(3)] model.S1, model.S2, model.S3 = [Var(bounds=(0.0, 100.0), within=Integers, initialize=0.0) for i in range(3)] model.c1 = Constraint(expr=model.q11*model.s1*model.S1 + model.q12*model.s1*model.S1 + model.q13*model.s1*model.S1 >= 130.0 - 3.0) model.c2 = Constraint(expr=model.q11*model.s1*model.S1 + model.q12*model.s1*model.S1 + model.q13*model.s1*model.S1 <= 130.0 + 3.0) model.c3 = Constraint(expr=model.q21*model.s2*model.S2 + model.q22*model.s2*model.S2 + model.q23*model.s2*model.S2 >= 130.0 - 3.0) model.c4 = Constraint(expr=model.q21*model.s2*model.S2 + model.q22*model.s2*model.S2 + model.q23*model.s2*model.S2 <= 130.0 + 3.0) model.c5 = Constraint(expr=model.q31*model.s3*model.S3 + model.q32*model.s3*model.S3 + model.q33*model.s3*model.S3 >= 130.0 - 3.0) model.c6 = Constraint(expr=model.q31*model.s3*model.S3 + model.q32*model.s3*model.S3 + model.q33*model.s3*model.S3 <= 130.0 + 3.0) model.c7 = Constraint(expr=model.q11 + model.q12 + model.q13 <= 11.0) model.c8 = Constraint(expr=model.q21 + model.q22 + model.q23 <= 11.0) model.c9 = Constraint(expr=model.q31 + model.q32 + model.q33 <= 11.0) model.objective = Objective(expr=model.s1 + model.s2 + model.s3, sense=minimize) SolverFactory('mindtpy').solve(model, mip_solver='glpk', nlp_solver='ipopt') model.objective.display() model.display() model.pprint()
报错信息
Trivial constraint c1 violates LB 127.0 ≤ BODY 0. Traceback (most recent call last): File "/Users/francopiccolo/Git/GitHub/data-in-action/clothes-production-optimization/venv/lib/python3.12/site-packages/pyomo/contrib/mindtpy/algorithm_base_class.py", line 1097, in solve_subproblem TransformationFactory('contrib.deactivate_trivial_constraints').apply_to( File "/Users/francopiccolo/Git/GitHub/data-in-action/clothes-production-optimization/venv/lib/python3.12/site-packages/pyomo/core/base/transformation.py", line 77, in apply_to reverse_token = self._apply_to(model, **kwds) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/Users/francopiccolo/Git/GitHub/data-in-action/clothes-production-optimization/venv/lib/python3.12/site-packages/pyomo/contrib/preprocessing/plugins/deactivate_trivial_constraints.py", line 118, in _apply_to raise InfeasibleConstraintException( pyomo.common.errors.InfeasibleConstraintException: Trivial constraint c1 violates LB 127.0 ≤ BODY 0. Infeasibility detected in deactivate_trivial_constraints. WARNING: Deactivating trivial constraints on the block unknown for which trivial constraints were previously deactivated. Reversion will affect all deactivated constraints.
错误原因
- 初始值触发预处理器检测:变量
s1初始值设为0,代入约束c1后左边结果为0,远小于约束下限127,Pyomo预处理器直接判定约束不可行。 - 模型逻辑存在冲突:目标是最小化
s1+s2+s3(尽可能让更多s变量取0),但原约束要求当s_i=0时,对应表达式结果必为0,无法满足127≤0的硬性要求,模型本身逻辑矛盾。
可行解决办法
1. 修正变量初始值
给二进制变量s1、s2、s3设置合理初始值(比如设为1),避免预处理器在初始检查阶段就判定约束不可行:
model.s1, model.s2, model.s3 = [Var(bounds=(0.0, 1.0), within=Binary, initialize=1.0) for i in range(3)]
2. 使用大M法改写约束,增加松弛机制
当s_i=0时,松弛对应产能约束,避免矛盾。以c1和c2为例:
M = 1e6 # 设置足够大的常数,确保约束松弛后永远成立 model.c1 = Constraint(expr=model.q11*model.S1 + model.q12*model.S1 + model.q13*model.S1 >= 127 - (1 - model.s1)*M) model.c2 = Constraint(expr=model.q11*model.S1 + model.q12*model.S1 + model.q13*model.S1 <= 133 + (1 - model.s1)*M)
当s1=0时,约束被松弛为无意义的恒成立条件;当s1=1时,约束回归原产能要求。
3. 重新匹配目标与约束逻辑
如果目标是最小化激活的生产线数量(s_i=1表示激活生产线),需确保激活的生产线能满足产能要求。单条生产线最大产能为11*100=1100,远大于130,逻辑上激活一条线即可满足需求,但必须解决s_i=0时的约束矛盾。
4. 临时禁用预处理器的 trivial 约束检测
调用MindtPy求解器时添加参数跳过该预处理器步骤,仅作为调试临时手段(模型逻辑矛盾仍需解决):
SolverFactory('mindtpy').solve(model, mip_solver='glpk', nlp_solver='ipopt', skip_trivial_constraints=True)
内容的提问来源于stack exchange,提问作者Franco Piccolo
相关产品推荐
相关产品推荐

