A\*搜索算法的演示图
**A\*搜索算法**（A\* search algorithm）是一種在圖形平面上，有多個節點的路徑，求出最低通過成本的演算法。常用於遊戲中的NPC的移動計算，或网络游戏的BOT的移動計算上。

该算法综合了最良優先搜索（英语：）和Dijkstra算法的优点：在进行启发式搜索提高算法效率的同时，可以保证找到一条最优路径（需要评估函数满足单调性）。

在此算法中，如果以g(n)表示从起点到任意顶点n的实际距离，h(n)表示任意顶点n到目标顶点的估算距离（根据所采用的评估函数的不同而变化），那么A\*算法的估算函数为：

{\displaystyle f(n)=g(n)+h(n)}
这个公式遵循以下特性：

* 如果g(n)为0，即只计算任意顶点n到目标的评估函数h(n)，而不计算起点到顶点n的距离，则算法转化为使用贪心策略的最良優先搜索（英语：），速度最快，但可能得不出最优解；
* 如果h(n)不大于顶点n到目標頂點的實際距離，则一定可以求出最优解，而且h(n)越小，需要计算的节点越多，算法效率越低，常见的评估函数有——欧几里得距离、曼哈顿距离、切比雪夫距离；
* 如果h(n)为0，即只需求出起点到任意顶点n的最短路径g(n)，而不计算任何评估函数h(n)，则转化为最短路问题，即Dijkstra算法，此时需要计算最多的顶点；

虛擬碼
---

```
//Matlab語言
 function A\*(start,goal)
 closedset := the empty set //已经被估算的節點集合
 openset := set containing the initial node //將要被估算的節點集合，初始只包含start
 came\_from := empty map
 g\_score[start] := 0 //g(n)
 h\_score[start] := heuristic\_estimate\_of\_distance(start, goal) //通過估計函數 估計h(start)
 f\_score[start] := h\_score[start] //f(n)=h(n)+g(n)，由於g(n)=0，所以省略
 while openset is not empty //當將被估算的節點存在時，執行循環
 x := the node in openset having the lowest f\_score[] value //在將被估計的集合中找到f(x)最小的節點
 if x = goal //若x為終點，執行
 return reconstruct\_path(came\_from,goal) //返回到x的最佳路徑
 remove x from openset //將x節點從將被估算的節點中刪除
 add x to closedset //將x節點插入已經被估算的節點
 for each y in neighbor\_nodes(x) //循環遍歷與x相鄰節點
 if y in closedset //若y已被估值，跳過
 continue
 tentative\_g\_score := g\_score[x] + dist\_between(x,y) //從起點到節點y的距離

 if y not in openset //若y不是將被估算的節點
 tentative\_is\_better := true //暫時判斷為更好
 elseif tentative\_g\_score < g\_score[y] //如果起點到y的距離小於y的實際距離
 tentative\_is\_better := true //暫時判斷為更好
 else
 tentative\_is\_better := false //否則判斷為更差
 if tentative\_is\_better = true //如果判斷為更好
 came\_from[y] := x //將y設為x的子節點
 g\_score[y] := tentative\_g\_score //更新y到原點的距離
 h\_score[y] := heuristic\_estimate\_of\_distance(y, goal) //估計y到終點的距離
 f\_score[y] := g\_score[y] + h\_score[y]
 add y to openset //將y插入將被估算的節點中
 return failure
 
 function reconstruct\_path(came_from,current_node)
 if came\_from[current\_node] is set
 p = reconstruct\_path(came\_from,came\_from[current\_node])
 return (p + current\_node)
 else
 return current\_node

```

相關連結
----

* 寻路
* 广度优先搜索
* 深度优先搜索

外部連結
----

* A\* 演算法簡介 (A\* Algorithm Brief)（页面存档备份，存于）

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |