A*算法 puzzle8数码

A*算法 puzzle8数码

一、 算法的理解

A算法,从框架上看和深度以及宽度优先搜索之间有异曲同工之妙。为解决宽度优先搜索、深度优先搜索的盲目搜索问题(在实现过程中表现形式为节点的优先级只与深度有关),A算法采用启发式搜索,简单的来说就是先“判断一下目标的可能性”,选择容易到达目标的节点优先搜索。由此引入估价函数,对节点的“可能性”就行评估,每个节点的评估值可以作为其优先级(越可能到达目标的节点优先级越高,与深度、宽度优先搜索区别最大的地方)。
接下来就是估价函数的问题。算法的估价函数可表示为f(n) = g(n) + h(n), g(n) 表示开始节点到节点n 的实际路径代价,而h(n) 表示节点n 到目标节点的最小路径代价的估计值,那么f(n) 就表示从开始节点到目标节点且经过节点n 的最小代价解的估计代价。在本次的8数码实验中,以曼哈顿距离作为估计值:例如:这种情形 下,于目标 比对,在忽略3、1的影响下,6需要移动三步;2,3不需要移动;5需要向右移动一步;同理类推一共需要移动heuristics=3+0+0+1+1+3+1+1=10。节点的优先级为:priority = new_cost + newpuzzle8.heuristics,new_cost为已经走的步数,newpuzzle8.heuristics还需代价的估计值。当然priority的值越小,节点的优先级越高。
在这里插入图片描述

def Astar(puzzle8,came_from):
    frontier=PriorityQueue()
    cost_so_far={}
    frontier.enqueue(puzzle8,0)
    cost_so_far[puzzle8.ToString()]=puzzle8.cost
    came_from[puzzle8]=None
    while not frontier.is_empty():
        puzzle8=frontier.dequeue()
        if puzzle8.isGoal():
            return puzzle8
        else:
            moves=puzzle8.getAllMoves()
            for move in moves:
                newpuzzle8=puzzle8.clone()
                newpuzzle8.move(*move)
                new_cost=newpuzzle8.cost
                if cost_so_far.get(newpuzzle8.ToString())==None or new_cost<cost_so_far[newpuzzle8.ToString()]:
                    cost_so_far[newpuzzle8.ToString()]=new_cost
                    Priority=new_cost+newpuzzle8.heuristics
                    frontier.enqueue(newpuzzle8,Priority)
                    came_from[newpuzzle8.ToString()]=puzzle8
    return None

在这里插入图片描述

在这里插入图片描述

阶段总结

A算法是一种启发式搜索,关键是找到一个好的启发式策略,也就是一个比较好的估价函数。如果能在BFS搜索算法中利用估价函数对队列中的节点进行排序的话,该搜索方式为A算法。在将A*算法应用到8数码问题时,有许多小技巧值得学习:将一个节点的状态用tostring方法转换成字符串记录;用曼哈顿距离作为估价函数。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嗯哼_Hello

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值