我正在寻找Python中断开连接的子图
以该图为例: 索引0代表节点A,1代表B ...等等 -1只是一个占位符,因为这是一个简单的图形,没有连接自身的边。
5代表边缘的权重(将来会有带有不同权重的图形)
[[-1 5 5 0 0]
[ 5 -1 0 0 0]
[ 5 0 -1 0 5]
[ 0 0 0 -1 0]
[ 0 0 5 0 -1]]
要查找断开的图,我首先在是否访问边缘时创建了True / False。 (默认为0和-1,为True),如下所示:
[[ True False False True True]
[False True True True True]
[False True True True False]
[ True True True True True]
[ True True False True True]]
我解决此问题的方法是从具有错误值的任何边缘开始,并从由行表示的节点开始,并经过连接该节点及其子节点的所有可能的边缘,依此类推。当我遍历这些顶点时,我将“访问”该边标记为布尔矩阵True。一旦知道“访问”了所有边缘,就知道将有一个相连的子图。 然后,我将在True / False矩阵中寻找另一个“ False”,然后从那里寻找另一个断开连接的图,并继续直到将所有元素都都填为True。
但是,我被困在遍历边缘的地方
这是我的算法:
reducedMatrix = np.load(reducedweightmatrix)
print(reducedMatrix)
boolarray = (reducedMatrix == 0) | (reducedMatrix == -1)
print(boolarray)
def traverse(iy,visited_nodes,looped):
#Only move to next index if there is no loop
# already visited node?
print("I am currently at: "+ str(iy))
print(visited_nodes)
print(looped)
print("-----------------\n")
if (iy in visited_nodes):
looped = True
if(not looped):
print("I enterred the loop")
children = []
#Find connected "children" vertices
for ix,weight in enumerate(reducedMatrix[iy]):
if weight != 0 and weight != -1:
#Collect the index with connected vertices
children.append(ix)
#I AM GOING TO VISIT THESE VERTICES
boolarray[iy,ix] = True
print(children)
visited_nodes.append(iy)
for child,children in enumerate(children):
print(child)
traverse(child,visited_nodes,looped)
return visited_nodes
print(traverse(0,[],False))
使用上面显示的示例,以下是日志消息:
[[-1 5 5 0 0]
[ 5 -1 0 0 0]
[ 5 0 -1 0 5]
[ 0 0 0 -1 0]
[ 0 0 5 0 -1]]
[[ True False False True True]
[False True True True True]
[False True True True False]
[ True True True True True]
[ True True False True True]]
I am currently at: 0
[]
False
-----------------
False
I enterred the loop
[1, 2]
0
I am currently at: 0
[0]
False
-----------------
True
1
I am currently at: 1
[0]
False
-----------------
False
I enterred the loop
[0]
0
I am currently at: 0
[0, 1]
False
-----------------
True
[0, 1]
根据上面的示例,该算法应显示以下内容: [0,1,2,4] 请指出我递归出错的地方
答案 0 :(得分:1)
我不太了解这段代码,
for child,children in enumerate(children):
print(child)
traverse(child,visited_nodes,looped)
只需将其更改为
for child in children:
print(child)
traverse(child,visited_nodes,looped)
答案就在那边。
您要访问的是孩子中的每个孩子,而不是孩子的索引。您先前在children
中保存的是索引号。您肯定不想找到索引号的索引。
编辑:如果要遍历可迭代项,请不要将名称与可迭代项本身相同。猜猜下面会发生什么?
children = list(range(10))
for child,children in enumerate(children):
pass
print(children)