Python Pulp线性规划:如何添加Paul1与Paul2互斥约束
解决方案:添加Paul1/Paul2互斥约束的线性规划实现
现有模型回顾
目标函数
MINIMIZE 6.84 * x_0 + 6.62 * x_1 + 6.37 * x_10 + 6.76 * x_11 + 6.34 * x_2 + 6.2 * x_3 + 6.33 * x_4 + 6.62 * x_5 + 6.37 * x_6 + 6.76 * x_7 + 6.76 * x_8 + 6.62 * x_9
现有约束
C1: x_0 + x_1 + x_2 + x_3 = 1 # 第一类服装部件选1个 C2: x_4 + x_5 + x_6 + x_7 = 1 # 第二类服装部件选1个 C3: x_10 + x_11 + x_8 + x_9 = 1 # 第三类服装部件选1个
互斥约束添加步骤
1. 明确变量归属
先整理出所有属于Paul1的变量集合(记为S_p1)和属于Paul2的变量集合(记为S_p2),需根据你的成本表实际对应调整,比如:
S_p1 = [x_0, x_4, x_8](Paul1负责的各部件变量)S_p2 = [x_1, x_5, x_9](Paul2负责的各部件变量)
2. 引入0-1决策变量
添加一个二进制变量y:
y = 1:选择Paul1完成整套服装y = 0:选择Paul2完成整套服装
在Pulp中定义该变量:
y = LpVariable("choose_paul1", cat='Binary')
3. 添加互斥约束
添加两个约束,强制所有选中的部件只能来自其中一位设计师:
# 若选Paul2(y=0),Paul1的变量总和必须为0;若选Paul1(y=1),最多选3个(刚好整套) prob += lpSum(x for x in S_p1) <= 3 * y # 若选Paul1(y=1),Paul2的变量总和必须为0;若选Paul2(y=0),最多选3个(刚好整套) prob += lpSum(x for x in S_p2) <= 3 * (1 - y)
约束逻辑说明
结合原有C1/C2/C3的=1约束,整套服装必须选3个部件,因此上述两个约束会自动保证:
- 当
y=1时,只能从Paul1的变量中选3个(每个部件组各1个) - 当
y=0时,只能从Paul2的变量中选3个(每个部件组各1个)
完全满足"只能二选一,完成整套服装"的要求。
内容的提问来源于stack exchange,提问作者Explore
相关产品推荐
相关产品推荐

