生物医学网络科学Biomedical Network Science
网络结构指标与随机图03 / 19

路径、距离与最短路径算法

阅读
约 2 分钟

路径与最短路径

路径(path)是一串节点,相邻节点之间都有边相连;路径包含的边数称为路径长度。两个节点之间的距离(distance)dijd_{ij} 是它们之间最短路径的长度,也叫测地距离(geodesic distance)。若两点之间不存在路径,约定 dij=∞d_{ij} = \infty。有向网络中一般 dij≠djid_{ij}\ne d_{ji},甚至可能一个有限、一个无穷。

邻接矩阵的幂有一个漂亮的性质:(Ah)ij(A^h)_{ij} 等于从 ii 到 jj 长度恰为 hh 的途径(walk,允许重复经过节点和边)条数。因此 dijd_{ij} 就是使 (Ah)ij>0(A^h)_{ij} > 0 的最小 hh。途径计数也是谱类中心性的出发点。

离心率、直径与平均路径长度

离心率(eccentricity):εi=max⁡jdij\varepsilon_i=\max_j d_{ij},节点 ii 到最远节点的距离。半径为 min⁡iεi\min_i\varepsilon_i,直径(diameter)为 D=max⁡iεi=max⁡i,jdijD = \max_i\varepsilon_i=\max_{i,j} d_{ij}。 平均路径长度(average path length;脑网络文献中常称特征路径长度,characteristic path length):所有节点对之间距离的平均值, L=1N(N−1)∑i≠jdij.L = \frac{1}{N(N-1)}\sum_{i \ne j} d_{ij}.

直径对单个“偏远”节点很敏感,平均路径长度更能反映典型情况。网络不连通时 LL 为无穷大,常见处理有两种:只在最大连通分支上计算 LL;或改用全局效率(见全局效率与局部效率),不连通的节点对贡献 0。后者在脑网络研究中很常用。

广度优先搜索

怎样计算距离?广度优先搜索(breadth-first search,BFS)是最基本的算法:

  1. 把源点 ss 标记为距离 0,放入队列;
  2. 从队列取出一个节点 vv,把它尚未标记的邻居标记为 d(v)+1d(v)+1,放入队列尾部;
  3. 重复第 2 步直到队列为空。

BFS 像水波一样从源点“一层一层”向外扩散,每一层的节点距离相同。它的计算量与 N+MN+M 成正比,在稀疏网络上非常快。对每个节点各做一次 BFS,就得到所有节点对之间的距离。加权网络的最短路径要用 Dijkstra 算法(单源,要求长度非负)或 Floyd–Warshall 算法(全点对,O(N3)O(N^3),适合几百个节点的稠密脑网络),并且要先想清楚“距离”与“权重”的关系:相关系数越大表示连接越强,转换成长度时通常取倒数或 −log⁡w-\log w(见加权网络的指标)。

算例:路径图 1–2–3–4 共有 6 个节点对,距离为 1、1、1、2、2、3,故 L=10/6≈1.67L=10/6\approx1.67,直径 D=3D=3,端点的离心率为 3,中间两点的离心率为 2,半径为 2。