给定:具有加权边的有向无环图,其中一个节点可以有多个父节点。
问题:对于根节点的每个子节点,找到从该子节点到可以到达的某个叶子的最小成本(权重之和)路径。一个节点只能出现在一个这样的最小成本路径中。
示例图:
在上图中,对于节点 2,所有可用路径为:
2 -> 5
2 -> 1 -> 9 -> 6
2 -> 1 -> 10 -> 6
Among which 2 -> 1 -> 10 -> 6 has minimum cost of 3.5
同样,对于节点 4,所有可用路径为:
4 -> 11 -> 8
4 -> 7 -> 10 -> 6
Among which 4 -> 7 -> 10 -> 6 has minimum cost of 3.0
目前的结果是:
For node 2, the path is 2 -> 1 -> 10 -> 6 : Cost 3.5
For node 4, the path is 4 -> 7 -> 10 -> 6 : Cost 3.0
For node 3, there is no such path.
我写了一个代码来做到这一点。现在,如果这样的最小成本路径没有任何共同的节点,算法将停止并为我提供根节点的所有子节点的最小成本路径。
但是,如果存在一个共同的节点,我必须只在其中一个节点中保留它。原因是通常这种多父节点是由于噪声数据。一个节点应该只属于一个父节点。我试图将这样的节点保持在成本最低的路径中。所以在这里,节点 10 属于节点 4 的最小路径,其成本为 3.0,而节点 2 的最小路径的成本为 3.5。与节点 6 的逻辑相同。因此,我将只比较取消关联一些多父节点的成本。解除关联并不意味着边缘将被移除。我所做的就是为节点的数据结构中的每个节点保存最佳父节点。例如,节点 10 将有一个条目说“最佳父节点是节点 7”,节点 6 将有一个条目“最佳父节点是节点 10”。
因此,逻辑如下所示:
Do:
For each child node of the root:
Find out min-cost path. Store that path and the cost.
If conflicting paths exist:
Compare the costs of conflicting paths and save "best parent" for each node.
While there were conflicting paths;
问题:
这个逻辑有意义吗?我担心这种消除冲突的迭代方式对于某些图表可能不会收敛。例如,在重新计算节点 2 的最小路径时,如果现在发现 2 -> 5 是最小路径,并假设在第一次迭代期间节点 5 正在其他节点的最小路径中使用,那么我将不得不将节点 5 的“最佳父级”重新分配为节点 2 并重新迭代。简而言之,每次我尝试修复某个节点的最小路径时,我可能会更改另一个节点的最小路径。这样的算法可以收敛到某个解决方案吗?如果是,它的复杂性是多少?
有没有办法在首先计算最小成本路径之前消除这种冲突?