如何在Excel Solver中设置整数约束优化班次?是否转用Python?
班次优化整数约束解决方案:Excel调整或Python实现
一、直接在Excel Solver中设置整数约束
不用换工具,Excel本身就能解决这个问题,步骤很简单:
- 打开Solver参数窗口(没找到的话,先在「文件-选项-加载项」里启用Solver加载项)
- 在「可变单元格」区域选中那24个代表各小时班次数量的单元格
- 点击「添加」约束:选择刚才的可变单元格,约束条件选「int」(整数),确认添加
- 检查目标函数、人力需求等其他约束是否正确,然后点击「求解」
- 注意:整数规划的求解速度会比无约束的线性规划慢一点,但24个变量的规模完全在Excel Solver的处理能力范围内,不用卡顿担心。
二、用Python实现整数规划(适合你更熟悉Python的情况)
如果更习惯用代码,用pulp库做整数规划非常直观,下面是可直接参考的示例:
步骤1:安装依赖
pip install pulp
步骤2:编写优化代码
import pulp # 定义优化问题:目标是最小化总班次数量 shift_prob = pulp.LpProblem("Minimize_Total_Shifts", pulp.LpMinimize) # 创建24个整数变量,x[i]表示第i小时开始的班次数量(取值≥0的整数) shift_vars = [pulp.LpVariable(f"shift_start_{i}", lowBound=0, cat="Integer") for i in range(24)] # 设置目标函数:总班次数量求和 shift_prob += pulp.lpSum(shift_vars) # 假设每个班次持续8小时,添加各时段人力需求约束 # 替换hourly_demand为你实际的各小时人力需求数据 hourly_demand = [5, 6, 7, 8, 9, 10, 12, 15, 14, 13, 12, 11, 12, 13, 14, 15, 12, 10, 9, 8, 7, 6, 5, 4] for hour in range(24): # 计算当前小时在岗的所有班次:往前推7个小时内开始的班次(处理跨午夜的循环) on_duty = [shift_vars[(hour - offset) % 24] for offset in range(8)] # 约束:在岗人数≥当前小时需求 shift_prob += pulp.lpSum(on_duty) >= hourly_demand[hour], f"Demand_Hour_{hour}" # 求解问题(关闭日志输出让结果更干净) shift_prob.solve(pulp.PULP_CBC_CMD(msg=0)) # 输出最优结果 print("最优班次安排:") for i in range(24): print(f"第{i}小时开始的班次:{int(pulp.value(shift_vars[i]))}个") print(f"总班次总数:{int(pulp.value(shift_prob.objective))}")
代码说明
- 替换
hourly_demand数组为实际的各小时人力需求即可 - 如果班次时长不是8小时,调整
range(8)为对应的时长 - 可根据需要添加其他约束(比如每班人数上限、班次间隔限制等)
选择建议
- 只是快速修改现有Excel模型,直接用Excel Solver加整数约束最省事
- 需要频繁调整约束、批量计算或者和其他Python工具集成,用Python实现更灵活
内容的提问来源于stack exchange,提问作者bovengan
相关产品推荐
相关产品推荐

