为何Pyomo将包含变量乘积的约束识别为线性约束?
Pyomo将含变量乘积约束判定为线性的原因分析
- 核心原因是你的约束表达式中,求和项
sum(mod.same_service[o1, o2, m] for o1, o2 in product(mod.OPERATIONS, mod.OPERATIONS))被Pyomo识别为了常数,常数与实数变量coupling_temp2[m]的乘积属于标准线性项,因此整个约束会被判定为线性。 - 常见的导致求和项被识别为常数的场景如下:
- 模型定义时误将
same_service声明为Param(参数)而非Var(变量) - 添加约束前对
same_service变量调用了.fix()方法固定了取值 - 模型处于迭代求解流程中,上一轮求解后的
same_service变量取值被保留并自动固定
- 模型定义时误将
- 你可以通过以下代码验证问题:
# 检查same_service的定义类型 print(type(mod.same_service)) # 检查对应索引下的same_service是否被固定 for o1, o2 in product(mod.OPERATIONS, mod.OPERATIONS): print(f"same_service[{o1},{o2},{m}]固定状态:{mod.same_service[o1,o2,m].fixed}") # 查看约束表达式的多项式阶数,线性约束返回1,非线性约束返回≥2 print((mod.coupling_temp2[m]*sum(mod.same_service[o1, o2, m] for o1, o2 in product(mod.OPERATIONS, mod.OPERATIONS))).polynomial_degree())
内容的提问来源于stack exchange,提问作者Unziello
相关产品推荐
相关产品推荐

