【发布时间】:2017-02-08 22:18:56
【问题描述】:
考虑一个有向图,它从第一个节点 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 到最终节点有 8 条不同的路径:
{{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,因此建议使用这些语言的建议。
【问题讨论】:
-
您可以通过阻止已经访问过的节点来避免无限循环。无论您使用的是递归解决方案还是 Dijkstra 算法之类的东西,这都没有什么不好的地方。
-
@WeatherVane 你是说我列出的8条不同的路径已经是最终结果了吗?我相信实际上允许无限循环,因为它最终成为循环遍历概率中的几何级数(在最简单的情况下为 1 个循环),它收敛到一个有限数。我的麻烦是当有很多循环和几个相交时。然后我看不到如何概括几何级数。
-
您询问如何删除周期。
-
他不想要简单的循环去除,他想要评估到达每个末端节点的渐近概率,假设有无限组通过图的循环路径。
-
您正在描述某种Markov chains 的图表。我为此添加了 SO 的标签,这可能会引起比我更适合回答的人的注意。
标签: java c++ c directed-graph markov-chains