如何用循环来解决图形

时间:2011-04-13 18:08:43

标签: java algorithm graph

我试图在Java的帮助下找到下一个问题的解决方案。我有一个图表,这是一个很好的例子:

enter image description here

有它的符号:

[{ A = {C = 0.7},{D = 0.3}},  { C = {out = 0.2},{F = 0.8}},  { D = {C = 0.1},{F = 0.2},{G = 0.3},{E = 0.4}},  { S = {A = 0.4},{B = 0.6}},
 { E = {G = 0.3},{out = 0.7}},  { G = {B = 0.2} {out = 0.8}},  ...

S - 是一个起始节点(S = 1), out - 是图表之外的一种方式。

我想跟踪图表并知道每个节点有多少百分比。 例如, A = 0.4 * S(S = 1), C = 0.7A + 0.1D, D = 0.3A + 0.7B

我认为可以通过递归(DFS用于有向图,特别是Tarjan的算法)来实现它,但是虽然存在循环,但我认为它没有帮助。另一种解决方案是求解线性方程组。 我不知道什么是更好的工作,也许有一些解决方案存在这种任务。 这个例子只是一个例子,但我应该考虑我喜欢appr。 2000个节点(谁知道有多少个循环)。

你会怎么做?

2 个答案:

答案 0 :(得分:2)

求解线性方程式似乎是一种非常好的方法。

您可以尝试使用Gaussian Elimination。我很确定你可以在网上找到已编写的Java代码来为你完成。

答案 1 :(得分:0)

注意:对于循环图,求解一个线性方程组不会给出概率。它为您提供了预期的多样性。

好的,问题是给出一个图形 G ,为每个节点计算访问该节点的概率。这是一个精确的算法。

  1. 计算图表的强连接组件(SCC)。
  2. 对于每个SCC C ,对于 C 中的每个可能的起始节点 v ,通过求解线性方程组来计算(a)分布离开 C 的弧和(b)访问 C 中每个节点的概率。我知道实现(b)的最佳方法是考虑其节点为对的产品图。该对的第一个元素是 C 中的节点。第二个元素是已访问的 C 中的节点子集。 Arcs继承自 C 。求解一些线性方程,找出这个新图中最后一个节点的分布。
  3. G 的顶点上准备一个新的图形 H ,其中 v w 的弧线为 > v w 位于 G 的不同组件中,并且存在从 v w 的路径。该弧的概率如步骤2(a)中所确定。
  4. 解决 H 上的非循环问题。
  5. 对于每个节点,计算步骤2(b)中概率的加权和。
  6. 该算法在图形大小上基本上是线性的,但在SCC的大小中是指数。我不确定你的周期是什么样的。