微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Python 中的稀疏矩阵开始获取图形中路径/步行数的有效方法

如何解决从 Python 中的稀疏矩阵开始获取图形中路径/步行数的有效方法

我想获取图中顶点 v1v2(允许多次访问相同顶点的路径)之间的行走次数

Mark Newman 的书 - 网络:简介 (see this related math.SE question) 中有一个非常简洁的算法大纲。即nv1之间长度为v2的步行次数,即w(v1,v2)=A**n [v1,v2]。 (取邻接矩阵的n次方的v1/v2元素)。

现在我的问题是我的图很大,我只能将它存储为稀疏矩阵。因此,我无法计算 A 的幂。

我尝试使用 networkx,因为我可以从稀疏矩阵创建图形。但首先,我只找到了如何计算简单路径(无需重新访问顶点的步行),其次 - 它非常慢。

import time
import numpy as np
from numpy.linalg import norm
import networkx as nx


# Max Length of 4,paths/walks between vertex 0 and 1.
len_of_paths=4
pos1=0
pos2=1


# Create random adjacency matrix and graph
np.random.seed(6)
rnd_mat=np.random.rand(250,250)
np.fill_diagonal(rnd_mat,0.1)

A = np.floor(rnd_mat+rnd_mat.transpose())
G = nx.from_numpy_matrix(A)


# Compute all simple paths using networkx
time_start=time.time()
paths_between=list(nx.all_simple_paths(G,source=pos1,target=pos2,cutoff=len_of_paths))
time_end=time.time()

print('time NetworkX: ',(time_end-time_start))



# Compute all walks using matrix multiplications
# Not possible with sparse matrices?
time_start=time.time()
Amult=A
accumulated_paths=Amult[pos1,pos2];
for ii in range(len_of_paths-1):
    Amult=np.dot(Amult,A)
    individual_paths=Amult[pos1,pos2]
    accumulated_paths+=individual_paths
    

time_end=time.time()
print('time MatMulti: ',(time_end-time_start))

print('Simple paths via networkx: ',len(paths_between))
print('Walks via matrix mult: ',accumulated_paths)

time NetworkX: 10.66906476020813

time MatMulti: 0.003000497817993164

所以 NetworkX 的速度要慢得多。

问题:有什么方法可以加快估计图中两个顶点之间的简单路径或步行次数的过程吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。