You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PuLP中建模FG1的‘0或≥60’装载逻辑或约束?

PuLP建模:处理卡车装载FG1的非零即≥60约束

问题背景

你需要为以下约束建模:若某辆卡车装载FG1产品,其装载量必须≥60单位;若不装载,则为0。对应的变量为:

  • x11:中型卡车1的FG1装载量
  • x12:小型卡车的FG1装载量
  • x13:中型卡车2的FG1装载量

建模方案

要实现这种“非零即满足下限”的约束,需要引入二进制变量标记卡车是否装载FG1:

  1. 定义二进制变量y11、y12、y13,其中y=1表示对应卡车装载FG1,y=0表示不装载。
  2. 添加两组约束:
    • 当y=0时,强制x=0:x1i ≤ M * y1i(M取FG1总供应量900即可,确保约束生效)
    • 当y=1时,强制x≥60:x1i ≥ 60 * y1i

修改后的完整代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:35:17