我需要计算工作流中所有可能的交叉点(有向无环图)。我试图找到有效的算法,但缺乏发现。看起来像是并行调度理论。
例如我有图表:
我不知道每个节点的执行时间,所以我需要找到所有的交叉点:
我如何计算这个交叉点?
答案 0 :(得分:1)
为了回答部分问题,对于问题中的问题,没有有效的算法(在运算符边界的意义上,在输入的编码长度中是多项式限制的),通过以下类示例。 / p>
设n
为非负整数。使用G=(V,E)
节点创建任务图n+2
,如下所示。设s
为源节点,构成第一层,让t_1,...,t_n
为第二层的n
个中间节点,让t
为第三层的终端节点,即
V := { s } union { t_i : i in { 1,...,n } } union { t }
并将第一层连接到第二层,将第二层连接到第三层,即
E := { ( s, t_i ) : i in { 1,...,n } } union { ( t_i, t ) : { 1,...,n } }
直观地表示源连接到所有任务,所有任务都连接到终端。假设每个t_{i}
的所有任务i in {1,...,n}
都有处理时间1
或2
; s
和t
的处理时间并不重要。这意味着可能每个t_{i}
的每个任务组合i in {1,...,n}
可以同时运行;但是,所有任务组合t_i
({t_1,...,t_n}
的{{3}})的基数都是2^n
,n
不是多项式约束的#!/usr/bin/env amm
import sys.process._
import java.io.File
import ammonite.ops._, ImplicitWd._
@main
def ini(args: String*) = {
val server = args.headOption.getOrElse("devserver")
val path = /'Users/'Foo/'IdeaProjects/'my-project
val process = Process(Seq("sbt", "clean"), path)
process.!
}
话虽这么说,也许通常的“多项式运行时绑定”的概念是'这里不适用,因为输出的大小不是多边形的输入大小。