如何在 PuLP 中约束每项任务仅由一名员工执行

星涛同学_1463

星涛同学_1463

2026-05-24

467人浏览

原创

本文介绍如何使用 PuLP 建模「每项任务最多分配给一名员工」的逻辑约束,通过引入二元分配变量与大M法(Big-M)将“是否参与”与“实际工时”解耦,解决整数规划中无法直接对决策变量做逻辑比较(如 var > 0)的核心难点。

本文介绍如何使用 pulp 建模「每项任务最多分配给一名员工」的逻辑约束,通过引入二元分配变量与大m法(big-m)将“是否参与”与“实际工时”解耦,解决整数规划中无法直接对决策变量做逻辑比较(如 `var > 0`)的核心难点。

在资源调度类优化问题中,一个常见但易被忽视的关键约束是:单个任务(action)只能由至多一名员工承担。这看似简单,但在数学规划建模中无法通过 vars[action][m] > 0 这类条件判断实现——因为 PuLP 的 LpVariable 是符号变量,不支持与整数的直接比较运算,会触发 TypeError: '>' not supported between instances of 'LpVariable' and 'int'。

正确做法是采用变量分离 + 大M约束(Big-M formulation):

  • 引入二元变量 assign[action][person] ∈ {0,1} 表示“该员工是否被分配到该任务”;
  • 同时保留连续变量 hours[action][person] ≥ 0 表示实际分配的工时;
  • 用线性约束 hours ≤ assign × M 将二者关联(当 assign = 0 时强制 hours = 0;当 assign = 1 时允许 hours ≤ M);
  • 最后对每个 action 施加 ∑ assign[action][*] ≤ 1,即“最多一人被分配”。

以下为完整可运行示例(基于 Pandas + PuLP):

import pandas as pd
import pulp

# 定义任务(actions)
actions = pd.DataFrame(
    index=pd.Index(name='action', data=('A', 'B', 'C', 'D')),
    data={
        'value': (5, 2, 1, 1),      # 单位工时价值
        'max_work': (8, 4, 12, 24), # 该任务最多可投入总工时
    }
)

# 定义员工(people)
people = pd.DataFrame(
    index=pd.RangeIndex(name='person', start=1, stop=6),
    data={
        'max_hours': (7, 7, 6, 5, 5),  # 每人可用最大工时
    }
)

# 构建所有 (action, person) 组合,并定义两类变量:
# - 'assign': 二元变量,表示是否分配(0/1)
# - 'hours': 连续变量,表示实际分配工时(≥0)
combos = pd.DataFrame({
    'assign': pulp.LpVariable.matrix(
        name='assign', indices=(actions.index, people.index),
        cat=pulp.LpBinary
    ),
    'hours': pulp.LpVariable.matrix(
        name='hours', indices=(actions.index, people.index),
        cat=pulp.LpContinuous, lowBound=0
    )
}).stack([0, 1]).to_frame('val').unstack(-1).swaplevel(axis=1)

# 重命名列便于操作
combos.columns = ['assign', 'hours']
combos['value_per_hour'] = actions['value'].reindex(combos.index.get_level_values('action'))
combos['value'] = combos['hours'] * combos['value_per_hour']

# 按员工/任务聚合总工时
people['total_hours'] = combos['hours'].groupby('person').sum()
actions['total_work'] = combos['hours'].groupby('action').sum()

# 创建优化问题
prob = pulp.LpProblem(name='PlanningActions', sense=pulp.LpMaximize)
prob.setObjective(pulp.lpSum(combos['value']))

# 【核心约束1】每人最多承担一项任务(可选,依业务而定)
# for person, group in combos['assign'].groupby('person'):
#     prob.addConstraint(pulp.lpSum(group)  0.5][['assign', 'hours', 'value']])

print("\n=== 员工总工时使用情况 ===")
print(people[['max_hours', 'total_hours']])

print("\n=== 任务完成情况 ===")
print(actions[['value', 'max_work', 'total_work']])

✅ 关键要点总结:

  • ❌ 禁止对 LpVariable 使用 >,
  • ✅ 必须用二元变量显式建模“是否启用”逻辑;
  • ✅ 用 hours ≤ assign × M 实现“启用才可工作”的线性化;
  • ✅ M 应取足够大但不过大的值(如 2 × max(最大工时, 最大任务量)),避免数值不稳定;
  • ✅ assign.sum(level='action') ≤ 1 是实现「单任务单人」的直接且高效方式。

该建模范式不仅适用于人员调度,也广泛用于设备排程、客户-服务者匹配、仓库-订单分配等需满足“一对一”或“一对多但单源”逻辑的整数规划场景。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
剧云AI短剧创作教程合集
剧云AI短剧创作教程合集

本专题聚焦剧云AI短剧创作,讲解从短剧灵感、梗概、全局大纲到分集、分场和正文的完整流程及节奏设计方法。

2026.10.14

0

15

剧云AI剧本创作零基础入门
剧云AI剧本创作零基础入门

本专题系统讲解剧云AI剧本创作流程,涵盖灵感、梗概、大纲、分场与正文生成,帮助新手快速完成首个中文剧本项目。

2026.10.14

0

14

VibeKnow文档转视频操作指南
VibeKnow文档转视频操作指南

本专题讲解VibeKnow上传Word、TXT、Markdown等材料生成视频的方法,覆盖内容解析、脚本组织、画面生成与成片检查。

2026.10.14

0

15

VibeKnow知识视频制作与导出详解
VibeKnow知识视频制作与导出详解

本专题整理VibeKnow从注册、素材上传、AI生成到预览导出的完整操作,帮助新手快速制作第一条知识讲解视频。

2026.10.14

0

13

二狗PPT大纲编辑实操指南
二狗PPT大纲编辑实操指南

本专题聚焦二狗PPT结构化大纲的生成和修改,讲解标题、正文、目录、页数与页面顺序的调整方法,提升汇报逻辑和内容完整性。

2026.10.14

0

15

二狗PPT文档转PPT全教程
二狗PPT文档转PPT全教程

本专题讲解二狗PPT解析Word、PDF、Excel和PPT资料的方法,涵盖文件上传、内容提取、大纲整理、异常处理与转换后校对。

2026.10.14

0

13

讯飞绘文全功能使用教程
讯飞绘文全功能使用教程

本专题系统整理讯飞绘文官网入口、注册登录、工作台及内容创作流程,帮助用户熟悉常用功能,快速完成首篇图文内容。

2026.10.14

0

14

讯飞绘文AI写作与文案生成合集
讯飞绘文AI写作与文案生成合集

本专题聚焦讯飞绘文AI写作、提纲生成、文章改写和文案润色,覆盖从主题输入到成稿优化的关键操作与实用技巧。

2026.10.14

0

14

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

2026.10.10

100

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习