具有多父节点的定向非循环图

时间:2014-07-28 23:19:59

标签: graph-algorithm directed-acyclic-graphs stability

给定:具有加权边的有向非循环图,其中节点可以具有多个父节点。

问题:对于根节点的每个子节点,找到从这样的子节点到可以到达的某个叶子的最小成本(权重之和)路径。节点只能存在于一个这样的最小成本路径中。

示例图:

Example graph

在上图中,对于节点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.5的成本的节点2的最小路径相比,其成本为3.0。与节点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;

问题:

  1. 这种逻辑是否有意义?我担心这种消除冲突的迭代方法可能不会收敛于某些图形。例如,在重新计算节点2的最小路径时,如果2 - >现在发现5是最小路径,并且假设在第一次迭代期间节点5是否在某个其他节点的最小路径中使用,那么我将不得不重新分配"最佳父路由"节点5作为节点2并重新迭代。在一个坚果壳中,每当我尝试修复一些节点的最小路径时,我可能会改变其他节点。这样的算法可以收敛到某种解决方案吗?如果是,它的复杂性是什么?

  2. 在计算最低成本路径之前,有没有办法消除此类冲突?

1 个答案:

答案 0 :(得分:0)

它的动态编程。

首先反转所有边缘以制作新图表,我们称之为newG。

  1. 在newG中,没有父节点的节点的值为0.
  2. 对于newG中有父母的每个节点,计算它 父母的价值,然后选择最小值父母,它必须是 部分结果。
  3. 从原点gtaph询问路径时,答案是一样的 在newG。(可能是答案中的边缘是相反的顺序)。
  4. 时间O(n)