python - 广度优先搜索所有路径

标签 python breadth-first-search

首先感谢您百忙之中看到这个问题。

对于学校作业,我们应该创建一个 BFS 算法并用它来做各种事情。其中之一是我们应该找到图的根节点和目标节点之间的所有路径。我不知道如何做到这一点,因为我无法找到一种方法来跟踪所有备用路线而不包括副本/周期。

这是我的 BFS 代码:

def makePath(predecessors, last):
    return makePath(predecessors, predecessors[last]) + [last] if last else []

def BFS1b(node, goal):
    Q = [node]
    predecessor = {node:None}

    while Q:
        current = Q.pop(0)
        if current[0] == goal:
            return makePath(predecessor, goal)

        for subnode in graph[current[0]][2:]:
            if subnode[0] not in predecessor:
                predecessor[subnode[0]] = current[0]
                Q.append(subnode[0])

如果能在概念上插入正确的方向,我们将不胜感激。

tl;dr 如何使用 BFS 查找两个节点之间的所有路径?

这是图表,因为我不确定如何回答 Jeff Marcado 的问题。

graph = {   'A':[366, 3,    ('Z',   75 ), ('T', 118), ('S', 140)],
            'Z':[374, 2,    ('A',   75 ), ('O', 71 )],
            'T':[329, 2,    ('A',   118), ('L', 111)],
            'L':[244, 2,    ('T',   111), ('M', 70 )],
            'M':[241, 2,    ('L',   70 ), ('D', 75 )],
            'D':[242, 2,    ('M',   75 ), ('C', 120)],
            'C':[160, 3,    ('D',   120), ('R', 146), ('P', 138)],
            'R':[193, 3,    ('C',   146), ('P', 97 ), ('S', 80 )],
            'S':[253, 4,    ('R',   80 ), ('F', 99 ), ('O', 151), ('A', 140)],
            'O':[380, 2,    ('S',   151), ('Z', 71 )],
            'P':[100, 3,    ('C',   138), ('R', 97 ), ('B', 101)],
            'F':[176, 2,    ('S',   99 ), ('B', 211)],
            'B':[  0, 4,    ('P',   101), ('F', 211), ('G', 90 ), ('U', 85 )],
            'G':[ 77, 1,    ('B',   90 )],
            'U':[ 80, 3,    ('B',   85 ), ('H', 98 ), ('V', 142)],
            'H':[151, 2,    ('U',   98 ), ('E', 86 )],
            'E':[161, 1,    ('H',   86 )],
            'V':[199, 2,    ('U',   142), ('I', 92 )],
            'I':[226, 2,    ('V',   92 ), ('N', 87 )],
            'N':[243, 1,    ('I',   87 )],
            'W':[400, 1,    ('X',   100)],
            'X':[400, 1,    ('W',   100)],}

最佳答案

首先,当你到达目标节点时,你的算法不应该返回,否则你将只有一个解决方案。相反,您应该使用列表来存储各种解决方案。

关于算法的核心,请记住,BFS 搜索不会一次探索一条路径,而是探索所有路径。因此,您不能只在队列中存储一个节点,而是存储一条路径。

然后,您只需检查下一个节点是否不在当前路径中即可添加它以避免循环。如果当前路径的最后一个节点是目标节点,则将其追加到解决方案列表中。

最后,当队列中不再有不完整路径时(==队列为空),返回解列表。

关于python - 广度优先搜索所有路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13168641/

相关文章:

python - 为什么我不能导入 nltk?

algorithm - 高炉? - 找到从 s 到 t 的所有路径,其长度至多为一定长度

python 在使用 ssh 时找不到模块

python django - 即使在安装编译版本 psycopg2-2.4.5.win32-py2.7.‌exe 之后也没有模块 psycopg2.extension

python - 安装 awslogs 代理时遇到问题

获取 pandas 数据框中元素的序列相关性的 Pythonic 方法

java - 减少 BFS 算法占用的 RAM 量

c++ - BFS 检查图是否在 C++ 中是二分的

c++ - 使用广度优先搜索 (BFS) 调试简单图算法

breadth-first-search - 使用邻接矩阵表示的广度优先搜索的时间复杂度?