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

实现BFS算法遇TypeError错误求助:'BFS'对象不可下标访问

BFS代码错误分析与修正

核心错误原因

  • self[current_node]是完全错误的写法:self是BFS类的实例,根本不支持下标访问([]操作)。题目明确要求用problem.successors(node)获取当前节点的后继节点,这里必须替换成这个方法。

其他多处问题

  • 队列初始化错了:queue = [problem]把问题实例塞进队列,完全没必要,应该初始化为空队列,再加入起始节点source_node。
  • 集合操作错误:visited是set()类型,没有append()方法,添加元素要用add()。
  • 没加终止判断:BFS的核心逻辑是找到目标节点就停止,你现在会遍历所有节点,浪费资源还不符合要求。
  • 没按要求用给定的Queue类:题目已经导入了Queue,你却用列表模拟队列(pop(0)效率低,也不符合作业要求)。

修正后的完整代码

from .. problem import Problem
from .. datastructures.queue import Queue


# please ignore this
def get_solver_mapping():
    return dict(bfs=BFS)


class BFS(object):
    def solve(self, problem: Problem):
        visited = set()  # 记录已访问过的节点
        queue = Queue()  # 使用题目提供的Queue数据结构
        source_node = problem.get_start_node()
        
        # 初始化:起始节点入队并标记已访问
        visited.add(source_node)
        queue.enqueue(source_node)
        
        while not queue.is_empty():  # 队列非空时持续遍历
            current_node = queue.dequeue()
            
            # 检查当前节点是否是终点,找到就直接返回
            if problem.is_end(current_node):
                return current_node
                
            # 遍历当前节点的所有后继节点
            for neighbour in problem.successors(current_node):
                if neighbour not in visited:
                    visited.add(neighbour)
                    queue.enqueue(neighbour)
        
        # 遍历完所有节点都没找到终点,返回None
        return None

关键修正说明

  1. 把self[current_node]换成problem.successors(current_node):严格按照题目提示的方式获取后继节点,这是解决报错的核心。
  2. 改用题目提供的Queue类:调用enqueue()入队、dequeue()出队、is_empty()判断队列状态,完全符合作业要求。
  3. 修正集合操作:用visited.add(neighbour)替代错误的append(),符合集合的操作规范。
  4. 加入终止条件:每次取出节点后先检查是否是终点,找到就立即返回,这是BFS的标准逻辑(保证找到的是最短路径对应的节点)。
  5. 清理队列初始化:去掉错误的problem元素,从起始节点开始正确初始化队列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 00:40:41