java - 如何检测无用的依赖关系?

标签 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,而 C 又依赖于 B,而 B 又依赖于 A。

最佳答案

将其转换为邻接矩阵,您将得到以下结果:

  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 的多条路径,您就可以删除原始邻接矩阵中的直接依赖关系。

关于java - 如何检测无用的依赖关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23245543/

相关文章:

java - 在java中读取shell脚本输出(wget)

javascript - 如何找到可能的路径(遍历)

performance - 通过交错复制 3D 阵列的页面构建邻接矩阵

cuda - 是否有可用的基于 GPU 的约束求解器? CUDA,OpenCL?

constraint-programming - SMT-solver 在约束求解方面比 CSP-solver 有什么优势?

Java - 简短和类型转换

java - Java 中的 WCF 自托管功能

Java 找不到循环符号,逻辑问题?

graph-theory - 二分最小边

c# - 如何实现 If Then 表达式以最终在 ILOG CP 优化器的约束中使用?