Python 我是否可以显示算法在查找元素时遵循的路径

Python 我是否可以显示算法在查找元素时遵循的路径,python,breadth-first-search,Python,Breadth First Search,我是python新手,我正在尝试为一个简单的图编写广度优先搜索代码。我想展示算法如何遍历节点以找到目标节点。i、 例如,到达目标节点的路径。我有最短路径的代码,但我需要帮助为我的作业编写基本宽度优先搜索代码。请原谅任何错误。任何关于python的提示和技巧都会有很大的帮助。谢谢 graph = {'A': ['B', 'C'], 'B': ['D', 'E'], 'C': ['F', 'G'], 'D': ['B'], 'E

我是python新手,我正在尝试为一个简单的图编写广度优先搜索代码。我想展示算法如何遍历节点以找到目标节点。i、 例如,到达目标节点的路径。我有最短路径的代码,但我需要帮助为我的作业编写基本宽度优先搜索代码。请原谅任何错误。任何关于python的提示和技巧都会有很大的帮助。谢谢

graph = {'A': ['B', 'C'],
         'B': ['D', 'E'],
         'C': ['F', 'G'],
         'D': ['B'],
         'E': ['B'],
         'F': ['C'],
         'G': ['C']}
此示例的预期输出应该是
['A'、'B']、['A'、'C']、['A'、'C'、'F']
我得到的输出是
['A'、'B']、['A'、'C']

我不完全确定您的代码是什么,但对于广度优先搜索,我会这样做:

  • 在函数之外,创建一个列表,该列表将表示算法遵循的“路径”
  • 将开始元素追加到此列表
  • 将搜索函数的一个参数设置为此列表
  • 在函数中,在执行递归调用之前,将调用要检查的元素附加到列表中
  • def bfs(当前节点,已浏览列表):
    ...
    #逻辑
    ...
    explored\u list.append(下一个\u节点)
    bfs(下一个搜索节点,搜索搜索列表)
    已浏览列表=[]
    explored\u list.append(启动\u节点)
    bfs(开始节点,探索列表)
    

    如果您的逻辑是这样工作的,您显然可以使用不同的参数,但这是我将使用的一般结构。

    我认为您对返回和打印感到困惑。 请注意,数组是可变的,这意味着更改相关数组将影响其值。如果要使它们不可变,则需要在将array.copy()赋值/追加到另一个变量时将其放入

    代码返回['A','C','F'] 然而,它正在打印['A'、'B']、['A'、'C'] 如果希望返回值是
    ['A','B'],['A','C'],['A','C','F']
    ,则需要记录上一个循环中的节点。这里有一个可能的解决方案

    def BFS(graph, start, end):
    
        nodes = [[start]]
        explored = []
        previous_nodes=[]
        count = 0
        while nodes:
            count += 1
            print (count)
            print(f'explored is {explored}')
            print(f'nodes are {nodes}')
    
            path = nodes.pop(0)
            current = path[-1]
            if current not in explored:
                neighbours = graph[current]
                for neighbour in neighbours:
                    new = list(path)
                    new.append(neighbour)
                    nodes.append(new)
                    if neighbour == end:
                        return [previous_nodes,new]
                explored.append(nodes)
                previous_nodes.append(nodes.copy()[0])
            print(explored)
        return "Couldn't Find"
    print('return is ',BFS(graph,'A','F'))
    

    请注意,有许多具有数据结构的库可以使您的工作更轻松,例如numpy,pandas

    明白了!谢谢!!谢谢!!我现在明白了
    def BFS(graph, start, end):
    
        nodes = [[start]]
        explored = []
        previous_nodes=[]
        count = 0
        while nodes:
            count += 1
            print (count)
            print(f'explored is {explored}')
            print(f'nodes are {nodes}')
    
            path = nodes.pop(0)
            current = path[-1]
            if current not in explored:
                neighbours = graph[current]
                for neighbour in neighbours:
                    new = list(path)
                    new.append(neighbour)
                    nodes.append(new)
                    if neighbour == end:
                        return [previous_nodes,new]
                explored.append(nodes)
                previous_nodes.append(nodes.copy()[0])
            print(explored)
        return "Couldn't Find"
    print('return is ',BFS(graph,'A','F'))