【总结】A*搜索算法小结
A* 搜索是一种使用了 Dijkstra 思想的启发式搜索,是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。把之前进行的总结整理了一下发了上来。
启发式搜索
启发式搜索是搜索的主要优化方法之一,另一种常见的优化方法是记忆化搜索。
启发式搜索是一种在搜索的过程中,通过自定义估价函数$f(x)$对不同的子状态进行筛选、剪枝,从中选取更优解或者删去无效解的在线剪枝搜索。
当然,这道题是一道DP题,也是一道记忆化的题目。但是这道题也可以写成启发式搜索的形式:在取的时候判断是否超过了可行体积(可行性剪枝),不取的时候判断是否剩余药品的价值+当前价值>当前解(最优性剪枝)。
上代码:
1 |
|
A*
A Star 算法是 Dijkstra 和启发式搜索的结合。他的估价函数由两部分组成:$f(x)=g(x)+h(x)$,其中$𝑔(𝑛)$表示从起点到任意顶点 $𝑛$ 的实际距离,$ℎ(𝑛)$ 表示任意顶点 $𝑛$ 到目标顶点的估算距离(根据所采用的评估函数的不同而变化)。
整体算法过程:
- Def Priority_Queue $Queue$
- Do
- Let $u$ => $u \in Queue$ && $f(u) = min{f(x)\ |\ x\in Queue}$
- For Each $v$ => $Exits(u\to v)$
- If $v \notin Queue$ Then $Queue.Push(v)$, $Update(f(v))$
- Else If $Cost(u\to v) < g(v)$ Then $Update(f(v))$
- Until $Not\ Queue.Empty()$ || $Target\in Queue$
他的整体过程可以概括为:每次从优先队 中取出一个$𝑓(𝑖)$最小的状态,然后更新可用的相邻状态,最大复杂度$O(n^2)$,优先队列优化后的期望复杂度为$O(nlogn)$。
因为启发式动态剪枝的存在,所以相对于一般的寻路算法,期望的搜索范围小。并且 A* 在$h(x)$满足三角形不等式时,不会将重复节点加入队列。
竞赛中的A*
竞赛中的 A* 一般用来解决定点k短路的问题。即给出图,求两点之间第k条简单路。
我们预处理反向图中从终点出发的单源最短路作为$g(x)$,将从开始到当前状态走过的所有路径作为$h(x)$跑 A*。当我们第k次将终点入栈时,我们就找到了从起点到终点的第k短路。
模板题,上代码:
1 |
|
开发中的A*
A*因为有着效率高,路径权值高度可定义化等特点,在游戏开发时经常配合Navmesh等技术用作AI寻路。比如有名的 A Star Pathfinding Project 。
最后
这次的内容比较简单,所以也没多少字可以水写,就只稍微总结了一些模板和代码。当然如果有所帮助就更好了。