我想让宽度为1的流能够进行路径查找,同时考虑到在同一条宽度为2的路径上运行的另一条流。
假设我有一个这样的地图:(“0”表示不可通过,“-”表示可以通过,“1”和“A”是起点,而“2”和“b”是终点)
0000000000000000000001A0000000000--00B200------00--00------00------000000------00000000000000000
如果我使用A*算法让“A”查找通往“B”的路径,它会阻塞从“1”到“2”的路径。(“=”表示路径)
0000000000000000000001A0000000000-=00B200======00=-00=-----00=====-000000------00000000000000000
是的,我可以先查找从“1”到“2”的路径,然后再规划AB路径,但这并不总是有效。例如这种情况:
00000000000000000000000000000000000001A00000000000000000--00B200------00------00--00------00------00------00------000000------00------0000000000000000000000000
从“1”到“2”的A*路径查找会阻塞“A”到“B”的路径
000000000000000001A000000000000000000=-00B200------00=====-00-=00=====-00=-----00-====-00=====-000000------00------0000000000000000000000000
“A”到“B”的路径会阻塞“1”到“2”的路径
000000000000000001A000000000000000000-=00B200------00======00=-00=====-00=-----00=====-00=====-000000------00------0000000000000000000000000
补充说明:“A”、“B”、“1”和“2”可以在用户创建的地图上的任何位置。同时会有1到10条路径同时进行,起始和停止是独立的,尽管AI只需要考虑当前的其他路径。这也需要实时进行,因此计算时间不能超过几秒钟。
那么,我该如何让AI足够聪明以避免阻塞另一条路径呢?目前我使用的是A*算法,有没有改进它的方法,或者我应该使用一个全新的AI系统?(两种方法对我都适用)
回答:
如果我理解正确的话,你正在寻找合作路径查找。在过去的十年里,已经提出了许多解决这个问题的方案。你可以在这篇论文中找到对它们的很好的总结。
我给你一个简短的回顾:
- 局部修复A* 每个代理使用A*算法搜索到目的地的路线,忽略所有其他代理,只考虑当前的邻居。然后代理开始沿着他们的路线行进,直到即将发生碰撞。每当一个代理即将移动到一个已被占用的位置时,它会重新计算剩余路线。这有点“蛮力”,并不是最先进的技术,但它“容易”实现,并且是当前视频游戏中的行业标准。不幸的是,我找不到该算法的伪代码。:(
- 合作A* 是一种新的算法,用于解决合作路径查找问题。任务被分解为一系列单代理搜索。个体搜索在三维时空内进行,并考虑其他代理的计划路线。代理的行动集中包括一个“等待”移动,使其能够保持静止。
- 层次合作A* 与之前类似,但以层次方式进行。
- 窗口化层次合作A* 当时(我想是2005年)的最先进技术。互联网上有一个有趣的演示,带有Java源代码和所有内容,在这里。要了解为什么WHCA*更好,请查看论文的第3页。
我希望这些足以让你开始自己探索这个领域,如果你需要的话。:)