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

线性规划:捕获布尔变量列表中首个值为1的位置

解决方案

我们可以通过添加整数线性约束将布尔变量y[i]与x[i]关联起来,以下是基于PuLP求解器的实现方案:

约束逻辑

针对0≤i≤5的布尔变量x[i]和y[i],需满足以下4组约束:

  • 最多只有一个y[i]为1(对应首个1的位置,若x全为0则y全为0):
    sum(y) ≤ 1
  • 若y[i]=1,则x[i]必须为1:
    y[i] ≤ x[i](对所有i生效)
  • 若y[i]=1,则所有j<i的x[j]必须为0:
    y[i] ≤ 1 - sum(x[j] for j in range(i))(对所有i生效)
  • 若x[i]是首个为1的变量(即前面所有x[j]为0且x[i]=1),则y[i]必须为1:
    y[i] ≥ x[i] - sum(x[j] for j in range(i))(对所有i生效)

Python代码实现

先通过pip install pulp安装PuLP求解器,再执行以下代码:

from pulp import LpProblem, LpVariable, LpBinary, lpSum, LpMinimize

# 创建模型
model = LpProblem("First_One_Detection", LpMinimize)

# 定义布尔变量:x[i]和y[i](0或1)
n = 6  # i取值0到5
x = [LpVariable(f"x_{i}", cat=LpBinary) for i in range(n)]
y = [LpVariable(f"y_{i}", cat=LpBinary) for i in range(n)]

# 添加约束条件
# 1. 最多一个y[i]为1
model += lpSum(y) <= 1

# 2. y[i]为1则x[i]必须为1
for i in range(n):
    model += y[i] <= x[i]

# 3. y[i]为1则前面所有x[j]为0
for i in range(n):
    if i > 0:
        model += y[i] <= 1 - lpSum(x[j] for j in range(i))

# 4. 首个x[i]=1时,y[i]必须为1
for i in range(n):
    if i > 0:
        model += y[i] >= x[i] - lpSum(x[j] for j in range(i))
    else:
        model += y[0] >= x[0]

# 替换为你的实际目标函数(示例为最大化sum(x))
model += lpSum(x)

# 求解模型
model.solve()

# 输出结果
print("x变量取值:")
x_vals = [int(var.value()) for var in x]
print(x_vals)

print("\ny变量取值:")
y_vals = [int(var.value()) for var in y]
print(y_vals)

验证效果

当求解后x为[0,1,0,1,0,0]时,y会输出[0,1,0,0,0,0],符合需求;若x全为0,y也全为0;若x[0]=1,则y[0]=1其余为0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:31:11