所以我在算法建模方面有些困难,希望大家能帮助我找到一些方向。问题出在我公司的物流部门,作为一名CS实习生,我现在还找不到解决方案
问题:在给定的时间量,固定数量的工人和一组可行的任务下,以使所有工人都尽可能忙碌的方式向工人分配任务,并且该小组的最后一名工作人员仅被分配给其他人无法承担的其余任务。
此方法的目的是使最后一个工作人员尽可能地自由,以便他只能在真正需要的时候从事这些工作
约束:
到目前为止,我已经尝试过...
我也尝试了通过Google OR-Tools的方法,但是似乎都没有解决这个问题的方法。看起来像是NP完全问题,尽管任务和工作人员的规模并不大,但我认为蛮力组合任务以寻找解决方案并不是一种方法。
这里有一些我读过的文章,以找到类似的解决方案:
谢谢!
答案 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,我们已经完成。
这会让你动起来吗?