A*算法简介以二维数字魔方为例

A*算法又称为启发式搜索算法,是在可能的解空间中,以更少的时间或步骤去找到路径问题答案的一种方法。用到A star算法的场景挺多,如路径规划,二维数字魔方,三维立体颜色魔方(生活中常见的魔方)等等,都可以用A*算法来加快搜索的进度。也是算法基础课中最典型的一个算法,一般要求去用代码实现,并且和原始的穷举式路径搜索,启发式函数的搜索结果(可能有多种不同的启发式函数方法)进行对比。

这里以一个二维数字魔方游戏为例来进行说明,二维数字魔方为一个9宫格,每个格子一个数字,每一个当前的状态可以用一个数字串来描述,数字串的顺序为9宫格从上到下从左到右的顺序进行依次排列而成,0代表空的格子,其邻居的格子可以移动到0这个位置,移动后相当于进行了互换。如“608435127”这个串就代表了一个二维数字魔方的状态,我们一般定义目标状态为“123456780”。要求为从当前状态通过移动方格去达到目标状态。

我们对这个问题进行建模如下,1、状态建模,可以用3*3的二维数组来表示当前状态和目标状态;并且用(x0,y0)表示空的格子(数字0的格子)的坐标,用移动的操作方向来记录移动的操作路径(D表示向下,U表示向上,L表示向左,R表示向右);2、用g cost代表当前已经搜索到达的路径所需花销,用h cost代表从当前状态到达目标状态预估的(heuristic)的开销,总花销f cost为g cost + h cost。

具体的搜索算法有基于Dijkstra最短路径搜素算法,它从起点开始搜索时,总是优先搜索和展开当前离起点路径最短的节点,直至搜索到目标点时结束搜索。A*算法正是以“优先搜索直觉上方向靠谱的节点”为策略来减少搜索空间达到加速搜索目标点的目的。具体从代码实现上来解释即为:(1)、Dijkstra最短路径搜索算法将上述的g cost的大小作为路径展开的优先级;(2)、A*算法则用g cost + h cost的大小作为路径展开的优先级,使得搜索路径尽可能朝着目标状态的方向去展开。

以上述的二维数字魔方为例进行说明,Dijkstra最短路径搜索算法维护一个优先级队列,存放已经遍历的节点(路径)的代价函数g cost(以最小堆min heap的形式),然后每做一次搜索,就会从堆顶pop出节点并对其successors进行核查,如果没有遍历过,则将其g cost设为当前的g cost+1并push到优先级队列中;这个过程持续直至pop出的节点即为目标节点。

A*算法和Dijkstra最短路径搜索算法大体搜索流程差不多,不同的地方在于代价函数,A*算法的代价函数为g_cost+h_cost,其中g_cost和上述的Dijkstra算法相同,关键在于h_cost的设计,基于此特定问题,有两种特殊的h_cost函数,1为曼哈顿距离(每个魔方方块的位置和其目标位置的横坐标和纵坐标的距离之和),2为魔方单元块和其目标位置不对应的单元块个数。关于启发式函数的特性和设计准则,可以参考引文链接。

我们针对上述的几个搜索算法在借鉴了已有工作和相关思路的基础上提供了完整的代码实现,具体可以参考引文链接。

References


Posted

in

,

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *