Python 寻找图中的所有闭环

Python 寻找图中的所有闭环,python,math,graph,counting,Python,Math,Graph,Counting,我正在尝试编写一个Python代码,它将识别任意图中的所有闭环 所谓闭环,我指的是一个循环,除了循环开始的顶点外,它不会访问任何顶点超过一次(在这种情况下,DGHD就是一个例子,就像BCDB,或者BCEFDB,等等) 我试着用矩阵乘法来实现这一点,把图写成一个矩阵,其中有两个垂直点连接的是1,没有连接的是0,然后把它们放到n次方,不过这也会考虑到非闭环 此人似乎也做过同样的工作,但还是设法解决了: 我想知道有没有什么建议,该往哪个方向走 是一个流行的Python包,用于处理许多scient

我正在尝试编写一个Python代码,它将识别任意图中的所有闭环

所谓闭环,我指的是一个循环,除了循环开始的顶点外,它不会访问任何顶点超过一次(在这种情况下,
DGHD
就是一个例子,就像
BCDB
,或者
BCEFDB
,等等)

我试着用矩阵乘法来实现这一点,把图写成一个矩阵,其中有两个垂直点连接的是1,没有连接的是0,然后把它们放到n次方,不过这也会考虑到非闭环

此人似乎也做过同样的工作,但还是设法解决了:

我想知道有没有什么建议,该往哪个方向走

是一个流行的Python包,用于处理许多scientific Python发行版中包含的图形。它包括一些计算图循环的算法。特别是,我会回答你的问题

这种方法的一个警告是,必须将图形转换为有向图。这意味着无向图的每一条边都将成为有向图中的一个循环。(一条无向边变成两条有向边。)您可以简单地过滤输出,使其仅包含长度为三个或三个以上的循环

下面是一个使用链接到的图形的示例:

from networkx import Graph, DiGraph, simple_cycles

# construct a graph using a dict: {node:[connected_nodes]}
G = Graph(
    {'A':['B','G','H'],
     'B':['A','C','D'],
     'C':['B','D','E'],
     'D':['B','C','E','F','G', 'H'],
     'E':['C','D','F'],
     'F':['D','E','G'],
     'G':['A','D','F','H'],
     'H':['A','D','G'],
    }
)

# optional: draw the graph for verification
#labels = dict(zip(G.nodes(),G.nodes()))
#networkx.draw_networkx(G,labels=labels)

# simple_cycles only accepts DiGraphs. convert G to a bi-directional
# digraph. note that every edge of G will be included in this list!
DG = DiGraph(G)
list(simple_cycles(DG))
(截断的)输出为:

[['B', 'D', 'H', 'G', 'F', 'E', 'C'],
 ['B', 'D', 'H', 'G', 'A'],
 ['B', 'D', 'H', 'A', 'G', 'F', 'E', 'C'],
 ['B', 'D', 'H', 'A'],
 ['B', 'D', 'F', 'G', 'H', 'A'],
 ['B', 'D', 'F', 'G', 'A'],
 ['B', 'D', 'F', 'E', 'C'],
 ['B', 'D', 'G', 'F', 'E', 'C'],
 ...
]

如果您希望自己实现此功能而不使用NetworkX
simple\u cycles()
则使用约翰逊算法。(参见Donald B.Johnson,《寻找有向图的所有基本回路》,暹罗计算机杂志,4(1),77–84)

天哪,我忘了这个问题。太棒了。我能够使用这个软件包,得到我需要的东西!非常感谢你的帮助。