八数码广度优先算法python
时间: 2023-10-24 15:24:05 浏览: 128
以下是八数码问题的广度优先搜索算法 Python 实现:
```python
from collections import deque
def bfs(start, goal):
queue = deque([(start, [])])
visited = set()
while queue:
node, path = queue.popleft()
if node == goal:
return path
visited.add(node)
for child, move in successors(node):
if child not in visited:
queue.append((child, path + [move]))
return None
def successors(state):
state = list(state)
i = state.index(0)
if i not in (0, 1, 2):
yield swap(state, i, i-3), 'Up'
if i not in (6, 7, 8):
yield swap(state, i, i+3), 'Down'
if i not in (0, 3, 6):
yield swap(state, i, i-1), 'Left'
if i not in (2, 5, 8):
yield swap(state, i, i+1), 'Right'
def swap(state, i, j):
state = state[:]
state[i], state[j] = state[j], state[i]
return tuple(state)
```
其中 `bfs` 函数接受起始状态 `start` 和目标状态 `goal` 作为参数,返回从起始状态到目标状态的动作列表。`successors` 函数接受一个状态作为参数,返回以该状态为基础生成的新状态及对应的移动方向。`swap` 函数是一个辅助函数,用于交换状态中两个位置的值。
具体来说,该算法使用一个队列 `queue` 存储待处理节点,一个集合 `visited` 存储已经处理过的节点。每次从队列中取出一个节点 `node`,如果该节点是目标状态,则返回当前路径 `path`,否则将该节点标记为已处理,并遍历该节点的所有子节点。对于每一个子节点 `child`,如果该节点未被处理过,则将其加入队列,并将当前路径 `path` 增加对应的移动方向。如果队列为空,说明无法到达目标状态,返回 `None`。
阅读全文