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

如何在Pulp库中为整数变量设置(n[i]≥m[i]或n[i]=0)的OR条件?

在Pulp中实现“n[i]≥m[i] 或 n[i]=0”的OR约束

问题背景

你原本的代码创建了下限为m[i]的整数变量n[i],现在需要调整约束,让每个n[i]要么满足n[i]≥m[i],要么等于0,即实现逻辑(n[i] >= m[i]) or (n[i] == 0)。

实现方法

Pulp本身不直接支持OR逻辑约束,需要通过引入二进制辅助变量+大M法转化为线性约束,具体步骤如下:

  • 重新定义n[i]:去掉原有的lowBound=m[i],改为lowBound=0,允许变量取0。
  • 添加二进制辅助变量y[i]:每个y[i]是0或1的整数变量,标记n[i]的状态——y[i]=1对应n[i]≥m[i],y[i]=0对应n[i]=0。
  • 添加转化后的线性约束:
    1. n[i] ≥ m[i] * y[i]:保证y[i]=1时n[i]不小于m[i];y[i]=0时约束自动成立(n[i]≥0)。
    2. n[i] ≤ M * y[i]:M是足够大的常数(需大于n[i]在现有约束下的最大可能取值),确保y[i]=0时n[i]必须为0;y[i]=1时不限制n[i]的合法上限。

修改后的完整代码

from pulp import LpProblem, LpMaximize, LpVariable, lpSum

(N,A,C) = (3,10,12)
c = [2,3,5]
a = [1,2,3]
f = [3,4,8]
m = [2,2,1]
n = [0] * N
y = [0] * N  # 二进制辅助变量
  
prob = LpProblem("Problem", LpMaximize)

# 重新定义n[i],下限设为0
for i in range(N):
    n[i] = LpVariable('n'+str(i), lowBound=0, cat='Integer')
    # 定义二进制变量y[i]
    y[i] = LpVariable('y'+str(i), cat='Binary')

# 目标函数保持不变
prob += lpSum([f[i]*n[i] for i in range(N)]), "profit"

# 保留原有的Area和Cost约束
prob += lpSum([a[i]*n[i] for i in range(N)]) <= A, "Area"
prob += lpSum([c[i]*n[i] for i in range(N)]) <= C, "Cost"

# 添加OR约束的转化约束
# 估算M值:根据现有约束,取10足够覆盖n[i]的最大可能取值
M = 10
for i in range(N):
    prob += n[i] >= m[i] * y[i], f"n_{i}_lower_bound"
    prob += n[i] <= M * y[i], f"n_{i}_upper_bound"

prob.solve()

# 输出结果
for i in range(N):
    print(f"n[{i}] = {n[i].value()}, y[{i}] = {y[i].value()}")
print(f"总利润: {prob.objective.value()}")

说明

  • M的取值需合理:既要大于n[i]在所有约束下的最大可能值,避免限制合法解;也不要过大,防止引发数值计算问题。
  • 二进制变量y[i]会自动匹配n[i]的状态,无需额外干预。

内容的提问来源于stack exchange,提问作者MinKiD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:25:23