时间标记的有向图实现

时间:2016-02-04 19:16:26

标签: python matlab data-structures graph-theory digraphs

我有一系列包含相同节点但有不同边缘的有向图 - 一个动态/时间图 - 并且因为如何最好地实现它(最好是Matlab或Python)而陷入困境。

我想构建一个digraph'esque结构,其中每个节点在每个时间步(A0 - > A1 - >等)上连接到本身,并且还连接到任何该时间步的其他边缘。例如,在具有节点{A,B}的有向图中,在时间t_0,有向图被断开。在时间t_1,存在从A到B的边缘。我想创建沿着以下线的边缘:A0 - > {A1,B1}。 B0 - > {B1}。 我的问题是我无法使用有向图功能来存储节点时间步长。我不想使用不同的节点来表示不同的时间步骤,因为这使得比较太难了。我想指向'相同'节点,但是存储一个额外的时间变量,例如,当使用广度优先搜索遍历我的有向图时,我可以访问该变量。

Here is a picture of what I hope to implement!

有什么想法吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

与往常一样,适当的数据结构取决于您想要的操作 执行数据结构。所以没有更好地了解你 计划做,没有明确的答案。

但是,也许您可​​以将图形的每个状态存储为邻接矩阵。 然后,您可以将2D邻接矩阵堆叠到3D阵列中。那太好了 紧凑的结构,使您可以轻松访问每个图形作为一个片段 3D阵列,或许允许您进行跨时间步操作 设想。

使用networkx,您可以使用nx.from_numpy_matrixnx.to_numpy_matrix与邻接矩阵进行转换:

import numpy as np
import networkx as nx

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

for arr in arrs:
    G = nx.from_numpy_matrix(arr)
    print(G.edges())
    assert np.allclose(arr, nx.to_numpy_matrix(G))

在第一次迭代打印

[]            

因为没有边缘。在第二次迭代中,它打印

[(0, 0), (0, 1), (1, 1)]  

因为存在从节点0到节点0,节点0到节点1以及节点1到的边缘 节点1: