我的任务的持续时间为整数。任务之间也具有依赖性。我还有任意数量的工人可以安排这些任务。
我想以一种方式为他们找到最佳的时间表,首先我要最小化所有任务的总执行时间,其次我想将任务安排在已经运行了大多数先前依赖项的工作人员上第三,我想减少所需的工人数量。
因此,如果任务具有依赖项A,B和C,而worker1运行A和B,worker2运行C,那么我希望将新任务添加到worker1中。
我正在对程序执行流程进行可视化处理,任务实际上是函数调用(具有已知的操作数),而依赖项是数据依赖项。我想用一个较长的线性表示形式而不是一个并行的可视化独立调用。我认为该问题类似于我上面描述的任务调度问题。
在我的第一种简单方法中,我设法优化了整体执行的时间,但是如果任务没有先验的依赖关系,它将把它们添加到自己的工作人员中。即使现有工人中有未使用的孔。因此,我不确定如何同时优化长度优先和工人数量。在花更多时间之前,我想知道是否有某种已知的算法可以解决这个问题,即使是一个库,我也可以使用。
此问题与this one不重复,因为:
答案 0 :(得分:1)
首先,制作一个依赖图;有关可能的详细工作,请参见拓扑排序](https://en.wikipedia.org/wiki/Topological_sorting)。
应用Dijkstra's algorithm并翻转比较,这将找到最长的路径。这为您提供了最短的执行时间和关键路径。有了这个,将关键路径分配给单个工作者。
现在,寻找包含多个依赖项的依赖项子路径不超过它们替换的依赖项的时间。例如,如果您有一个D所需的任务A,B,C的时间表,并且B&C的总时间少于A,那么您将从这里开始:
crit AAAAAADDDDD
other BBBCC
您可以将两个任务的弧与任务A交换,从而为您提供新的优先分配:
worker1 BBBCC-DDDDD
worker2 AAAAAA-----
这会让您入门吗?