最优换班调度算法

10

我一直在尝试解决一个与我曾经工作的游泳池有关的排班问题。问题如下:

这个游泳池有X名救生员,每个救生员都有特定的希望工作小时数。我们希望尽可能地让每个救生员的平均工作小时数与他们希望的小时数差距最小,并且对于所有救生员来说尽可能公平。每个救生员还是一名大学生,因此他们的可用时间表也不同。

每周游泳池的活动安排都与上周不同,所以必须每周创建一个新的排班表。

每天内有很多特定时间间隔需要救生员(例如:8am-10am需要3名救生员,10am-3pm需要4名救生员,3pm-10pm需要2名救生员)。这就是困难之处所在。没有明确定义的时间段可以放置每个救生员(因为根据救生员的可用性以及每周不同的游泳池活动时间表可能无法提供排班表)。

因此,排班表必须从白板开始创建,只提供以下信息...

  • 救生员及其信息(期望小时数,可用性)
  • 游泳池的活动时间表,以及每个时刻需要上班的救生员人数。

现在可以明确定义问题为“创建一个可能的排班表,以便在每周的所有工作日每时每刻都有所需数量的救生员,并且在排班中尽可能公平地对待所有救生员。”

创建一个可能的排班表,以便在每周的所有工作日每时每刻都有所需数量的救生员是必须完全解决的问题。然而,在排班中尽可能公平地对待所有救生员的第二部分显著地复杂化了问题,导致我认为我将需要一种近似的方法,因为将一天的工作时间划分成几种可能的方式可能是荒谬的,但有时这可能是必要的,因为唯一可能的排班表可能会因为公平起见而变得荒谬。

编辑:我发现最常被建议的算法之一是“医院/居民问题”,然而,我不认为这适用于本问题,因为没有明确定义的时间段可以放置工作者。


6年过去了,这篇由Google OR-Tools撰写的文章仍然非常相关 https://developers.google.com/optimization/scheduling/employee_scheduling - yiati
2个回答

11

解决这个问题的一种方法是使用约束编程 - Wikipedia文章提供了几个约束编程语言和库的链接。这篇论文描述了如何使用约束编程来解决调度问题。

另一个选择是使用贪心算法找到一个(可能无效)的解决方案,然后使用局部搜索使无效的解决方案变为有效,或改进次优贪心解决方案。例如,首先分配每个救生员所偏好的时间,这将导致某些时段安排了过多的救生员并且某些救生员被分配了荒谬的工作时间; 然后使用局部搜索从已分配太多时间的时段中取消分配最长时间的救生员。


约束编程对我来说似乎是目前最好的解决方案(至少在我花了几分钟阅读后是这样)。泳池里的人们每周都会试图制定一个能让守卫满意的工作时间表,这似乎是一个约束问题,而这类问题往往是NP难的。 - yiati
1
@yiati 这是广义分配问题,这意味着除非成本函数是平凡的,否则它是 NP 难的。 - Zim-Zam O'Pootertoot
@Z.Neeson 我不确定是否能够满足你的限制条件,因为你有5名员工,每个员工只工作50%的时间,所以在每个14天的周期内,平均只有2.5名员工在工作。是否可以给某个员工分配额外的工作日或减少休息日等措施呢? - Zim-Zam O'Pootertoot
1
@Zim-ZamO'Pootertoot 目前所在的部门只有几个人,最坏情况下我们可以遍历所有情况来找到最优解,但对于其他部门(它们有自己的工作模式),其中一些部门有超过60个资源在轮班工作,因此我们必须找到一种解决这个令人头疼的问题的方法。 - Saorikido
1
@Z.Neeson 我怀疑在14天的工作周期内,你最好的解决方案是让N/14名员工在任何一天开始他们的工作周期,例如,如果有28名员工,则有2名员工在第1天开始他们的工作周期,2名员工在第2天开始,以此类推。我建议你编写一个简单的贪心算法来分配平均分布,以及一个分配随机分布的算法,运行随机算法几千次,并查看它是否能够击败平均分布;如果不能,则使用平均分布,如果可以,则可能需要更聪明的解决方案。 - Zim-Zam O'Pootertoot
显示剩余4条评论

4
你需要将公平标准转化为目标函数,然后可以从任意数量的工作场所排班工具中选择。例如,你想要最小化期望和分配时间之间的平均差异。然而,我建议你考虑最小化最大差异。这似乎更加公平(对我来说),并且通常会产生不同的时间表。
但是,问题有点复杂。例如,如果一个警卫总是被短缺,而其他人都得到了他们想要的时间,那么这也是不公平的。因此,您可能需要在公平模型中引入变量,表示每个警卫从先前几周开始的累计差异。此外,对于每周想要工作四个小时的警卫来说,一小时的差异可能比想要工作二十个小时的警卫更加不公平。为了处理这类问题,您可能需要对差异进行加权。
您可能需要引入约束条件,例如,不允许分配超过一定数量的时间给任何一个警卫,或者每个警卫之间需要有一定的时间间隔,或者一周内分配给任何一个警卫的时间段不应超过某个阈值。许多排班工具都具备处理这些约束条件的能力,但您需要将它们添加到模型中。

有哪些调度工具已经具备了这些功能,或者这些功能被称为什么,以便我在这里不必重新发明轮子? - yiati
@yiati - 我对现有工具了解不多,当然也不能推荐一个胜过另一个。从这个讨论中看来,whentowork.com 可以满足你大部分的需求。还有一些其他的工具在这里列出(它们往往是更重型的人事管理软件),你可以通过谷歌搜索“lifeguard scheduling”来寻找更多资源。 - Ted Hopp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接