代码之家  ›  专栏  ›  技术社区  ›  Lorah Attkins

NetworkX图的时态拓扑排序

  •  0
  • Lorah Attkins  · 技术社区  · 2 年前

    我有一个 NetworkX graph 它是使用简单的节点和边缘类型构建的,并在节点上添加了时间戳字段:

    class Node:
      key: str
      timestamp: int
    
    class Edge:
      n1: Node # Source node
      n2: Node # Target node
    

    下面是一个构建这样一个图的例子,假设我已经有了 edges 以及 nodes :

    graph = nx.DiGraph()
    for e in edges:
        graph.add_edge(e.n1, e.n2)
    for n in nodes:
        graph.add_node(n.key, timestamp=n.timestamp)
    
    • 该图是一个“类似git图”的实体,时间戳表示“提交日期”。我想要一个也“尊重”日期的拓扑排序,所以我认为 lexicographical topological sort 该工具是否适用于工作,即按拓扑排序并使用日期打破联系?

    • 调用该算法的正确方法是什么?我正在尝试:

      networkx.lexicographical_topological_sort(graph, key=lambda n: n.timestamp)
      

      但是 timestamp 信息已作为关键字参数提供给节点构造函数。文档只提到lambda直接使用节点的情况。假设我可以访问它的成员,或者在lambda函数访问它时它是否已转换为字符串(或哈希),这是正确的吗?

    0 回复  |  直到 2 年前
        1
  •  1
  •   Juan Carlos Ramirez    2 年前

    访问其成员应该没有问题,下面是一个广播树(高度1):

    import networkx as nx
    class Node:
      def __init__(self,key,ts):
        self.key=key
        self.timestamp=ts
    
    class Edge:
      def __init__(self,n1,n2):
        self.n1=n1
        self.n2=n2
    
    listnodes = [Node("root",-1)]+[Node("dummy name",random.randint(2,10000))  for i in range(9)]
    listedges = [Edge(listnodes[0],listnodes[i+1]) for i in range(9)]
    for x in nx.lexicographical_topological_sort(G, key=lambda n: n.timestamp):
      print(x.key,x.timestamp)
    G = nx.DiGraph()
    for e in listedges:
        G.add_edge(e.n1, e.n2)
    list(G.nodes(data=True))
    for x in nx.lexicographical_topological_sort(G, key=lambda n: n.timestamp):
      print(x.key,x.timestamp)
    

    如果我运行它,我会得到:

    root -1
    dummy name 65
    dummy name 414
    dummy name 686
    dummy name 2328
    dummy name 3031
    dummy name 3651
    dummy name 4023
    dummy name 4153
    dummy name 7710