有向概率图 - 减少周期的算法?
考虑一个有向图,它从第一个节点遍历到一些最终节点(没有更多的传出边)。图形中的每个边都有一个与之关联的概率。求和概率,将每个可能的路径带到所有可能的最终节点,返回 。(这意味着,我们保证最终到达最终节点之一。1
1
如果图中的循环不存在,问题就很简单了。不幸的是,图中可能会出现相当复杂的循环,可以遍历无限次(显然,概率随着每个循环遍历而乘以法降低)。
有没有一种通用算法来找到到达每个最终节点的概率?
一个特别讨厌的例子:
我们可以将边缘表示为矩阵(从行(节点)到行(节点)的概率在条目中x
y
(x,y)
)
{{0, 1/2, 0, 1/14, 1/14, 0, 5/14},
{0, 0, 1/9, 1/2, 0, 7/18, 0},
{1/8, 7/16, 0, 3/16, 1/8, 0, 1/8},
{0, 1, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0}}
或者作为有向图:
起始节点为蓝色,最终节点为绿色。所有边都按从其起始节点开始时遍历它们的概率进行标记。1
5,6,7
从起始节点到最终节点,这有八条不同的路径:1
{{1/14, {1, 5}}, {5/14, {1, 7}}, {7/36, {1, 2, 6}},
{1/144, {1, 2, 3, 5}}, {1/144, {1, 2, 3, 7}},
{1/36, {1, 4, 2, 6}}, {1/1008, {1, 4, 2, 3, 5}}, {1/1008, {1, 4, 2, 3, 7}}}
(每个路径的表示法是{概率,访问节点的顺序})
有五个不同的循环:
{{1/144, {2, 3, 1}}, {7/144, {3, 2}}, {1/2, {4, 2}},
{1/48, {3, 4, 2}}, {1/1008, {4, 2, 3, 1}}}
(循环的表示法是{遍历循环一次的概率,访问的节点序列})。
如果只有这些循环可以解决以获得有效的树状图,那么问题就会得到解决。
关于如何解决这个问题的任何提示?
我熟悉Java,C++和C,因此最好使用这些语言的建议。