我有一个有向图
a,b,.....,z,a',b'.... c''
但我不知道里面有多少元素。它可以用不同的词来表达。 它们可以例如以a-b,b-c,c-d,....的方式连接。
我想在此图中添加传递闭包,它将在a-c,a-d等之间创建连接。
我的算法应该改变什么才能达到任何给定图形的传递闭包。现在它只适用于包含3个节点的图形。 我的代码如下。
for x in G:
# Extract all neighbours of neighbours of x (from G)
all_nh = []
for y in G.neighbours(x):
all_nh += G.neighbours(y)
# Remove from the list of neighbors the current node and its immediate neighbors
all_nh = set(all_nh) - set([x]) - set(G.neighbours(x))
# Create new edges (x -> z)
edges = map(lambda z: (x, z), all_nh)
# Add them to the new graph
TC.add_edges_from(edges)
好的,我试图实现下面提供的伪代码。但是我仍然需要帮助,因为编译器会返回很多错误。对于前者TypeError:“NoneType”类型的对象没有len()
class FlowGraph:
def __init__(self):
self.G=nx.DiGraph()
self.I=[]
self.O=[]
F2=FlowGraph()
#F2.G=nx.Graph()
F2.G.add_node(1)
F2.G.add_node(2)
F2.G.add_node(3)
F2.G.add_node(4)
F2.G.add_edge(1,2)
F2.G.add_edge(2,3)
F2.G.add_edge(3,4)
def transitive_closure(G):
TC = G.copy()
n_nodes = len(G)
#print(n_nodes)
for i in range(n_nodes):
for j in range(n_nodes):
for k in range(n_nodes):
if TC.has_edge(i,k) and TC.has_edge(k,j):
TC.add_edge(i,j)
Z = transitive_closure(F2.G)
nx.draw(Z, with_labels = True)
plt.show()
答案 0 :(得分:0)
计算传递闭包的最简单方法是使用Floyd-Warshall。设TC
为传递闭包图,G
为原始
TC = G # copy all edges from G to TC
for i in range(n_nodes):
for j in range(n_nodes):
for k in range(n_nodes):
if TC.has_edge(i,k) and TC.has_edge(k,j):
TC.add_edge(i,j)