【问题标题】:How can I get the path from start to a specified node? [closed]如何获取从起点到指定节点的路径? [关闭]
【发布时间】:2021-07-13 00:32:19
【问题描述】:

我有这样的文件。

From To
1 2
2 3
3 4
3 5
4 6
5 7
6 8

如何找到每个点的路径?

例如:

对于 3 是 [(1,2), (2,3)]

8 是[(1,2),(2,3),(3,4),(4,6),(6,8)]

任何帮助将不胜感激!!!!!!!!!

【问题讨论】:

  • 从1到8的路径?
  • @AmitVikramSingh 是的,从 1 到任何总线的路径
  • 您不需要 pandas 但您可以将数据结构设置为 dict() 并使用 bfs 或 dfs
  • @user1462442 我只想找到从起点到任何所需点的路径。
  • 这与pandas无关。查找一些寻路算法,例如 DijkstraA*

标签: python pandas dictionary


【解决方案1】:

像dict这样的数据结构更适合存储图信息。

To设置为索引,这样给定一个节点x,我们可以使用df.loc[x, 'From']找到上一个节点。从目标节点开始,一直移动到上一个节点,直到得到1(source node)

用途:

df = df.set_index('To')
x = 8
output = []
while x!=1:
    y = df.loc[x, 'From']
    output = [(y, x)] + output
    x = y

打印:

>>> output
[(1, 2), (2, 3), (3, 4), (4, 6), (6, 8)]

【讨论】:

  • 谢谢,我尝试从前进到后退,这一定很困难,因为可以有多个分支。我没有想到最后一个在它之前只有一个点的相反。成功了
  • BFS 是用于此类目的的最常用算法。但是,在您的情况下,图是一棵树,这意味着从源到目标的路径是唯一的,并且我们还可以访问从节点到其父节点的反向指针,所以在这里我们可以简单地进行回溯(我希望它是正确的名称)。
【解决方案2】:

如果它适合您的目的,您可以使用“专用”包来处理图表。我将举一个networkx 的例子。在示例中:

  • 我已获取您提供的数据;
  • 将其转换为networkx Graph;
  • 打印了构成路径的节点列表(不是边缘,请注意);
  • 绘制了一个图并将其保存到 .png 文件中。
import networkx
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame(data=[(1, 2), (2, 3), (3, 4), (3, 5), (4, 6), (6, 8)],
                  columns=['from', 'to'])

g = networkx.from_pandas_edgelist(df, source='from', target='to')

# Print a list of the nodes in the path from 1 to 8
print(networkx.shortest_path(g, source=1, target=8))

# Plot the graph
networkx.draw_networkx(g)
plt.savefig("test.png", format="PNG")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多