在给定一系列可能的任务的情况下,如何优化工人的劳动时间以最大程度地利用时间

时间:2019-06-13 18:00:02

标签: python algorithm optimization time-complexity scheduling

所以我在算法建模方面有些困难,希望大家能帮助我找到一些方向。问题出在我公司的物流部门,作为一名CS实习生,我现在还找不到解决方案

问题:在给定的时间量,固定数量的工人和一组可行的任务下,以使所有工人都尽可能忙碌的方式向工人分配任务,并且该小组的最后一名工作人员仅被分配给其他人无法承担的其余任务。

此方法的目的是使最后一个工作人员尽可能地自由,以便他只能在真正需要的时候从事这些工作

约束:

  • 到期时间:每个任务都有自己的到期时间。这意味着任务可以在任何时候都可以开始,只要它按时完成就可以了。
  • 没有重叠:一个工人不能从事多个任务,并且一个任务不能在多个工人之间划分

到目前为止,我已经尝试过...

  • Job-Shop问题:情况似乎并非如此,因为不能将任务分组为作业,而这些作业必须由特定机器(在本例中为工人)处理。在我的情况下,任务可以由任何工作人员完成,而无需任何偏好。
  • 灵活的JSP:我真的以为是我的情况,因为任务可以由任何机器(工人)处理。但是我无法弄清楚如何将我的任务按工作分组,因为它们没有明确的顺序,而只是按时。

我也尝试了通过Google OR-Tools的方法,但是似乎都没有解决这个问题的方法。看起来像是NP完全问题,尽管任务和工作人员的规模并不大,但我认为蛮力组合任务以寻找解决方案并不是一种方法。

这里有一些我读过的文章,以找到类似的解决方案:

谢谢!

1 个答案:

答案 0 :(得分:1)

同构问题已解决。我假设每个任务都是必需的工作,并且工作人员是可以互换的:例如,保罗将能够在与艾比完全相同的时间内完成任务17。

由此,调度变得很简单:为每个任务计算一个“最新开始时间”(LST),最后期限减去所需的工作量。例如,一项耗时4小时且在18:00到期的任务的LST为14:00。

呼叫可用工人数N+1,其中+1是按需工人。

按LST对任务进行排序,然后按顺序将其分配给N个可用的工作程序。按明显的时间间隔填写时间表:在每个工作人员完成当前任务时,分配下一个可用任务。

如果您在时间表中达到了一个LST,而该LST却没有指定工作人员,则将其放入按需工作人员N+1的队列中。到最后,如果工作人员N+1的任务多于可用时间,那么您将没有解决方案。

例如,给定2 + 1个工作人员和任务

    Due  Effort  LST (computed from input)
A    5      3     2
B    3      2     1
C    1      1     0
D    5      2     3
E    4      3     1

按LST排序列表

    Due  Effort  LST
C    1      1     0
E    4      3     1
B    3      2     1
A    5      3     2
D    5      2     3

我们现在开始按小时列出每个工人的时间表

    0  1  2  3  4
#1  C  B  B
#2  E  E  E

这时,我们看到必须启动任务A,但是两个正常的工作人员已经很忙。我们必须将某物分配给#3。作业跨度的过载为1小时(实际上,这是整个计划过载),因此将1个小时的作业交换为#3,并在其LST处启动“过载”作业(这将减少回溯并重新执行在复杂的情况下尝试)。

    0  1  2  3  4
#1  B  B  A  A  A
#2  E  E  E
#3  C

现在,任务D很容易分配给#2,我们已经完成。

这会让你动起来吗?