八数码问题——搜索算法

本文详细介绍了八数码问题的解决方案,包括深度优先搜索、宽度优先搜索和启发式搜索算法的实现。通过Python编程,探讨了不同搜索策略的特点,其中启发式搜索引入了三种不同的估价函数。此外,还提供了寻找八数码最长链的方法,采用宽度优先搜索算法遍历所有状态。测试方式为使用Python3环境,通过pycharm或终端运行代码。
摘要由CSDN通过智能技术生成

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):
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值