建模实战:员工排班优化调度问题的Ortools求解器实现
创作时间:
作者:
@小白创作中心
建模实战:员工排班优化调度问题的Ortools求解器实现
引用
CSDN
1.
https://blog.csdn.net/abc8023/article/details/11881345
1. 问题描述
下表分别为员工信息(包含每日最短工作时长、最长工作时长、单位小时工作薪资、可工作时间)、每小时最短工作人数,要求满足以下条件:
- a) 如果员工进行工作,则需满足个人工作时长不低于最小值、不高于最大值
- b) 每位员工每天至多工作一个班次,每个班次都是一段连续的时间
- c) 满足每小时最短工作人数
请给出一种分配方案,使得每日支付员工的薪水最少。
员工姓名 | 最小工作小时 | 最大工作小时 | 每小时工资 | 可用性 |
|---|---|---|---|---|
王小明 | 6 | 8 | 30 | 6-20 |
李婷婷 | 6 | 8 | 50 | |
张伟华 | 6 | 8 | 30 | |
刘晓红 | 6 | 8 | 30 | |
陈建国 | 6 | 8 | 40 | |
杨丽丽 | 6 | 8 | 50 | |
黄强强 | 6 | 8 | 45 | 6-18 |
赵静静 | 6 | 8 | 30 | |
周文华 | 6 | 8 | 35 | |
吴小刚 | 2 | 8 | 40 | |
孙雅雅 | 2 | 3 | 60 | 0-6, 18-24 |
胡明明 | 2 | 4 | 40 | |
朱强强 | 2 | 4 | 60 | 8-16 |
曾丽丽 | 2 | 6 | 55 | |
许鹏飞 | 2 | 6 | 45 | |
马晓霞 | 2 | 3 | 40 | |
郑伟伟 | 2 | 5 | 50 | 12-24 |
谢娟娟 | 2 | 4 | 50 | |
彭军军 | 2 | 4 | 40 | |
方美丽 | 2 | 5 | 50 |
每个时段需要的最少员工数:
2. 建模
参数:
决策变量:创建202424个变量
目标函数和约束:
目标函数与约束说明:
- 目标函数:使得每日支付员工的薪水最少
- 约束1:如果员工d进行工作,则需满足个人工作时长不低于最小值、不高于最大值每位员工每天至多工作一个班次,每个班次都是一段连续的时间,员工 d 只工作一个班次,即至多只有一组 (i,j) 使得 x_dij≠0 ,从员工可开始工作时间开始扫描,在大于员工最少上班时间、小于最长上班时间内搜索,到员工必须结束工作时间为止,至多有一个状态变量为1
- 约束2:满足每小时最少工作人数
3. 代码实现 - ortools求解器
from ortools.sat.python import cp_model
# Define the problem 员工排班是一个整数规划问题
model = cp_model.CpModel()
EMPLOYEE = ["王小明", "李婷婷", "张伟华", "刘晓红", "陈建国", "杨丽丽", "黄强强", "赵静静",
"周文华", "吴小刚", "孙雅雅", "胡明明", "朱强强", "曾丽丽", "许鹏飞", "马晓霞",
"郑伟伟", "谢娟娟", "彭军军", "方美丽"]
MIN, MAX, COST, START, END = (
[6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], # 最小工作小时数
[8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 3, 4, 4, 6, 6, 3, 5, 4, 4, 5], # 最大工作小时数
[30, 50, 30, 30, 40, 50, 45, 30, 35, 40, 60, 40, 60, 55, 45, 40, 50, 50, 40, 50], # 每小时薪资
[6, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 8, 0, 0, 0, 12, 0, 0, 0], # 可工作时段开始时间
[20, 24, 24, 24, 24, 24, 18, 24, 24, 24, 6, 24, 16, 24, 24, 24, 24, 24, 24, 24]) # 可工作时段结束时间
REQUIRED = [1, 1, 2, 3, 6, 6, 7, 8, 9, 8, 8, 8, 7, 6, 6, 5, 5, 4, 4, 3, 2, 2, 2, 2] # 每个时段需要的最少员工数
# 创建变量
x = {}
for d in EMPLOYEE:
for i in range(24):
for j in range(1, 25):
x[d, i, j] = model.NewBoolVar('')
# 创建目标函数
cost = sum((j - i) * x[d, i, j] * COST[EMPLOYEE.index(d)]
for d in EMPLOYEE
for i in range(24)
for j in range(i + 1, 25))
model.Minimize(cost)
# ...以上为部分代码
4. 求解结果
最优解:4670.0
状态:OPTIMAL
求解时间:0.2649239秒
x[d,i,j]变量的取值:
(王小明, 8, 16) = 1
(李婷婷, 3, 11) = 1
(张伟华, 4, 12) = 1
(刘晓红, 8, 16) = 1
(陈建国, 16, 24) = 1
(杨丽丽, 12, 20) = 1
(黄强强, 9, 17) = 1
(赵静静, 4, 12) = 1
(周文华, 0, 8) = 1
(吴小刚, 16, 24) = 1
(胡明明, 10, 14) = 1
(曾丽丽, 11, 15) = 1
(许鹏飞, 7, 13) = 1
(马晓霞, 2, 5) = 1
(郑伟伟, 14, 19) = 1
(谢娟娟, 5, 9) = 1
(彭军军, 6, 10) = 1
(方美丽, 4, 9) = 1
5. 绘制结果
6. 配套视频链接
运筹优化实战-最优化员工排班-bilibili
热门推荐
饭店级椒盐虾制作秘诀:从选材到调味的完整攻略
科学跳绳减肥方法
睡莲用什么肥料才开花
如何正确授予代理权和解除劳动合同
防晒指南到啦 小伙伴们快用起来吧
直播系统设备管理制度
如何解决PDF文件打印出来不清晰的问题
食品喷花美学,能否让每一份佳肴都成为艺术品般的存在?
五邑大学:广东省高水平理工科大学建设高校
李自成之死:兵败后的真相究竟如何?
迪拜营业执照过期续签全攻略:流程、费用及注意事项详解
迪拜公司营业执照过期后,如何办理续期手续?
吹大明湖的晚风 这个夏天,济南很city!
密码学 | 承诺:基本概念
激进投资与债务压力叠加:当代科技投资违约回顾与预警有效性分析
一座百花谷 文脉万年长——扎赉诺尔区矿山的重生与传承
英文称呼该怎么说才礼貌?
大爱罗湖:创新心理服务照亮养老之路
现货卖空是什么意思?现货卖空的风险如何控制?
AI大模型赋能医疗!北航提出REALM:基于RAG的多模态电子健康记录分析框架
如何设计数据库完整性
上海定制公交“遍地开花”,路线是如何制定的?
服务器负责具体指什么职责和功能?
鸮鹦鹉:不会飞还胖到被灭族?这鹦鹉靠人类包办婚姻逆袭至210只
公鸡为什么不骄傲了?
盐焗鸡用什么鸡最好?千万别用错了,味道不好!
大唐盛世的唐朝的司法制度是怎样的?
创新车载HMI设计:提升驾驶安全与体验的UI设计深度解析
如何提高团队质量意识
秋意浓,诗意长——探寻关于秋天的经典诗句