三个AI新手问题:
- 为什么启发式函数必须是可接受的,以便A*找到最优路径?
- 如果有障碍物,采用平局打破技术有什么好处?
- 在有障碍物的网格上寻找路径的算法有哪些?(例如吃豆人游戏)
关于第一个问题 我们以曼哈顿距离
启发式函数为基础,称之为h(x)。现在如果我们使用一个新的启发式函数8*h(x) + 5(随机数字),为什么A*会找到非最优路径呢?据我所知,在A*算法中,决策是根据函数f(x) = g(x) + h(x)
做出的,所以如果我放大h(x),为什么最大值和最小值会改变呢?
我读了这篇文章,文中提到为了平局打破,可以乘以一个小因子,这对我的理论有一定帮助,但他们强调这个因子必须很小。所以我对这点感到困惑。
关于第二个问题 我尝试在吃豆人游戏中使用链接中的技术。任何对曼哈顿距离启发式函数的改变都导致扩展了更多的节点。我甚至“发明”了一种新的加权方案,优先选择外壳上的路径,结果还是一样。后来我尝试取所有函数的最大值(这也应该是可接受的),但性能仍然很差。我错过了什么?
关于第三个问题没有更多要补充的。如前所述,我找不到比曼哈顿距离更好的方法了。
回答:
问题3:
如果你真的在制作吃豆人游戏,需要为每一个“幽灵”找到路径,你也可以使用Dijkstra算法,以吃豆人的位置作为目标,一次性计算出每个幽灵的最佳路径。由于每个“边”(从一个单元格移动到另一个单元格)的成本总是相同的,你也可以简单地使用广度优先搜索。最后,你还可以看看协作扩散,让每个幽灵走不同的路线。