在网络图中查找所有配对

时间:2018-11-01 00:26:50

标签: python pandas dataframe graph-theory shortest-path

我想解决一个问题。我有一个熊猫DataFrame的列Source,Target和Freq。

假设我对节点1感兴趣。可以按以下方式链接节点1。

Source Target
5 1
3 5
2 3
6 2

5是源,当1是目标时,3是源,当5是目标且链接继续时。我实质上是在尝试创建一个网络图,该图将b 6-2-3-5-1

有什么方法可以以编程方式找到最终将以我选择的 Target 结尾的所有源-目标组合?

编辑:进行编辑以提供更多说明。

1 个答案:

答案 0 :(得分:2)

  

是否可以通过编程方式找到所有源-目标组合

是的,这被称为Shortest path problem,它被赋予一个图 G ,该图由通过边 E <相连的节点/顶点 V 构成/ em>查找源节点和目标节点之间的最短路径。您指定的是边的列表,其中每个边将某个节点 v(i)连接到另一个节点 v(j)

有几种实现解决方案的算法。您可以使用NetworkX之类的库,这样就不必自己实现算法。例如,

# let's create the data frame as per your example
import pandas as pd
df = pd.DataFrame([
        (5, 1),
        (3, 5),
        (2, 3),
        (6, 2),
    ], columns=['source', 'target'])

# import networkx and build the graph
import networkx as nx
G = nx.Graph()
G.add_edges_from(df.values)

# import the shortest_paths generic algorithm
nx.shortest_path(G, source=6, target=1)
=> 
[6, 2, 3, 5, 1]
  

找到所有源-目标组合

NetworkX提供many algorithms,您应该将其与要解决的特定用例相匹配。要找到给定源节点和目标节点的所有可能路径,

# assume we have added another edge source=6 target=1 
list(nx.all_simple_paths(G, source=6, target=1))
=> 
[[6, 1], [6, 2, 3, 5, 1]]
  

所有最终会以我选择的目标为目标的源-目标组合(...)

我们想找到所有可能的最终到达我们选择的目标的源节点和路径,而无需指定源节点:

# find all start/end nodes
import networkx as nx
# -- we need a directed graph
dG = nx.DiGraph()
dG.add_edges_from(df.values)
# -- find possible source nodes
source_nodes = [x for x in G.nodes_iter() if dG.out_degree(x) >= 1]
# -- for every source node find the shortest path to target
paths = [nx.shortest_path(G, source=source, target=1) for source in source_nodes]
paths
=>
[[2, 3, 5, 1], [3, 5, 1], [5, 1], [6, 2, 3, 5, 1]]