最优班次调度算法

时间:2013-06-17 03:52:57

标签: algorithm optimization scheduling approximation

我一直在尝试解决我曾经工作过的池的调度问题。这个问题如下......

有许多救生员在游泳池工作,每个救生员都有特定的工作小时数。我们希望将每个救生员所需的平均小时数保持尽可能低的时间,并尽可能保持公平。每个救生员也是一名大学生,因此将有不同的可用时间表。

每周游泳池的活动时间表与最后一次不同,因此必须每周创建一个新的时间表。

在每一天内,一定时间间隔内将需要如此多的救生员(例如:上午8点至10点为3名警卫,上午10点至下午3点为4名警卫,下午3点至晚上10点为2名警卫)。 这是困难部分的用武之地。没有明确定义的转换(插槽)来放置每个救生员(因为如果可用性,可能无法创建时间表)救生员加上每周更改的游泳池时间表。)

因此,必须从仅提供...

的空白平板创建计划
  • 救生员及其信息(所需时数,可用性)
  • 游泳池的活动时间表,以及随时需要执勤的警卫人数

现在可以将问题明确定义为“在每周的每一天创建一个涵盖所需守卫数量的可能时间表,并尽可能公平地安排所有救生员。”

创建一个可能的计划,在一周中的每一天始终涵盖所需的警卫数量,这是问题的一部分,是必要的,必须完全解决。关于尽可能公平对待所有救生员的下半部分使问题变得更加复杂,导致我相信我需要一种近似方法,因为划分工作日的可能方式可能是荒谬的,但有时可能是必要的只有可能的时间表才可能是荒谬的。

编辑:我发现的最常见建议算法之一是“医院/居民问题”,但我不相信这是适用的,因为没有明确定义的插槽来放置工人

2 个答案:

答案 0 :(得分:6)

解决此问题的一种方法是constraint programming - 维基百科文章提供了几种约束编程语言和库的链接。 Here is a paper描述了如何使用约束编程来解决调度问题。

另一种选择是使用贪婪算法来找到(可能无效的)解决方案,然后使用local search使无效解决方案有效,或者改进次优贪婪解决方案。例如,首先为每个救生员分配他们的首选小时数,这将导致为一些老虎机安排太多的警卫,并且还会导致一些警卫被分配一个荒谬的小时数;然后使用本地搜索从分配了太多警卫的插槽中取消分配最多小时的警卫。

答案 1 :(得分:3)

您需要将公平标准转变为目标函数。然后,您可以从任意数量的workplace scheduling tools中进行选择。例如,您描述了希望最小化期望和指定小时之间的平均差异。但是,我建议您考虑尽量减少最大差异。这似乎更公平(对我来说),它通常会产生不同的时间表。

然而,问题有点复杂。例如,如果一个警卫总是变短,而其他人都得到他们想要的时间,这也是不公平的。因此,您可能希望在公平模型中引入变量,这些变量代表前几周每位后卫的累积差异。另外,对于想要每周工作4小时的警卫而言,一小时的差异可能比想要工作20岁的警卫更不公平。要处理这样的事情,你可能想要加重差异。

您可能必须引入约束,例如没有分配超过特定小时数的警卫,或者每个警卫在轮班之间有一定的时间,或分配给任何一个警卫的时段数量一周不应超过某个门槛。许多调度工具都具有处理这些约束的功能,但您必须将它们添加到模型中。