Optimization 在DAG中查找最大可并行任务的算法?

Optimization 在DAG中查找最大可并行任务的算法?,optimization,graph,graph-algorithm,job-scheduling,directed-acyclic-graphs,Optimization,Graph,Graph Algorithm,Job Scheduling,Directed Acyclic Graphs,假设我有一个带顶点和边的有向无环图(DAG) 顶点可以是以下两种类型之一: 计算任务(T) 资源(R) 边表示依赖项。它总是从某个计算任务顶点T开始,以某个资源顶点R结束 对图形结构的限制: 任务顶点仅依赖于资源顶点(不依赖于其他任务)。 这意味着计算任务中只有输出边, 而且资源中只有进入的边缘 任务顶点与同一资源顶点之间不能有多条边 资源顶点不依赖于任何东西(没有传出边) 每个计算任务顶点可以至少有3条出射边,最多有4条出射边。这意味着,一个计算任务至少需要3个资源,最多需要4个资源

假设我有一个带顶点和边的有向无环图(DAG)

顶点可以是以下两种类型之一:

  • 计算任务(T)
  • 资源(R)
边表示依赖项。它总是从某个计算任务顶点T开始,以某个资源顶点R结束

对图形结构的限制:

  • 任务顶点仅依赖于资源顶点(不依赖于其他任务)。 这意味着计算任务中只有输出边, 而且资源中只有进入的边缘
  • 任务顶点与同一资源顶点之间不能有多条边
  • 资源顶点不依赖于任何东西(没有传出边)
  • 每个计算任务顶点可以至少有3条出射边,最多有4条出射边。这意味着,一个计算任务至少需要3个资源,最多需要4个资源
语义:

  • 上图是任务依赖关系图。每当任务运行时, 它会阻塞它所依赖的所有资源,直到完成为止
  • 在任何给定时间,每个资源不能被多个任务使用。所以 任务可以暂时阻止其他任务运行,直到它们完成为止 完成了
问题:

给定上面的图表,我可以使用什么算法来计算所有可能并行运行的任务,以使它们不会相互阻塞? i、 在任何给定的时间,我都希望能够实现最大的并行化。我将使用该算法来发现所有互不阻塞的任务,并运行它们。每当任务完成时,我都要重新评估图表,看看是否可以派生出更多未被阻止的任务

我想知道我可以用于这种计算的算法。这听起来像是一个很难解决的图形问题,但我怀疑这种问题并不是完全新的

示例:

在提供的示例中,我可以首先运行T1和T3。完成这些操作后,我可以运行T2和T4


将资源集表示为S,将每个任务表示为S的子集,您的问题就是。另请参见。

您的原始前提被打破,因为它假设所有任务始终同时使用其所有资源,这是极不可能的。例如可能(在特定时间点)T4仅使用R7,T1仅使用R2,T2使用R3和R4;也许你可以同时运行这四个任务。注意,如果T1、T2和T4总是使用R3,那么T1、T2和T4就不能同时运行;那么使用三个线程就没有意义了,您只需要一个“T124”线程,它依赖于R1、R2、R3、R4和R7;但是如果“T124”和T3总是使用R7,那么使用“T124”和T3就没有意义了,所以你只需要一个“T1234”线程;然后它必须是自适应的(例如,只有在实际需要时才使用互斥来阻止任务),以便在任何特定的时间点都可以运行最大数量的线程。当然,在这种情况下,您最终会遇到
max\u tasks\u running\u in\u parallel=min(total\u tasks,total\u cpu)
,这有点过于琐碎,无法说明。您完全误解了问题陈述。这里的资源不是CPU,任务完全有可能并行使用所有资源(如stmt中所述)。请将“任务”和“资源”视为抽象,不要将它们与线程/CPU联系起来。我知道这些资源不是CPU,我不认为我误解了什么。