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

基于Pulp的二进制整数规划:最大化全零组数量的技术问询

解决方案:用Pulp实现最大化全零组数量的线性规划转化

核心思路

原目标函数是非线性的(判断组内变量是否全零),无法直接用线性求解器处理。我们可以通过引入二进制辅助变量,将非线性逻辑转化为线性约束,从而用Pulp直接实现目标。

具体操作:

  • 为每个组group_i新增一个二进制辅助变量y_i,y_i=1表示该组所有变量全零(休假请求获批),y_i=0表示组内至少有一个变量为1(休假未获批)。
  • 将原目标转化为最大化所有y_i的和,这是标准的线性目标函数。

线性约束转化

要保证y_i和组内变量的逻辑关系,需为每个组添加以下线性约束:

sum(x_j for x_j in group_i) ≤ len(group_i) * (1 - y_i)

约束逻辑解释:

  • 若y_i=1,则右边为0,因此sum(x_j)必须≤0。由于x_j是二进制变量(0或1),这意味着所有x_j=0,符合全零组的要求。
  • 若y_i=0,则右边为组内变量的数量,sum(x_j)的最大值就是这个数量,约束自动满足,不对组内变量做限制。

Pulp代码示例

假设你已定义好二进制变量X和分组列表groups,添加以下代码即可实现目标:

import pulp

# 假设已创建问题实例 prob = pulp.LpProblem("MaximizeApprovedLeaves", pulp.LpMaximize)
# 假设已定义二进制变量 X = [pulp.LpVariable(f"x{i}", cat='Binary') for i in range(n)]

# 为每个组创建辅助变量
y_vars = []
for idx, group in enumerate(groups):
    y = pulp.LpVariable(f"y{idx}", cat='Binary')
    y_vars.append(y)
    # 添加约束
    group_sum = pulp.lpSum(group)
    prob += group_sum <= len(group) * (1 - y), f"Constraint_Group_{idx}"

# 设置目标函数:最大化获批休假的组数
prob += pulp.lpSum(y_vars), "Maximize_Approved_Leaves"

# 求解问题
prob.solve()

优势说明

  • 完全规避了人为设置组优先级的问题,所有组的权重均为1,确保求解结果是获批休假组数的全局最大值。
  • 完全兼容现有Pulp代码,无需更换求解器,只需新增辅助变量和对应约束即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:07:18