【问题标题】:Python Making possible paths for x and y pointsPython为x和y点制作可能的路径
【发布时间】:2019-09-17 02:08:08
【问题描述】:

我有一个 X 点和 Y 点的列表,这些点将被导入到程序中。我想知道是否可以为如何连接它们创建一个目录?几乎就像一个树形图,但不是使用边缘,而是使用 x 和 y 点。

示例中的[0] 将是起点,数字将是导入文件中的点。

举例

                           ----4------5
                           |
8------7-----6----[0]------1-------2-----3
       |
    9---

我发现了一种名为Breadth-first search 的算法,如果给定起点和终点,它能够确定最佳路径。我知道该算法用于搜索可能的路径但不确定路径。如果给出上面示例中的要点..

point    X    Y
  0      0    0
  1      1    0
  2      2    0
  3      3    0
  4      1.5  0.5
  5      2.5  0.5
  6      -1   0
  7      -2   0
  8      -3   0
  9      -2.5 -0.5

我希望以上几点能够生成一个类似..的目录

graph = {
        '0': ['1', '6'],
        '1': ['2', '4'],
        '2': ['3'],
        '4': ['5'],
        '6': ['7'],
        '7': ['8','9']
        }

我为Breadth-first Search 找到了一个很好的例子here,但它需要已经创建的目录结构。感谢您提供任何帮助或建议。

广度优先搜索.py

def bfs(graph, start, end):
    queue = []
    queue.append([start])
    while queue:
        path = queue.pop(0)
        node = path[-1]
        if node == end:
            return path
        for adjacent in graph.get(node, []):
            new_path = list(path)
            new_path.append(adjacent)
            queue.append(new_path)

print(bfs(graph, '0', '5'))

【问题讨论】:

    标签: python python-3.x tree graph-theory shortest-path


    【解决方案1】:

    假设您打算在结果中包含 5 作为键,您可以使用递归来创建所需的字典:

    import math, collections
    data = {0.0: [0.0, 0.0], 1.0: [1.0, 0.0], 2.0: [2.0, 0.0], 3.0: [3.0, 0.0], 4.0: [1.5, 0.5], 5.0: [2.5, 0.5], 6.0: [-1.0, 0.0], 7.0: [-2.0, 0.0], 8.0: [-3.0, 0.0], 9.0: [-2.5, -0.5]}
    def group(d, start, seen = []):
       x, y = d[start]
       r = [a for a, [j, k] in d.items() if a != start and a not in seen and math.hypot(abs(x-j), abs(y-k)) <= 1]
       if not r:
         return {}
       result = {start:r}
       for i in r:
         result.update(group(d, i, seen+[start, *r]))
       return result
    
    result = group(data, 0) 
    

    输出:

    {0: [1.0, 6.0], 1.0: [2.0, 4.0], 2.0: [3.0, 5.0], 4.0: [5.0], 5.0: [3.0], 6.0: [7.0], 7.0: [8.0, 9.0]}
    

    将值转换为字符串:

    new_result = {str(int(a)):list(map(str, map(int, b))) for a, b in result.items()}
    

    输出:

    {'0': ['1', '6'], '1': ['2', '4'], '2': ['3', '5'], '4': ['5'], '5': ['3'], '6': ['7'], '7': ['8', '9']}
    

    【讨论】:

    • 这很好,感谢您的回复,但我实际上是想将5 排除在外,因为它已经结束了运行,并且没有连接到任何下游。就像3、8和`9,
    • @laxer 感谢您的评论。您能否阐明您希望如何关联不同的价值观? 3、8 和 9 不存在,因为它们没有与任何节点 &lt;= 1 的路径,但是,5 不能有到 2 的路径,反之亦然?跨度>
    【解决方案2】:

    正如您所说,广度优先搜索不是在给定两个节点的情况下找到最佳路径的算法,它只会告诉您是否存在连接它们的路径。如果你想要最好的路径,可以使用三种著名的算法:Dijkstra、Bellman-Ford 和 Floyd-Warshall。在您的情况下,我相信 Dijkstra 将是最佳选择。

    Python 中有一个易于使用且出色的库来处理图形,它被称为Networkx。它有很多方法可以解决几乎所有与图相关的问题,包括我提到的算法。这是在此库上实现的Dijkstra's algorithm 的链接。

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 2022-11-13
      • 2022-11-16
      相关资源
      最近更新 更多