Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python networkx中的传递闭包_Python_Networkx - Fatal编程技术网

Python networkx中的传递闭包

Python networkx中的传递闭包,python,networkx,Python,Networkx,考虑以下示例: import numpy as np import networkx as nx a = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]]) G = nx.from_numpy_matrix(a, create_using=nx.MultiDiGraph()) T = nx.transitive_closure(G) print(nx.to_numpy_matrix(T)) 传递闭包缺少预期的自循环。为什么?(文档链接不起作用。)“预

考虑以下示例:

import numpy as np
import networkx as nx

a = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]])

G = nx.from_numpy_matrix(a, create_using=nx.MultiDiGraph())

T = nx.transitive_closure(G)

print(nx.to_numpy_matrix(T))

传递闭包缺少预期的自循环。为什么?(文档链接不起作用。)“预期”是指“根据标准定义”,例如。我预计会使用不同的定义,但它是什么?

看起来像是一个实现错误。docstring在定义上是明确的:“一个图G+=(V,E+)使得对于V中的所有V,w,当且仅当G中存在从V到w的非空路径时,E+中有一条边(V,w)。”自循环符合此定义

该算法归结为,在将TC作为给定G的副本之后

for v in G:
    TC.add_edges_from((v, u) for u in nx.dfs_preorder_nodes(G, source=v)
                      if v != u)
因此,由于
if v!=u
。排除的原因是,
dfs\u preorder\u节点
的输出将以
v
(源)开始,而不管有什么边,当然,我们不想仅仅因为这一点而添加循环
(v,v)
。但作为依赖
dfs\u preorder\u节点
的副作用,该算法永远无法确定
v
本身是否可以通过非空路径从
v
访问

因此,为了获得通常意义上的传递闭包,我们需要为位于循环上的每个节点添加循环
(v,v)
。像这样:

T = nx.transitive_closure(G)

for cycle in nx.simple_cycles(G):
    T.add_edges_from((v, v) for v in cycle)
在矩阵形式中,
T
现在是

[[4. 2. 2.]
 [2. 4. 2.]
 [2. 2. 4.]]
循环被添加了多次。如果您关心多重性(虽然我不知道传递闭包需要什么样的边多重性),可以这样做来防止多次添加边:

cycles = frozenset().union(*[frozenset(cycle) for cycle in nx.simple_cycles(G)])
T.add_edges_from((v, v) for v in cycles)
然后
T

[[1. 2. 2.]
 [2. 1. 2.]
 [2. 2. 1.]]

文档中的链接已断开,因为看起来David Eppstein(链接到的文件的作者)已将PADS目录转换为git存储库。如果要签出引用的文件,可以克隆存储库:
git clonehttp://www.ics.uci.edu/~eppstein/PADS/.git