如何在PuLP中建模FG1的‘0或≥60’装载逻辑或约束?
PuLP建模:处理卡车装载FG1的非零即≥60约束
问题背景
你需要为以下约束建模:若某辆卡车装载FG1产品,其装载量必须≥60单位;若不装载,则为0。对应的变量为:
- x11:中型卡车1的FG1装载量
- x12:小型卡车的FG1装载量
- x13:中型卡车2的FG1装载量
建模方案
要实现这种“非零即满足下限”的约束,需要引入二进制变量标记卡车是否装载FG1:
- 定义二进制变量y11、y12、y13,其中y=1表示对应卡车装载FG1,y=0表示不装载。
- 添加两组约束:
- 当y=0时,强制x=0:
x1i ≤ M * y1i(M取FG1总供应量900即可,确保约束生效) - 当y=1时,强制x≥60:
x1i ≥ 60 * y1i
- 当y=0时,强制x=0:
修改后的完整代码
from pulp import LpMinimize, LpProblem, LpStatus, lpSum, LpVariable import pulp as pl # 修正导入,匹配solver调用 solver = pl.GLPK_CMD() model = LpProblem(name="load_receipts", sense=LpMinimize) # 原连续变量定义 x11 = LpVariable(name="x11", lowBound=0, cat='Continuous') x12 = LpVariable(name="x12", lowBound=0, cat='Continuous') x13 = LpVariable(name="x13", lowBound=0, cat='Continuous') x21 = LpVariable(name="x21", lowBound=0, cat='Continuous') x22 = LpVariable(name="x22", lowBound=0, cat='Continuous') x23 = LpVariable(name="x23", lowBound=0, cat='Continuous') # 新增二进制变量:标记对应卡车是否装载FG1 y11 = LpVariable(name="y11", cat='Binary') y12 = LpVariable(name="y12", cat='Binary') y13 = LpVariable(name="y13", cat='Binary') # 原面积、体积、重量约束 model += (0.5*x11 + 0.333333*x21 <= 400) model += (0.5*x12 + 0.333333*x22 <= 200) model += (0.5*x13 + 0.333333*x23 <= 400) model += (0.25*x11 + 0.142857*x21 <= 200) model += (0.25*x12 + 0.142857*x22 <= 100) model += (0.25*x13 + 0.142857*x23 <= 200) model += (0.001*x11 + 0.000125*x21 <= 50) model += (0.001*x12 + 0.000125*x22 <= 25) model += (0.001*x13 + 0.000125*x23 <= 50) # 原总量约束 model += (x11 + x12 + x13 + x21 + x22 + x23 == 2011) model += (x11 + x12 + x13 == 900) model += (x21 + x22 + x23 == 1111) # 新增FG1装载约束:非零即≥60 M = 900 # FG1总供应量,取足够大的上限值 model += x11 <= M * y11 model += x11 >= 60 * y11 model += x12 <= M * y12 model += x12 >= 60 * y12 model += x13 <= M * y13 model += x13 >= 60 * y13 # 目标函数(简化原表述) model += lpSum([x11, x12, x13, x21, x22, x23]) - 2011 status = model.solve(solver) print(f"状态: {model.status}, {LpStatus[model.status]}") for var in model.variables(): print(f"{var.name}: {var.value()}")
关键说明
- 二进制变量通过
cat='Binary'指定只能取0或1。 - M的取值只要大于等于单辆卡车可能装载的FG1最大量即可,用总供应量900是最稳妥的选择。
- 两组约束结合后,精准实现“要么不装(x=0,y=0),要么装至少60单位(x≥60,y=1)”的逻辑。
内容的提问来源于stack exchange,提问作者Graphiomaniac
相关产品推荐
相关产品推荐

