这里所说的九宫格问题,是指:
“八数码难题”搜索
问题描述:
通过单步移动把下面的矩阵移动成1-8环绕一周的矩阵(即0在中间,1-8顺序排成一圈,1在哪儿无所谓)
- 分别用宽度和深度搜索进行
- 假设启发式的方程为, 其中d(n)为层次或深度,h(n)为错位的个数,试用启发式算法解决
- 编程(分别用宽度搜索,深度搜索和启发式算法),并分析步数
下面贴代码(JAVA):
- 启动文件
- 定义状态转换矩阵类
- 三种搜索算法
import java.util.HashSet;
public class StartUp {
public HashSet<String> getFinishedID() {
// 判断是否到达目标状态(达到结束条件)
// 达到,返回true
HashSet<String> finished_ID = new HashSet<String>();
String temp_string = "1234567812345678";
String reverse = "8765432187654321";
for (int i = 0; i < 8; i++) {
finished_ID.add(temp_string.substring(i, i + 8));
finished_ID.add(reverse.substring(i, i + 8));
}
return finished_ID;
}
public static void main(String[] args) {
int[][] start_matrix = {
{
2, 8, 3},
{
1, 6, 4},
{
7, 0, 5},
};
SSState state = new SSState(start_matrix, 2, 1);
HashSet<String> finished_ID = new StartUp().getFinishedID();
ThreeSolution three = new ThreeSolution();
System.out.println("广度优先遍历步数:" + three.BFS(state, finished_ID));
// System.out.println("深度优先遍历步数:" + three.DFS(state, finished_ID));
// System.out.println("启发式遍历步数:" + three.Heuristic(state, finished_ID));
}
}
import java.util.HashSet;
import java.util.Iterator;
public class SSState {
// 状态空间
int zeroX; // 0点横坐标
int zeroY; // 0点纵坐标
int[][] state_matrix; // 矩阵
String ID = ""; // 唯一标识符
int step; // 步长
HashSet<String> finished_ID; // 目标ID
int f; // 启发式算法目标函数值
public SSState() {
zeroX = 0;
zeroY = 0;
state_matrix = null;
ID = "";
}
public SSState(int[][] matrix, int x, int y) {
zeroX = x;
zeroY = y;
state_matrix = matrix;
ID = getID(matrix);
}
public void setStepAndFinish(int s, HashSet<String> finished) {
step = s;