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

如何在Excel Solver中设置整数约束优化班次?是否转用Python?

班次优化整数约束解决方案:Excel调整或Python实现

一、直接在Excel Solver中设置整数约束

不用换工具,Excel本身就能解决这个问题,步骤很简单:

  1. 打开Solver参数窗口(没找到的话,先在「文件-选项-加载项」里启用Solver加载项)
  2. 在「可变单元格」区域选中那24个代表各小时班次数量的单元格
  3. 点击「添加」约束:选择刚才的可变单元格,约束条件选「int」(整数),确认添加
  4. 检查目标函数、人力需求等其他约束是否正确,然后点击「求解」
  5. 注意:整数规划的求解速度会比无约束的线性规划慢一点,但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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:28:11