您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python广度搜索解决八数码难题

51自学网 2021-10-30 22:46:25
  python
这篇教程python广度搜索解决八数码难题写得很实用,希望能帮到您。

—— 八数码难题 ——

1.题目描述

八数码问题也称为九宫问题。在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同。棋盘上还有一个空格,与空格相邻的棋子可以移到空格中。要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始状态转变成目标状态的移动棋子步数最少的移动步骤。

代码

使用算法:广度搜索算法

python

import numpy as npclass State: def __init__(self, state, directionFlag=None, parent=None): self.state = state self.direction = ['up', 'down', 'right', 'left'] if directionFlag:  self.direction.remove(directionFlag) self.parent = parent self.symbol = ' ' def getDirection(self): return self.direction def showInfo(self): for i in range(3):  for j in range(3):  print(self.state[i, j], end=' ')  print("/n") print('->/n') return def getEmptyPos(self): postion = np.where(self.state == self.symbol) return postion def generateSubStates(self): if not self.direction:  return [] subStates = [] boarder = len(self.state) - 1 row, col = self.getEmptyPos() if 'left' in self.direction and col > 0:  s = self.state.copy()  temp = s.copy()  s[row, col] = s[row, col-1]  s[row, col-1] = temp[row, col]  news = State(s, directionFlag='right', parent=self)  subStates.append(news) if 'up' in self.direction and row > 0:  s = self.state.copy()  temp = s.copy()  s[row, col] = s[row-1, col]  s[row-1, col] = temp[row, col]  news = State(s, directionFlag='down', parent=self)  subStates.append(news) if 'down' in self.direction and row < boarder:  s = self.state.copy()  temp = s.copy()  s[row, col] = s[row+1, col]  s[row+1, col] = temp[row, col]  news = State(s, directionFlag='up', parent=self)  subStates.append(news) if self.direction.count('right') and col < boarder:  s = self.state.copy()  temp = s.copy()  s[row, col] = s[row, col+1]  s[row, col+1] = temp[row, col]  news = State(s, directionFlag='left', parent=self)  subStates.append(news) return subStates def solve(self): openTable = [] closeTable = [] openTable.append(self) steps = 1 while len(openTable) > 0:  n = openTable.pop(0)  closeTable.append(n)  subStates = n.generateSubStates()  path = []  for s in subStates:  if (s.state == s.answer).all():   while s.parent and s.parent != originState:   path.append(s.parent)   s = s.parent   path.reverse()   return path, steps+1  openTable.extend(subStates)  steps += 1 else:  return None, Noneif __name__ == '__main__': symbolOfEmpty = ' ' State.symbol = symbolOfEmpty originState = State(np.array([[2, 8, 3], [1, 6 , 4], [7, symbolOfEmpty, 5]])) State.answer = np.array([[1, 2, 3], [8, State.symbol, 4], [7, 6, 5]]) s1 = State(state=originState.state) path, steps = s1.solve() if path: for node in path:  node.showInfo() print(State.answer) print("Total steps is %d" % steps)

以上就是python广度搜索解决八数码难题的详细内容,更多关于python广度搜索八数码的资料请关注51zixue.net其它相关文章!


PyQt5实现界面(页面)跳转的示例代码
PyQT5实现选项卡窗口、堆栈窗口、停靠窗口、子窗口
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。