一. 实验目的
1. 以八数码问题作为对象,利用A*算法求解并在屏幕上动态显示OPEN表的结点和评估函
数最小的结点
二. 实验内容
1. 使用两种启发式函数并比较两者的不同之处。
三. 实验器材
语言:Python、编译器:PyCharm
四. 实验过程与结果
这是一个八数码问题,也就是一个3×3的九宫格打乱之后的恢复问题,其中空格我们
可以用数字0补全,这样方便与自己编程。首先的第一个问题也就是能否到达目标状态
的,可以通过资料查阅得到的条件是:初始状态与目标状态的逆序和的奇偶性一样也就
可以恢复初始状态(对于所有的奇数的数码问题都是如此)
所以这一部分的代码如下:
#
计算逆序和
def calculat_inverse(arr):
inverse_sum = 0
n = len(arr)
m = n ** 2 - 1
for i in range(n ** 2):
temp = [k + 1 for k in range(i, m - 1)]
for j in temp:
if arr[int(j / n), j % n] == 0:
continue
elif arr[int(i / n), i % n] > arr[int(j / n), j % n]:
inverse_sum = inverse_sum + 1
return inverse_sum
#
判断是否能够到达目的状态
#
用于判断是否有解
def judge(start, target_state):
return (calculat_inverse(start) % 2) == (calculat_inverse(target_state) % 2)
两种启发函数(因为一个是八数码一个是九数码问题,其中九数码问题在于将0也算入
评估函数之中,所以就会有4个,尽管八数码与九数码只是细微上的区别)
#
九数码
#
评估函数
2
#
放错元素与正确位置的曼哈顿距离
#
返回一个数字
def evaluate2(current, target_state):
distances = 0
评论0