Algorithm 最优排班算法

Algorithm 最优排班算法,algorithm,optimization,scheduling,approximation,Algorithm,Optimization,Scheduling,Approximation,一段时间以来,我一直在努力解决一个我曾经工作过的游泳池的调度问题。这个问题如下 在游泳池工作的救生员有X多人,每个人都有特定的工作时间。我们希望将每位救生员的平均离港时间尽可能低,并尽可能公平。每个救生员也是一名大学生,因此有不同的可用时间表 每周游泳池的活动日程与上一周不同,因此每周必须创建一个新的日程 在每天的特定时间间隔内,需要如此多的救生员(例如:上午8点到10点有3名救生员,上午10点到下午3点有4名救生员,下午3点到晚上10点有2名救生员)这是最难的部分。没有明确定义的轮班(时段)来

一段时间以来,我一直在努力解决一个我曾经工作过的游泳池的调度问题。这个问题如下

在游泳池工作的救生员有X多人,每个人都有特定的工作时间。我们希望将每位救生员的平均离港时间尽可能低,并尽可能公平。每个救生员也是一名大学生,因此有不同的可用时间表

每周游泳池的活动日程与上一周不同,因此每周必须创建一个新的日程

在每天的特定时间间隔内,需要如此多的救生员(例如:上午8点到10点有3名救生员,上午10点到下午3点有4名救生员,下午3点到晚上10点有2名救生员)这是最难的部分。没有明确定义的轮班(时段)来安排每个救生员(因为如果救生员可用,加上每周游泳池活动日程的变化,可能无法制定时间表)

因此,必须从一块空白的石板上创建一个时间表,该石板上只提供

  • 救生员及其信息(所需时间、可用性)
  • 游泳池的活动时间表,加上随时需要值班的警卫人数
这个问题现在可以清楚地定义为“制定一个可能的时间表,在一周中的每一天的任何时候都包括所需数量的救生员,并在时间表中尽可能公平地对待所有救生员。”

制定一个可能的时间表,涵盖一周中每天任何时候所需的警卫人数,是问题的一部分,这是必要的,必须彻底解决。关于对所有救生员尽可能公平的第二部分,使问题变得非常复杂,使我相信我需要一个近似的方法,因为划分一个工作日的可能方法可能是荒谬的,但有时可能是必要的,因为为了公平,唯一可能的时间表可能是荒谬的


编辑:我发现最常用的建议算法之一是“医院/居民问题”,但我认为这不适用,因为没有明确定义的工作岗位。

您需要将公平性标准转化为目标函数。然后,你可以从任意数量的时间中选择。例如,你描述想要最小化期望和分配的小时之间的平均差异。但是,我建议你考虑最小化最大差异。这似乎更公平(对我来说),通常会导致不同的时间表

然而,问题有点复杂。例如,如果一个守卫总是被短接,而其他人都得到了他们想要的时间,这也是不公平的。因此,您可能希望在公平性模型中引入变量,这些变量表示前几周每个卫兵的累积差异。此外,对于一个想一周工作四小时的警卫来说,一小时的差异可能比一个想工作二十小时的警卫更不公平。要处理这样的事情,您可能需要权衡差异


您可能必须引入约束,例如,没有一个卫兵的分配时间超过一定的小时数,或者每个卫兵在轮班之间都有一定的时间,或者一周内分配给任何一个卫兵的插槽数不应超过某个阈值。许多调度工具具有处理此类约束的功能,但您必须将它们添加到模型中。

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


另一种选择是使用贪婪算法找到(可能无效)的解决方案,然后使用使无效的解决方案有效,或者改进次优贪婪解决方案。例如,首先为每个救生员分配他们的首选时间,这将导致安排太多的救生员在某些时段工作,也将导致一些救生员被分配的小时数荒谬可笑;然后使用本地搜索从分配了太多卫士的插槽中取消分配小时数最多的卫士。

我同意,我一定要将最大差异最小化。我现在也明白了,对它们进行加权肯定是我没有考虑的一个重要因素。什么样的调度工具已经有了这些功能和/或这些功能的名称是什么,以便在没有必要的情况下我不会在这里重新创建轮子?@yiati-我对现有工具知之甚少,我当然不能推荐一个而不是另一个。从一开始,whentowork.com似乎做了你想做的大部分事情。下面列出了一些其他工具(它们往往是更为繁重的人事管理软件包),您可以通过谷歌搜索“救生员日程安排”来查找更多资源。现在,约束编程似乎是我这里的最佳解决方案(至少在现在读了几分钟之后)。游泳池里的人们似乎每周都在努力制定一个有效的时间表,同时让警卫们高兴。约束问题似乎是NP难的。@yiati这是一个广义赋值问题,这意味着它是NP难的,除非代价函数是trivial@Zim-ZamO'Pootertoot我有一个类似的问题,就是将资源安排到一个工作模式中,我有5名员工,他们都在固定的循环模式下工作,即4天工作,3天休息,3天工作,4天休息,现在的限制是每天至少有3名员工工作。我头痛了好几天,但仍然不知道从哪里开始,请你给我一个指导,谢谢。@Zim-ZamO'Pootertoot目前的部门是一个小部门,只有几个人,在最坏的情况下,我们可以通过