为何BFS用queue解决是合理的

为何BFS用queue解决是合理的
想象这个问题场景. 由于BFS要求以源节点为中心, 从近到远访问所有节点.
我们用递推证明访问顺序是从近到远的:
起初, 队列中只有一枚源节点.
当k=1时, 取出队首访问, 标记为不可再访问, 将其所有邻居加入队列. 这样会把所有距离为1的节点加入, 并标记不可再访问.
当k=2时, 依次取出队列所有节点, 对其访问并标记. 将所有可以访问的邻居加入队列并标记. 在该阶段开始时, 有这样几个性质:

  1. 所有距离0和1的节点都已标记不可再访问. 这样之后能加入队列的节点一定是距离2以上的.
  2. 每个距离1的节点都已加入队列, 都将被访问, 而每个距离2的节点都与某距离1的节点相连, 因此每个距离2的节点都将被访问. 队列中当前只有距离为1的点, 因此遍历这些点, 只会将距离为2的点加入, 而不会有其它距离的点加入.

由此类推, 可得所有距离的节点都会被访问, 且会按照距离顺序被访问.

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是根据你的要求构建真空吸尘器世界的搜索 Agent,并评价其性能的 Python 代码: ```python import random from collections import deque # 定义状态类 class State: def __init__(self, location, direction, grid): self.location = location # 吸尘器位置坐标 self.direction = direction # 吸尘器方向 self.grid = grid # 环境状态矩阵 # 定义操作符 actions = ['UP', 'DOWN', 'LEFT', 'RIGHT'] movements = { 'UP': (-1, 0), 'DOWN': (1, 0), 'LEFT': (0, -1), 'RIGHT': (0, 1) } def move(state, action): # 根据操作进行移动 row, col = state.location dr, dc = movements[action] new_location = (row + dr, col + dc) new_direction = action new_grid = state.grid.copy() if 0 <= row + dr < len(new_grid) and 0 <= col + dc < len(new_grid[0]): new_grid[row][col] = 0 return State(new_location, new_direction, new_grid) # 实现广度优先搜索算法 def bfs(initial_state): queue = deque([initial_state]) while queue: state = queue.popleft() if is_goal_state(state): return state for action in actions: new_state = move(state, action) queue.append(new_state) return None # 判断是否为目标状态 def is_goal_state(state): for row in state.grid: for cell in row: if cell != 0: return False return True # 构造初始状态 def generate_initial_state(): location = (random.randint(0, 2), random.randint(0, 2)) direction = random.choice(actions) grid = [[1 if random.random() < 0.2 else 0 for _ in range(3)] for _ in range(3)] return State(location, direction, grid) # 运行搜索算法 initial_state = generate_initial_state() goal_state = bfs(initial_state) # 评价性能 def calculate_path_cost(state): path_cost = 0 for row in state.grid: for cell in row: if cell != 0: path_cost += 1 return path_cost def calculate_search_cost(): search_cost = 0 queue = deque([initial_state]) while queue: state = queue.popleft() search_cost += 1 if is_goal_state(state): return search_cost for action in actions: new_state = move(state, action) queue.append(new_state) return search_cost path_cost = calculate_path_cost(goal_state) search_cost = calculate_search_cost() print("目标状态路径代价:", path_cost) print("搜索开销:", search_cost) ``` 这段代码中,我们首先定义了一个状态类 `State`,其中包含了吸尘器的位置、方向和环境状态矩阵。然后,我们定义了操作符和移动函数,实现了广度优先搜索算法来搜索最优路径。接着,我们构造了初始状态,并运行搜索算法得到目标状态。最后,我们评价了性能,包括路径代价和搜索开销。 请注意,在生成初始状态的函数 `generate_initial_state()` 中,我们使用了 `random.randint(0, 2)` 来生成吸尘器的初始位置坐标。而在评价性能的函数 `calculate_path_cost(state)` 和 `calculate_search_cost()` 中,我们分别计算了路径代价和搜索开销。 希望这段代码能满足你的需求。如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值