【发布时间】:2020-10-15 05:14:15
【问题描述】:
我有一个邻接矩阵形状的图形 (adj_mat.shape = (4000, 4000))。我当前的问题涉及查找从源 (row = 0 ) 遍历到目标 (col = trans_mat.shape[0] -1) 的路径长度列表(节点序列并不那么重要)。
我不对查找路径序列感兴趣;我只对传播路径长度感兴趣。因此,这与查找 所有简单路径 不同 - 这太慢了(即,查找从源到目标的所有路径;然后对每条路径进行评分)。有没有一种高效的方法可以快速做到这一点?
建议使用 DFS as one possible strategy (noted here)。我当前的实现(如下)根本不是最佳的:
# create graph
G = nx.from_numpy_matrix(adj_mat, create_using=nx.DiGraph())
# initialize nodes
for node in G.nodes:
G.nodes[node]['cprob'] = []
# set starting node value
G.nodes[0]['cprob'] = [0]
def propagate_prob(G, node):
# find incoming edges to node
predecessors = list(G.predecessors(node))
curr_node_arr = []
for prev_node in predecessors:
# get incoming edge weight
edge_weight = G.get_edge_data(prev_node, node)['weight']
# get predecessor node value
if len(G.nodes[prev_node]['cprob']) == 0:
G.nodes[prev_node]['cprob'] = propagate_prob(G, prev_node)
prev_node_arr = G.nodes[prev_node]['cprob']
# add incoming edge weight to prev_node arr
curr_node_arr = np.concatenate([curr_node_arr, np.array(edge_weight) + np.array(prev_node_arr)])
# update current node array
G.nodes[node]['cprob'] = curr_node_arr
return G.nodes[node]['cprob']
# calculate all path lengths from source to sink
part_func = propagate_prob(G, 4000)
【问题讨论】:
-
我不认为你可以在不找到路径的情况下找到路径长度。
-
也许我理解错了。我可以想象在每个节点传播传入边权重的列表。连接边权重 + 所有前面的传入边权重描绘了所有可能的路径长度。
-
但同样的也构建了所有路径。
-
我根据您关于查找路径与查找路径长度的语义的问题编辑了我的问题。但是在不记录路径序列的情况下找到路径长度真的找到了路径吗?我不太确定。例如,在 HMM 中,前向算法不需要枚举所有可能发出感兴趣序列的路径;它只是传播从先前状态传播的概率。
标签: graph networkx igraph depth-first-search breadth-first-search