什么是这种类型的图形以及我可以使用什么算法来遍历它?

时间:2013-03-25 22:02:08

标签: graph

我有一个“节点”网络,每个节点产生“结果”。每个节点和结果都有唯一的名称/ ID。结果用作每个节点的输入和输出。当所有输入结果都可用于节点时,可以执行该结果。当节点完成执行后,输出结果将可用。

例如:

input node output
       A    x
x      B    y,z
x,z    C    q 

在上述网络中。节点A没有输入,可以先执行。然后,当结果x变为可用时,可以执行B.当A和B都完成时,可以执行C,因为它取决于A和B的结果。结果也可以是最终产品,如本例中的y,不用作任何节点的输入。

网络可能要复杂得多。每个节点都可以生成许多结果,并且它可以具有许多输入依赖性。

我希望能够选择一个结果,说“q”并找出需要执行哪些节点才能到达那里。我希望在更大的节点网络中为多个结果执行此操作。

我觉得这是一种常见的算法,但我没有这个领域的经验。它不像树一样是分层的,因为依赖关系可以创建圆。从我读过的内容来看,我认为它必须是一种森林图形。

无论如何它必须是可穿越的。始终至少有一个节点可以先执行,其他所有节点都应该能够按顺序执行,而不会产生2个节点等待彼此完成的死锁。

在代码中描述此网络/其节点的常用方法是什么?这种网络的官方名称是什么?

2 个答案:

答案 0 :(得分:1)

您要查找的名称是'依赖关系图'

用于分解的算法称为'拓扑排序'(参见:http://en.wikipedia.org/wiki/Topological_sorting

解决此类依赖关系的最着名工具之一称为 make

与您的示例对应的Makefile看起来像这样:

x :
    echo node A

y z : x
    echo node B

q   : x z
    echo node C

正如您所看到的,语法几乎与示例表中使用的语法相同。唯一的主要区别在于“列”的顺序是相反的 - 更确切地说是“要......我将首先需要......”而不是“从......我可以去......”。

键入make <TARGET>,您可以轻松验证它按您希望的顺序解析节点。这里有一些例子:

make q
  * node A
  * node B
  * node C

make x
  * node A

make z
  * node A
  * node B

(为了使输出更漂亮,这是用于上面输出的版本:

x :
    @echo " * node A"

y z : x
    @echo " * node B"

q   : x z
    @echo " * node C"

答案 1 :(得分:0)

除了仅仅是一种图形之外,它听起来像你想要的语义类似于带有彩色标记的Petri net。 Petri网的可达性分析是一个已成熟的问题,文献中存在算法。也许维基百科的文章会给你一些启动的想法。