排班问题——Nurse Rostering Problem(NRP)实战

本文介绍了如何利用Google的OR-Tools解决复杂的Nurse Rostering Problem(NRP),通过调研、代码实现和参数调整,展示了将机器学习应用于实际问题的实践过程,并以Python为例展示了代码示例。
摘要由CSDN通过智能技术生成

背景

上次周末碰到女朋友在排班表,花了快一个小时,就想着看用代码帮她节省点时间。

问题调研

上网查了一下,看了几篇论文了解了背景。

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.1030.5363&rep=rep1&type=pdf
https://arxiv.org/pdf/1804.05002.pdf

排班之类的问题都统称为 Nurse Rostering Problem(NRP)问题,就复杂性而言,这是一个NP-hard问题

P问题是在多项式时间内可以被解决的问题,而NP问题是在多项式时间内可以被验证其正确性的问题

多项式时间指的是什么?我理解就是平时计算的算法复杂度

O(1) – constant-time
O(log_2(n)) – logarithmic-time
O(n) – linear-time
O(n^2) – quadratic-time
O(n^k) – polynomial-time
O(k^n) – exponential-time
O(n!) – factorial-time

关于NP问题的描述可以看看我找到的这篇文章

提及复杂性理论,是因为更精准地分析问题后,才能找到合适的工具。

这类问题我们就会想到用计算机科学里面的方法去处理,例如machine learning。

工具查找——找巨人的肩膀

机器学习的技术栈,我学过的就是Python中的scikit-learn、TensorFlow和Keras上去做选择

据我了解,这是一个研究了多年的课题了。既然这样,应该是会有现成训练好的模型去做这类事情。

最后的最后,我就找到了Google开发的OR-Tools(Official Site)。它已经有训练过的模型去处理这类排班问题了。

Action

Code example

官方例子Source Code

主要就是对源码做调整了,以满足现实需求。

or-tools的基本用法

摘抄的伪代码,用于了解工作方式

// 选择和定义一个model,然后设置所需的前置数据和限制条件
model = cp_model.CpModel()
model.NewBoolVar(...)
model.AddExactlyOne(...)
model.Add(...)

// 选择和定义一个solver,然后针对model进行optimizate
solver = cp_model.CpSolver()
status = solver.Solve(model, solution_printer)

// 创建一个矩阵进行拟合
work = {
   }
for e in range(num_employees):
    for s in range(num_shifts):
        for d in range(num_days):
            work[e, s, d] = model.NewBoolVar('work%i_%i_%i' % (e, s, d))
// 下面是打印结果的算法
if status == cp_model.OPTIMAL or status == cp_model.FEASIBLE:
     print()
     header = '          '
     for w in range(num_weeks):
         header += 'M T W T F S S '
     print
  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值