You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求提供Python实现Bidirectional Search的代码示例(附已实现BFS代码)

双向搜索(Bidirectional Search)的Python实现示例

没问题,我来帮你实现双向搜索~ 你理解的核心思路完全正确:同时从起点和终点分别进行广度优先搜索(BFS),当两个搜索的路径在某个节点交汇时,就找到了连接起点和终点的最短路径,这时候就可以终止搜索啦。

下面是完整的实现代码,我还加了测试用例方便你验证:

def bidirectional_search(graph, start, goal):
    # 初始化两个方向的队列、已访问集合和父节点映射(用于路径回溯)
    start_queue = [start]
    end_queue = [goal]
    start_visited = {start: None}  # 记录起点方向每个节点的父节点
    end_visited = {goal: None}     # 记录终点方向每个节点的父节点

    while start_queue and end_queue:
        # 先扩展起点方向的BFS
        current_start = start_queue.pop(0)
        # 检查当前节点是否已经被终点方向的搜索访问过
        if current_start in end_visited:
            # 找到交汇点,拼接路径并返回
            return _reconstruct_path(current_start, start_visited, end_visited)
        
        # 遍历当前节点的邻居
        for neighbor in graph[current_start]:
            if neighbor not in start_visited:
                start_visited[neighbor] = current_start
                start_queue.append(neighbor)
        
        # 再扩展终点方向的BFS
        current_end = end_queue.pop(0)
        # 检查当前节点是否已经被起点方向的搜索访问过
        if current_end in start_visited:
            # 找到交汇点,拼接路径并返回
            return _reconstruct_path(current_end, start_visited, end_visited)
        
        # 遍历当前节点的邻居
        for neighbor in graph[current_end]:
            if neighbor not in end_visited:
                end_visited[neighbor] = current_end
                end_queue.append(neighbor)
    
    # 如果两个队列都空了还没找到交汇点,说明起点到终点没有路径
    return None

def _reconstruct_path(meet_node, start_visited, end_visited):
    # 回溯得到从起点到交汇点的路径
    path = []
    current = meet_node
    while current is not None:
        path.append(current)
        current = start_visited[current]
    # 反转路径,变成起点到交汇点的顺序
    path.reverse()
    
    # 回溯得到从交汇点到终点的路径(跳过交汇点本身,避免重复)
    current = end_visited[meet_node]
    while current is not None:
        path.append(current)
        current = end_visited[current]
    
    return path

# 测试用例:运行一下看看效果
if __name__ == "__main__":
    # 定义一个示例无向图
    sample_graph = {
        'A': ['B', 'C'],
        'B': ['A', 'D', 'E'],
        'C': ['A', 'F'],
        'D': ['B'],
        'E': ['B', 'F'],
        'F': ['C', 'E']
    }
    
    start_point = 'A'
    goal_point = 'F'
    search_result = bidirectional_search(sample_graph, start_point, goal_point)
    
    if search_result:
        print(f"找到的最短路径: {' -> '.join(search_result)}")
    else:
        print("起点到终点不存在可达路径")

代码关键点说明

  • 我们维护了两个独立的BFS状态:一个从起点出发,一个从终点出发
  • 每次扩展完一个方向的节点后,都会检查是否和另一个方向的已访问节点重叠,重叠时就触发路径拼接
  • _reconstruct_path函数负责把两个方向的路径拼接成完整的起点到终点的路径
  • 相比单向BFS,双向搜索的时间和空间复杂度都会更低,因为两个搜索的范围都是从各自端点向中间延伸,覆盖的节点数更少

内容的提问来源于stack exchange,提问作者AAT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:19:56