首页 > 解决方案 > 如何编写算法来切割节点,同时保留 NetworkX 网络?

问题描述

假设我有一个如下的简单网络,并且我想在保留整体结构的同时删除小写节点。我怎么做?这是一些示例代码:

import networkx as nx
G = nx.DiGraph();
G.add_edge("A","b")
G.add_edge("b","C")
G.add_edge("b","D")
G.add_edge("D","e")
G.add_edge("e","F")


def printHackyDot(x):
    for n in x.nodes():
        for pre in x.predecessors(n):
            print(pre + " -> " + n)

printHackyDot(G)
badNodes = [n for n in G.nodes if str.islower(n)]

运行这将产生:

A -> b
b -> C
b -> D
D -> e
e -> F

IE

这个有向图

如何编写 f(G) 以便获得类似的、简化的图形少小写节点:

A -> C
A -> D
D -> F

我想要的是

我尝试了以下方法,但是当您连续有两个小写字母时它会失败:

for badNode in [x for x  in list(G.nodes) if str.islower(x)]:
    R.remove_node(badNode)
    for predNode in G.predecessors(badNode):
        for succNode in G.successors(badNode):
            R.add_edge(predNode,succNode)

标签: networkxgraph-theory

解决方案


我假设R开始时是G?

如果您更换,这将起作用

for badNode in [x for x  in list(G.nodes) if str.islower(x)]:
    R.remove_node(badNode)
    for predNode in G.predecessors(badNode):
        for succNode in G.successors(badNode):
            R.add_edge(predNode,succNode)

与(为过早删除错误而编辑badNode

for badNode in [x for x  in list(R.nodes) if str.islower(x)]:
    for predNode in R.predecessors(badNode):
        for succNode in R.successors(badNode):
            R.add_edge(predNode,succNode)
    R.remove_node(badNode)

问题是当您连续处理两个小写节点中的第一个时,它会删除该节点。但是当你处理另一个时,它看到G那个节点有一个小写的邻居,它把边缘放回去。如果你看看它的邻居,R你会正确处理它。


推荐阅读