随叫随到的夜间调度算法

时间:2013-04-19 23:27:18

标签: algorithm scheduling np-complete

我作为RA在我学院的宿舍工作,每晚我们需要两个RA待命(能够应对事故和紧急情况)。每个月,RA都会提交他们无法接听的夜晚(由于某种冲突)。有男性和女性RA。我正在尝试提出一种有效的算法,以便在满足以下要求的任何特定月份找到最佳的待命夜晚安排:

  • 没有RA安排在他或她列为不可用的一个晚上。
  • 没有RA在每个月的指定夜晚停电超过。
  • 在任何给定的三晚范围内,没有RA在两次通话中。
  • 每晚都有两个待命的RA。
  • 如果可能的话,每晚都有一个男性和一个女性RA随叫随到。

做了一些研究,我发现这是一个资源受限的调度问题,它被认为是NP完全的。因此,我不需要找到最佳解决方案,只需找到有效的解决方案。

到目前为止,我已经考虑过以下方法:

  • 一个简单的2d RAs x晚上的数组,其中每个单元格都有一个布尔值,用于回答当晚RA是否在通话。我可以把RA放在两个优先级队列中(一个男性和一个女性),根据他们到目前为止有多少个晚上,自他们最后一次通话之夜以来已经有多长时间,并简单地遍历夜晚,选择一个RA从每个队列,然后回溯,如果我遇到一个没有人可以在特定的夜晚工作的死胡同。
  • 三面图,一侧有男性RA,另一侧有女性RA,最后一侧有夜晚。在解决方案中,每个晚上对于一个男性和一个女性RA具有优势。我将从连接的所有边开始,然后移除边缘,直到找到解决方案。
  • 使用上述结构的某种遗传方法。

您建议我使用哪种方法?是否有一些我没有想到的可能更好的东西?这不是一个家庭作业问题;我正在努力开发一个网站,让我的员工和校园内的其他员工可以轻松提交日期偏好,然后生成适合每个人的日程安排。

2 个答案:

答案 0 :(得分:0)

我推荐2d数组,但是不是按照从头到尾的顺序迭代夜晚,而是按照从大多数到最少限制的顺序迭代夜晚 - 换句话说,从具有最少RA的可用到期的夜晚开始冲突如果你采用这种方法,这种启发式方法也可以应用于三方图 - 它基本上是域表示的问题,算法本身在这一点上不受影响。

问题是当你到达最后几晚时你会做什么,并发现没有可用的RA。此时你会尝试local search尝试找到一个可行的解决方案,例如你为NightA选择了RA1,但当晚也有RA2和RA3,所以你选择RA2或RA3看看是否有在没有可用RA的夜晚释放RA1。

答案 1 :(得分:0)

使用提到的二进制变量,您的问题可以表示为Integer Linear Program(ILP)。如果变量不超过几千个,则可以通过GLPK之类的求解器以最佳方式求解。所有约束,但最后一个约束已经是线性的。对于“每晚都有,如果可能的话,一个男性和一个女性RA随叫随到”,你可以为每个夜晚引入另一个布尔变量“x”,有一个约束“女性RA在呼叫中的总和< = 1 + x”,然后最小化x的总和,从而允许以成本违反约束。如果您以文本格式向解算器提供数据,那么这也应该不太难实现。