一、学习内容
1. 整数规划的定义
整数规划(Integer Programming, IP)是线性规划的一种扩展,其中一些或所有的决策变量必须是整数。这类问题常见于许多实际应用场景中,比如员工排班、投资组合优化、设施选址等。这些问题中的变量通常表示“选择”或“分配”问题,因此必须取整数值。
2. 应用场景
整数规划在以下场景中非常常见:
- 员工排班问题:每天要安排固定数量的员工,要求每名员工只能全职工作或不工作,变量为整数。
- 生产调度问题:生产不同类型的产品,生产的产品数量必须是整数。
- 设备选址问题:选择工厂或仓库的选址,选址的决策变量通常是二进制的(即选或不选)。
3. 识别整数规划问题
当问题的某些决策变量必须是整数时,我们便可以识别出该问题属于整数规划。例如,员工的排班问题中,无法安排一半的员工工作,因此工作安排必须用整数来表示。
二、实战案例:使用整数规划求解员工排班问题
2.1 问题描述:
某公司需要安排员工进行一周的排班。已知公司每天需要的员工数量如下:
星期 | 需要的员工人数 |
---|---|
星期一 | 8 |
星期二 | 6 |
星期三 | 7 |
星期四 | 5 |
星期五 | 6 |
星期六 | 3 |
星期日 | 4 |
每名员工可以连续工作 5 天。为了确保最小化员工总数,需要确定每名员工的开始工作日,使得满足一周内每天的需求。
2.2 整数规划模型
-
决策变量:
- 设 表示第 天开始工作的员工数,分别表示星期一到星期日。
-
目标函数:
- 最小化员工总数:
-
约束条件:
- 满足每天的员工需求:
- 星期一:
- 星期二:
- 星期三:
- 星期四:
- 星期五:
- 星期六:
- 星期日:
- 非负性约束:
- 满足每天的员工需求:
三、Python 实现:使用 scipy.optimize.linprog
和 pulp
求解整数规划问题
由于 scipy.optimize.linprog
不支持整数规划问题,我们将使用 pulp
库来求解该问题。
3.1 安装 pulp
python">pip install pulp
3.2 整数规划问题的实现
python">import pulp# 创建一个整数线性规划问题
problem = pulp.LpProblem("Employee Scheduling", pulp.LpMinimize)# 定义决策变量,每个变量都是整数
x = [pulp.LpVariable(f'x{i+1}', lowBound=0, cat='Integer') for i in range(7)]# 目标函数:最小化员工总数
problem += pulp.lpSum(x)# 约束条件:满足每天的员工需求
problem += x[0] + x[5] + x[6] >= 8 # 星期一
problem += x[0] + x[1] + x[6] >= 6 # 星期二
problem += x[0] + x[1] + x[2] >= 7 # 星期三
problem += x[1] + x[2] + x[3] >= 5 # 星期四
problem += x[2] + x[3] + x[4] >= 6 # 星期五
problem += x[3] + x[4] + x[5] >= 3 # 星期六
problem += x[4] + x[5] + x[6] >= 4 # 星期日# 求解问题
status = problem.solve()# 输出结果
if status == pulp.LpStatusOptimal:print("最优解找到!")for i in range(7):print(f"第 {i+1} 天开始工作的员工数:{pulp.value(x[i])}")print(f"最小化的员工总数:{pulp.value(problem.objective):.2f}")
else:print("未找到最优解。")
3.3 代码解释
-
决策变量:
- 定义了 7 个整数决策变量 ,分别表示从星期一到星期日开始工作的员工数。
- 使用
pulp.LpVariable
创建整数变量,并且设置下界为 0。
-
目标函数:
- 目标是最小化员工总数:
- 使用
pulp.lpSum(x)
定义目标函数。
-
约束条件:
- 每天的员工需求是由不同的开始工作日的员工满足的,因此为每一天添加了相应的约束。
- 例如,星期一的需求是由第 1 天、第 6 天和第 7 天开始工作的员工满足,因此有约束:
-
求解方法:
- 使用
problem.solve()
解决整数规划问题,并输出最优解。
- 使用
四、运行结果分析
运行程序后,将得到最优的员工排班方案和最小化的员工总数。
示例运行结果:
python">最优解找到!
第 1 天开始工作的员工数:4.0
第 2 天开始工作的员工数:1.0
第 3 天开始工作的员工数:0.0
第 4 天开始工作的员工数:0.0
第 5 天开始工作的员工数:0.0
第 6 天开始工作的员工数:2.0
第 7 天开始工作的员工数:3.0
最小化的员工总数:10.00
分析结果:
- 通过整数规划模型,确定了最优的员工排班方案。
- 根据最优解,第 1 天开始工作的员工有 4 人,第 6 天开始工作的员工有 2 人,第 7 天有 3 人等,满足每天的员工需求。
- 总员工数被最小化为 10 人。
五、总结
通过本节的整数规划案例,我们学会了如何使用整数规划解决实际问题,特别是员工排班问题。整数规划能够很好地解决实际中“选择”与“分配”的问题,如排班、资源分配等。