1.算法说明:
八数码问题的解决,用图来描述其状态空间,以空格的四种移动可能作为操作算子。
1.1实现的算法:
深度优先搜索:在抵达一个状态将该状态存入一个列表中表示该状态已检查之后不会再检查,之后以顺序递归遍历其可达到的状态,若状态已达到最大深度或无未检查的子状态,则返回到父节点继续检查父节点的其他子节点,直到检查出与目标状态相同的状态。
宽度优先搜索:在抵达一个状态时将该状态的子状态按顺序存入一个待检查队列里,同时将已检查和待检查的状态都存入一个记录列表里,状态在存入队列前会检测其是否已存在于记录列表中,只有不在记录列表中的状态才能存入待检查队列,检查时只检查队列里首个状态,并将其子状态依次存入队列尾以及记录列表,之后将该状态从队列踢出,依次遍历直到找到目标状态。
启发式搜索:原理与深度优先搜索相同,只是将待检查状态的普通队列改成了优先队列,优先队列中排列先后顺序由状态的价值所决定,该价值是由遍历深度和启发函数返回结果的决定的(实验中我在启发函数返回结果中添加了一个可调的倍率,用于调节启发函数在估价函数中的比率),价值越低在优先队列中排列越靠前。我实现的启发函数有三个,第一个是返回状态中数码与目标状态各数码欧式距离的平方之和,第二个是状态中数码与目标状态数码位置不相同的个数。第三个是状态中各数码与目的状态各数码曼哈顿距离之和。
查找八数码最长链:使用宽度优先算法,依次遍历完八数码的所有状态,直到待检查的队列为空为止,,那么最后检查的状态对应的检查深度必定对应一条最长的链。
编程环境:
Python3
代码:
import operator
import time
count = 0
deep = 1
maxdeep = 200
finalNode = ''
maxDeepList = []
size = ''
rate = 1
path = [] # 存储获取结果的路径
pathDic = []
nodeQueen = []
parentDic = {}
access = False
recordList = []
matrix = []
valueFunc = None
G1 = ''
def whereZero():
x = 0
y = 0
for elx in matrix:
for ely in elx:
if ely == '0':
return x, y
y = (y + 1) % size
x += 1
def toString():
st = ''
for i in range(size):
for j in range(size):
st += str(matrix[i][j])
return st
def toList(s):
matr = [[0 for i in range(size)] for j in range(size)]
for i in range(size):
for j in range(size):