【问题标题】:Finding the all cyclic dependencies in directed graph using Perl使用 Perl 查找有向图中的所有循环依赖项
【发布时间】:2015-12-25 15:50:53
【问题描述】:

我正在寻找 Perl 脚本可以检测有向图中的所有循环节点的问题的解决方案? 例如,我有以下图表:

A<-N<-G<-L<- A<-B<-C<-D<-E<-F<-A Be a Graph with cyclic edges. 
use strict;
use warnings;
my @graphNodes=(A,N,G,L, A,B,C,D,E,F,A );
my depEdges= dependBy(); #Let dependBy be hypothetical function that return immediate dependents.

在其余代码中,我需要逻辑帮助来收集所有涉及循环依赖的节点。例如,在我的例子中,在节点“A”上,存在循环依赖。如何递归实现dependBy函数来查找循环边或依赖项?

【问题讨论】:

  • 您的问题到底是什么?您希望我们为您写这篇文章吗?
  • @simbabque 不是。我已经提到了。我想在有向图中找到对节点的循环依赖。只是需要合乎逻辑的帮助。
  • 不确定依赖边是什么意思。圆圈中的所有节点都是“依赖”的吗?你想找到图中每个有向圆中的节点吗?因此,在您的示例图中,您将输出 2 个圆圈中涉及的 2 组节点?
  • 在任何情况下,通常,您都必须执行递归深度优先搜索之类的操作,跟踪(/作为参数发送)所见节点。当你点击一个你以前见过的节点时,你可以记录循环并返回它。当您递归一个步骤时,您保存返回的结果并尝试不同的路径(/child)并查看它是否产生另一个循环。当您回到起始节点并且没有其他路径可以尝试时,它就会结束。不确定从哪里开始的最佳位置,但您可以全局跟踪任何未触及的节点,并在外循环中循环遍历这些节点。
  • @hepcat72 感谢您的指导。对于您的问题,所有节点都直接间接依赖于“A”或其他节点。并且,它们回到 A 形成一个循环,但是,在我的情况下,dependby 函数只会产生 BL 作为其依赖节点。同时,dependy 的进一步递归将产生 B 和 L 的相应相邻或直接边。我应该如何继续实施一个逻辑,其中“dependby”函数列出所有节点并查找循环中涉及的节点。

标签: perl graph cyclic-dependency


【解决方案1】:

虽然这不是概念上的帮助,但它是最快的解决方案:检查是否有人已经找到了解决方案。在这种情况下,您可以使用 CPAN 中的 Graph 模块来执行此操作。

use strict;
use warnings;
use feature 'say';
use Graph;

my $g = Graph->new;

my @edges = qw(A B C D E F A);
for (my $i =0; $i < $#edges; $i++) {
  $g->add_edge($edges[$i], $edges[$i+1]);
}

say $g;
say "is cyclic" if $g->is_cyclic;
say $g->find_a_cycle;

这将输出:

A-B,B-C,C-D,D-E,E-F,F-A
is cyclic
FABCDE

【讨论】:

  • 不使用图形模块怎么样?在我的例子中,“dependby”函数产生直接的依赖边。
  • @Analyzer 您应该能够使用 Graph 构建它。但是对于纯粹的算法帮助,恐怕是问这个问题的错误地方。我们帮助解决眼前的问题。事实上,这不是 Perl 问题。
  • 我更喜欢更具体的逻辑而不是内置函数:(。例如,正如我在问题中提到的那样,我已经有函数“dependby”,它可以产生直接的依赖边。
  • 我会等待更多帮助的到来。
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多