0

我有一系列包含相同节点但不同边的有向图 -动态/时间图- 并且一直在寻找如何最好地实现这一点的想法(最好是 Matlab 或 Python)。

我想构建一个有向图式结构,其中每个节点在每个时间步长(A0 -> A1 -> 等)上连接到自身,并且在该时间步长上连接到任何其他边。例如,在具有节点 {A, B} 的有向图中,在时间 t_0 时,有向图断开连接。在时间 t_1,从 A 到 B 有一条边。我想按照以下方式创建一些东西:A0 -> {A1,B1}。B0 -> {B1}。我的问题是我无法使用 digraph 函数来存储节点时间步长。我不想使用不同的节点来表示不同的时间步,因为它使比较变得太困难了。例如,我想指向“相同”节点,但存储一个额外的时间变量,我可以在使用广度优先搜索遍历我的有向图时访问该变量。

这是我希望实现的图片!

有任何想法吗?

谢谢你的帮助!

4

1 回答 1

0

与往常一样,适当的数据结构取决于您要对数据结构执行的操作。因此,如果没有更好地了解您打算做什么,就没有明确的答案。

但是,也许您可​​以将图的每个状态存储为邻接矩阵。然后您可以将 2D 邻接矩阵堆叠成 3D 数组。这是一个很好的紧凑结构,可以让您轻松访问每个图形作为 3D 数组的一个切片,并且可能允许您执行您设想的跨时间步操作。

使用networkx,您可以使用 和 与邻接矩阵相互nx.from_numpy_matrix转换nx.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 有边:

于 2016-02-04T19:45:18.767 回答