寻路算法笔记

寻路算法笔记


一、A*寻路算法(循环启发):

* 最小代价:假设起点到节点n的代价为g(n),节点n到终点的代价为f(n),求f(n)=g(n)+h(n)为最小值时的路径。

* A星算法(A* search algorithm):计算最小代价的一种算法。

* 任意路径总是相等的估计代价:有一种情况下,从起点经过任意路径到达节点n的代价是相等的(例如四方向的矩形地图)。此时可以估算起点到所有节点的代价。

* 不可通过节点(障碍物)。地图上有不允许通过的区块。

* 待查列表(open set)、已查列表(closed set)、最小代价节点:

(1) 已知条件:一个矩形网格、起始节点、终止节点和一些不可通过节点。

(2) 初始状态:已查列表为空集,待查列表只有起始节点。

(3) 算法:首先找到与起始节点相邻但不在已查列表中的所有节点,加入待查列表,然后分别计算待查列表中每个节点的总代价f(n)=g(n)+h(n)(此处h(n)不考虑不可通过节点,用直线距离算出),最小值f(n)的节点成为下一轮计算的起始节点,其余的节点从待查节点中取出,加入已查列表中。如此循环,直至本轮计算的起始节点为终点节点(h(n)为0)。

* 启发(heuristic)函数:计算h(n)的函数(不考虑不可通过节点)。在上面的算法中,h(n)就是直线距离。不同的启发函数会影响搜索速度。

* 曼哈顿启发函数(Manhattan heruristic):不考虑对角移动,只能横向和纵向移动。对于四方向直角地图,代价为行差加列差。运算快,但需要访问较多节点,路线不自然。

* 欧几里得启发函数(Euclidian heuristic):直线距离(勾股定理)。路径自然,访问节点较少。

* 对角启发函数(Diagonal heuristic):先水平移动,再对角移动。路线不自然,但访问节点最少。


二、限定最大距离(步数)的四方向直角地图寻路算法(递归):

* 确定可移动的范围和范围内每个点的剩余距离(步数)(限定起点,但不限定终点):假设函数为FindDistance(x,y,n),其中(x,y)为目的地,n为剩余的可以移动距离。从起点开始尝试向四个方向移动,如果没有障碍物,则执行FindDistance(x,y-1,n-1)或FindDistance(x,y+1,n-1)或者FindDistance(x-1,y,n-1)或FindDistance(x+1,y,n-1)。如此递归,直至参数n为0。每次执行FindDistance,把参数n记录在(x,y)节点中(如果已经记录过,则只保留最小值)。

* 从终点逆推回起点以确定路径(限定终点)。通过上面的计算可以判断终点是否在可移动范围内以及到起点的最小距离(步数),所以接下来需要计算路径(从终点逆推回起点)。在确定范围的计算中可以知道终点(x,y)的步数n是一个较小值(小于等于起点的剩余步数),假设函数为MoveCharacter(x,y,n),则其四邻居中必有一个记录了剩余步数n+1的(MoveCharacter(x,y-1,n+1)或MoveCharacter(x,y+1,n+1)或MoveCharacter(x-1,y,n+1)或MoveCharacter(x+1,y,n+1)),任选一个可移动的方向即可。如此递归,直至n=0(回到起点)。


三、布雷森汉姆直线算法(Bresenham line algorithm)

* Bresenham算法原意是指示如何用像素点绘画斜线(画线算法)。

(待补充)


四、参考资料:

1. 《Flash ActionScript 3.0动画高级教程》(《AdvancED ActionScript 3.0 Animation》)

   http://www.apress.com/9781430216087

2. A*搜寻算法wiki

   http://zh.wikipedia.org/wiki/A*%E6%90%9C%E5%AF%BB%E7%AE%97%E6%B3%95

3. 《Visual C++角色扮演游戏程序设计》

4. 《Windows游戏编程》


你可能感兴趣的:(寻路,A星)