实验内容:
- 利用至少一种无信息搜索算法实现八数码难题求解(可选多种);
- 设计至少两种启发式信息函数,利用A*搜索实现八数码难题求解,并对比分析搜索效果;
1.代码整体框架
八数码问题的解决关键在于状态表示,状态转移,对状态的遍历搜索。在我的第一个文件eight_puzzle_problem.py中解决了这三个问题,其中搜索算法采用了BFS、DFS和两种不同启发式函数的A*。在该文件中我定义了两个类,Node类和EightPuzzleProblem类,第一个类用于相关状态的表示,第二个类用于节点状态的转移和搜索。为了直观地呈现出搜索的过程,我使用Python的PyQt5模块设计出了一个UI界面,运行第二个eppUI.py文件可以通过九宫格拼图(图片为网上找的深圳大学校徽)的形式展现出原有问题的解决路径。
2.状态空间的表示
我设计了一个Node类来表示一个节点的状态。Node的数据成员有state(列表形式,用数字0-8存放当前节点各图片的标号,从而记录其与九宫格的映射关系如图1所示)
图1 深大校徽九宫格图片
parent(记录该节点的父亲节点,方便后续回溯