Python Gekko求解MINLP时Equation定义错误的解决方法
问题分析
报错提示Equation without an equality (=) or inequality (> ,<) true,核心原因是代码中存在恒成立的无效约束——约束表达式是布尔值true,而非关联决策变量的等式/不等式关系。
错误定位与修复
删除无效的常量约束
代码中Q1i是预定义的正数常量列表,但你添加了如下约束:# Constraint 10 for i in range(4): m.Equation(Q1i[i] >= 0)这会生成
14365.35 >=0这类恒成立的表达式,Gekko无法识别为有效约束,直接删除这段代码即可。移除冗余的边界约束
决策变量P已通过lb=1e-5设置下界,无需再添加m.Equation(P > 0),删除该约束避免冗余。检查潜在逻辑矛盾(可选优化)
你定义Q1 = m.Intermediate(Ji[1] * Q11),同时约束1要求Q1 == sum(Ji[i] * Q1i[i]),结合Q11=14365.35(即Q1i[0]),这会强制Ji[1]*14365.35 = Ji[0]*14365.35 + Ji[1]*7182.17 + Ji[2]*14364.35 + Ji[3]*14364.35,若这不是预期逻辑,需重新核对Q1的定义。
修复后的核心约束与目标函数代码
# 约束部分(删除无效约束后) # Constraint 1 m.Equation(Q1 == m.sum([Ji[i] * Q1i[i] for i in range(4)])) # Constraint 2 for i in range(4): m.Equation(alpha * P**(-delta) * Ji[i] * Q1i[i] <= Q1 * ci[i]) # Constraint 3 m.Equation(m.sum([Ji[i] * Q1i[i] * qi[i] for i in range(4)]) <= Q1 * qa) # Constraint 8 m.Equation(m.sum([Ji[i] for i in range(4)]) <= m_val) # 目标函数 m.Maximize(alpha * P**(1-delta) - (1/Q1) \ * (alpha * P**(-delta) \ * m.sum([Ji[i] * k1i[i] for i in range(4)]) + \ e1/2 * m.sum([Ji[i] * (Q1i[i])**2 for i in range(4)]) + \ alpha * P**(-delta) * m.sum([Ji[i] * Q1i[i] * v1i[i] \ for i in range(4)])))
额外提示
- Gekko仅接受关联决策变量的约束,纯常量判断的表达式会被判定为无效。
- 变量的上下界优先通过
lb/ub参数设置,无需重复用Equation定义。 - 若后续仍有报错,可逐步注释约束排查,定位具体出错的表达式。
内容的提问来源于stack exchange,提问作者Hieu Truong
相关产品推荐
相关产品推荐

