【问题标题】:how to solve the graph with cycles如何用循环解决图形
【发布时间】:2011-04-13 18:08:43
【问题描述】:

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

有它的符号:

[{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 个节点(谁知道有多少个周期)。

你会怎么做?

【问题讨论】:

  • 为什么选择 BFS 而不是 DFS? DFS 可能会更快找到出路。

标签: java algorithm graph


【解决方案1】:

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

您可以尝试使用Gaussian Elimination。我很确定你可以在网上找到已经编写好的 Java 代码来为你做这件事。

【讨论】:

    【解决方案2】:

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

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

    1. 计算图的强连通分量 (SCC)。
    2. 对于每个 SCC C,对于 C 中每个可能的起始节点 v,通过求解线性方程组 (a) 来计算分布离开 C 的弧的数量和 (b) C 中每个节点被访问的概率。我知道实现(b)的最好方法是考虑一个节点是对的产品图。该对的第一个元素是 C 中的一个节点。第二个元素是 C 中已访问的节点子集。圆弧继承自C。求解一些线性方程,找出这个新图中最后一个节点的分布。
    3. G的顶点上准备一个新图H,弧从vw,当vw 位于 G 的不同组件中,并且有一条从 vw 的路径.此弧的概率在步骤 2(a) 中确定。
    4. 解决H上的非循环问题。
    5. 对于每个节点,计算步骤 2(b) 中概率的加权和。

    该算法在图的大小上基本上是线性的,但在 SCC 的大小上是指数。我不确定你的周期是什么样的。

    【讨论】:

    • 我认为每个节点被访问的概率。
    • 在这样的图中没有任何循环模式。我已经阅读了您的解决方案,它看起来很复杂,但值得一试。正如我所见,也许最好省略周期。
    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2012-03-15
    • 2015-03-23
    • 2016-09-21
    相关资源
    最近更新 更多