【发布时间】:2019-06-29 21:38:15
【问题描述】:
我有一个有向图,我知道它没有任何循环依赖并且有“终止”节点,即它们有一个自定义顶点属性,这是一个我可以检查的布尔值。使用 BGL 内置的边权重属性对每条边进行加权。
我想要做的是从任何顶点沿着所有可能的路径走,直到它到达所有可以到达的终止节点并跟踪到达的每个终止节点的“加权”边权重。我的意思是,下面的简单示例最好地解释了以下内容。
假设从节点 4 开始,有以下带有权重的边,如果 T(终止)
4->1 : 0.25 : T
4->5 : 0.45
4->6 : 0.5
5->2 : 0.65 : T
6->3 : 0.18
6->7 : 0.44 : T
3->1 : 0.33 : T
我想返回一个成对的向量,它是在到达每个节点的途中经过的终止节点/边缘权重的“加权”组合,在这种情况下是:
{1, 0.25 + (0.5*0.18*0.33) }
{2, (0.45*0.65)}
{7, (0.5*0.44)}
Final Result : [ {1, 0.2797}, {2, 0.2925}, {7, 0.22}]
“加权”是指每个新步骤都由在特定路径上行走的所有先前边缘权重的乘积加权。
所以从 4 到终止节点 1,有两条路径。直接边缘为 1,权重为 0.25。还有一条路径是 4->6->3->1,即 0.5*0.18*0.33。因此,对于节点 1,我们的总权重为 0.25 + (0.5*0.18*0.33) = 0.2797。
再次从4到终止节点2,有一条到4->5->2的路径(0.45*0.65),所以节点2 = 0.2925
最后 4 到终止节点 7,路径 4->6->7,(0.5*0.44),所以节点 7 = 0.22
这在 BGL 中是否可能,我想我需要某种自定义访问者/前任?
非常感谢任何帮助。
【问题讨论】:
-
0.5*0.18*0.33 怎么进来的 4->1? 1 是一个叶节点,它有直接边,所以似乎不会遍历其他边?更让我困惑的是,0.5 似乎来自 4->6 边缘,0.18 来自 6->3 边缘,0.33 来自 3->1 边缘。我不确定从顶点 4 开始并将顶点 1 作为终端顶点时如何涉及这些边。也许您可以稍微澄清一下程序/逻辑?
-
我怀疑你在用迂回的术语描述一些可能是“标准”算法的东西(你想要实现的算法有名称吗?)
-
我刚刚看到你的编辑。阅读。
标签: c++ boost graph boost-graph