7.4搜寻死路
有可能会出现这种情况,两点之间不存在一条可走的路径,但是我们怎么判断已经是死路了呢?最简单的判定方法就是如果open表中没有节点了我们则说我们找的是一条死路。如图7-18显示了这样的一个场景。
Figure 7-18. Dead end
如图7-18所示,A*算法已经发散出所有可能的节点,但是每一个节点都被检查过并放入了closed表中。无法在找到一个新的有效节点放入open表中,由此我们可知我们找的是一条死路,根本不存在一条有效路径连接起点和终点。
7.5地形成本
正如前面的例子所示,对路径的得分计算在A*算法中扮演了主要的角色。在最基础的A*算法中,我们只把距离当做其代价。距离远则代价高,代价越高则越不让人满意。当然,肯定还有其他情况出现,比如,最短的路径不一定是最快的路径。游戏中的环境包括了不同的地形,没一种地形都会对角色产生不同的影响。通过一段长距离的公路到达目的地可能比穿越一段非常短的沼泽地花的时间短。这就是地形的代价发挥的作用。在以前的例子中,我们的代价是通过起始点到该点的距离加上heuristic值(预估侧到终点的距离)得到的。其中没有考虑地形代价,这是因为所有节点代表的地形都是一样的。我们可以为不同的节点赋予不同的地形,加上地形代价后我们计算节点代价的公式就如图7-19所示。
Figure 7-19. Scoring with terrain cost
由此我们找到的路径距离可能会更长,但是经过的都是容易通过的地形。在一个真正的游戏中,角色可能会走一条更长的路径,但是所花的时间一定是最短的。如图7-20显示了一些不同的假象的地形。
Figure 7-20. Types of terrain
前面的例子中只出现一种地形,这使得从一个节点移动到另一个节点的成本始终为1.如图7-20所示,我们先将接受两种不同的地形。第一种地形是草地,通过它的成本是3,第二种地形是沼泽,通过它的成本是5。现在成本表示的是通过这个节点所需的时间。例如,游戏中的角色穿过一个空荡的地形所需要的时间是1秒钟,它需要分别话3秒和5秒去通过草地和沼泽。物理上的距离是一样的,但所花的时间是不一样的。A*算法总是寻找代价最少的路径,如果通过没个节点时间都是一样的,则找出来的肯定是最短路径。当我们对节点设置不同的代价时,找出来的结果就可能不再是最短路径了。A*算法找的是最快的而不是最短的路径。图7-21显示的是没有不同地形的图,而图7-22显示的是有不同地形的图。
Figure 7-21. Adding different terrain elements
Figure 7-22. Original path over terrain elements
正如你在图7-21看到的,游戏人物所在的位置与以前的例子相同,唯一的不同就是加入了不同的地形。我们现在找的是最快路径,而不是最短路径了。我们假定穿过草地所花的时间是穿过空地所花时间的3倍,而穿过沼泽的时间是穿过空地时间的5倍。问题是添加的地形是怎么去影响路径的代价呢?图7-22显示了前面的例子所找到的路径。
如图7-22所示,最短的路径被找到了,但是它进过了几个要付出高代价通过的地形,那么它现在是最快的路径吗?现在我们仍按照以前A*算法的步骤来执行一遍,但这回我们将考虑通过不同地形的代价。图7-23显示的是算法完成后的结果。
Figure 7-23. Calculating the lowest-cost path
正如我们在图7-23中看到的,这个计算方法非常类似于我们以前的例子,我们使用相同的发散技术,维持两张表open表和closed表,用这两张表来储存已检测的点和未检测的有效点,唯一不同的就是从起始点到其他点所要花的代价也就是s值。以前从一个点到相邻的点的代价是1,但是现在由于增加了地形代价,这个值就不再全是1了,图7-24显示了一条最小代价的路径。
Figure 7-24. The lowest-cost path
如图7-24所示,A*算法加入了地形代价进行计算,我们找到的不再是最短路径,但是我们可以保证我们找到的路径是最快的。
在一个连续的环境中加入地形代价的A*算法也是可用的。以前的例子中,我们的环境只是一个平面,每个节点间的距离都是相等的。节点间等距离不是A*算法可用的必要条件,如图7-25显示了一个在连续环境中铺设节点的图。
Figure 7-25. Continuous environment node placement
在图7-25中我们发现每个节点间的距离是不同的,这意味着在一个连续环境中我们需要话更长的时间去通过相距更长的两个节点。这种情况就想两个节点地形不同一样,在节点地形一样时从一个节点到另一个节点所花的代价将会不同。多出来的代价是花在两节点的距离上。
我们已经讨论几种从一个节点移动到另一个节点所花代价的种类。虽然我们倾向于把这些低价看成是时间或距离,但是还有其他的可能,比如金钱,燃料和其他各种各样的资源。
7.6影响力映射
前面的章节我们介绍了地形因素是如何影响A*算法中大家的计算的。地形成本通常是由游戏设计师来设定的。我们事先就已经知道了草地,沼泽,高山,河流的位置。当然还有其他的一些因素能影响到A*算法中代价的计算。比如,当我们将要花费更大的大家从敌人的视线中穿过,这些因素你事先无法判知,因为敌人总是在动的。影响力映射就是一种根据游戏的发展去丰富A*算法代价的计算的。图7-26阐明了这点。
Figure 7-26. Influenced by the enemy firing zone
如图7-26所示,我们为每个节点分配了代价,与地形代价不同的是这些节点代价是受坦克(8,4)的位置和其面对的方向影响的。坦克对节点代价的影响将加入的路径代价的计算中来,这意味着我们要花费更长的时间去找到这条路径。当然如果没有找到其他代价更小的路径我们还是要从战争的前线(也就是坦克的视线范围内)穿过。
你可以在其他方面使用影响力映射从而让游戏中的角色更加聪明。你可以在游戏中维护一种影响力映射表,这种表是有游戏中角色的位置和面对的方向来决定的。比如,如果玩家控制的角色通过一条路径暗杀了一个游戏角色,那么下一次再经过这条路径的代价将会变大。在玩家看来,对战电脑会显的很聪明,他们能从自己的错误中学到东西。这个技术在图7-27中阐明。
Figure 7-27. Influenced by the number of kills
如图所示的影响力映射表记录了在没个节点杀死敌人的数量,玩家每一次杀人,则对应节点的代价将会加1。比如,存在一个特别的路径,可以让玩家很轻松的干掉敌人,但是在下一次玩家继续走这条路径是所遇到的阻碍将会增大,也就是所花的代价将会变大。
7.7更多的信息
Steven Woodcock在"2003 Game Developer's Conference AI Roundtable Moderator's Report"中说到AI开发者本质上就是路径寻找者,其他的一些AI报告也同样反复阐述了这样的观点。这些开发者得意思是寻路算法被运用到各种各样的游戏类型中,而我们应该持续关注这些寻路算法。当然工作重点任然是A*算法。如今的AI发展计划是找到更有效的A*寻路算法。在Charles River Media的《游戏编程宝典》和Charles River Media的《人工智能游戏编程真言中》都有一些有趣的关于改善的A*算法的文章。
//---------------------------------------这个中文版网上没找到 所以就决定自己翻译 诚求游戏爱好者共同翻译------------------
这本书的A*算法讲的非常的仔细,很适合初学去了解A*算法计算的过程,如果去看其他人实现的代码则推荐去看《人工智能游戏编程真言中》中A*路径搜索基础这篇文章。