如何检测无用的依赖项?

时间:2014-04-23 13:16:29

标签: java graph-theory constraint-programming

假设我在某些任务之间有一堆依赖关系:

 A --> B 
 A --> D 
 B --> C  
 C --> D 
 E --> F  
 F --> G

这样的A - > B表示B只能在A完成后运行。

我如何能够检测并删除无用的依赖项?

在这种情况下,它" A - > d"原因D取决于C,取决于B和B取决于A.

2 个答案:

答案 0 :(得分:2)

将其转换为邻接矩阵,您将获得以下内容:

  A B C D E F G
A 0 1 0 1 0 0 0
B 0 0 1 0 0 0 0
C 0 0 0 1 0 0 0
D 0 0 0 0 0 0 0
E 0 0 0 0 0 1 0
F 0 0 0 0 0 0 1
G 0 0 0 0 0 0 0

将此矩阵与其自身相乘将生成一个新矩阵,告诉您使用两个步骤从每个节点到每个节点有多少种不同的方式。 再次相乘,您将看到三个步骤的结果,依此类推。

一般来说,A次k将导致矩阵告诉您从一个节点到另一个节点的不同路径的数量,需要k步。

使用此信息,您可以尝试发现多个路径描述的节点/任务之间的依赖关系。在A和D之间,您将看到A ^ 1(A - > D)和A ^ 3(A - > B - > C - > D)的路径。

一旦发现从节点X到节点Y的这些多条路径,就可以删除原始邻接矩阵中的直接依赖关系。

答案 1 :(得分:0)

我设法找到一个比stuXnet提出的更容易实现的解决方案。

使用Jung library,我检查给定依赖项的每对之间是否有多个可用路径。如果是这种情况,那么这种依赖肯定是不必要的,所以我只需要删除相应的边缘。