我有一个“节点”网络,每个节点产生“结果”。每个节点和结果都有唯一的名称/ 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个节点等待彼此完成的死锁。
在代码中描述此网络/其节点的常用方法是什么?这种网络的官方名称是什么?
答案 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网的可达性分析是一个已成熟的问题,文献中存在算法。也许维基百科的文章会给你一些启动的想法。