非循环劳动力调度算法

时间:2013-08-09 17:41:35

标签: php algorithm scheduling

似乎有大量关于循环(或“旋转”)劳动力调度问题的信息。我正在寻找一种算法,该算法将有助于生成员工轮班的时间表,而不关心前一周的时间表。根据我的研究,这听起来像是一个非循环的劳动力调度问题。

基本上,我有员工的可用性,他们的最小/最长时间,以及他们请求的休假时间。有了这些信息,我想创建一个优化的计划,以满足员工所需的可用性,同时满足每天所需的班次数。

有没有人为此目的提供有关良好算法的提示?谢谢!

1 个答案:

答案 0 :(得分:1)

对于像解决方案有很多限制的员工调度这样的问题,我更喜欢那些从不违反任何约束或尽可能接近约束的方法。 (遗传交叉等一些方法会违反约束条件,然后执行额外的操作来修复解决方案 - 这也是一种有效的方法,但你需要注意走向死胡同。)

两种方法都基于使用贪婪算法。

首先是使用半随机贪心算法;如果你有两个选择,那么通常你总会选择局部最优选择,但是使用半随机贪婪方法你会引入选择非局部最优选择的可能性。例如,选择一个的权重为5,选择二的权重为2;通常你会选择一个,但在这种情况下你会使用随机数生成器,如果rand(5 + 2)小于5,则选择一个,否则选择选择二。现在运行算法几次并采用“最佳”解决方案。

第二种选择是从贪婪或半随机贪婪的解决方案开始,并使用本地搜索算法重新分配员工插槽以尝试改进解决方案。例如,如果员工的工作时间少于他们想要的工作时间,那么就会让员工占用对于次优员工合法的插槽,并为其分配次优的emoloyee,如果需要,继续搜索以重新分配受影响的员工。与第一种解决方案不同,如果你不小心,这个解决方案可能不会终止。

这两种方法可以结合起来,用半随机贪婪方法生成几种解决方案,然后进行局部搜索以提高最佳效果。