我正在编写一个简单的游戏模拟,其中有一些计算机控制的生物在节点图上移动。他们想朝着目标前进(想想,比如说,狼想要朝着兔子前进)。
我已经实现了简单的寻路,因此生物可以直接找到通往给定目标节点的最快路线,但是在多个目标(多个节点上有很多食物)的情况下,我想我想生成类似热图梯度的东西图表,这样狼就可以查询邻居节点并前往最热的邻居。
有人知道在图表上生成热图的有效方法吗?我能想到的最快方法是进行 N 次全图遍历(N=食物节点数),每次从每个食物节点开始进行 BFS(或最近/最热未访问节点优先遍历),计算图表中每个节点上该食物节点的热量,然后在一个收集过程中将每种食物的所有热量相加。我不喜欢这样,因为,好吧,如果我有一个大图和大量食物节点,我可能必须做很多完整的图遍历,每个都有很多节点。
我正在考虑做一种 BFS,从所有食物节点的开放集合开始,然后从那里向外移动,但我只会计算到最近的食物节点的距离;食物节点集群不会产生非常热的位置,因为我无法返回以增加先前遍历的节点中的热量(如果我允许这样做,我基本上就像我之前的示例一样访问每个节点 N 次) . 例如,如果我开始:
F-O-O-O-O-O-O-O-O
| | | | | | | | |
F-O-O-O-O-O-O-O-F
其中 F 是食物,O 是空节点,假设食物节点的热量为 5,每个节点的衰减为 1,我希望我的热图看起来像
9-7-5-3-1-1-2-3-4
| | | | | | | | |
9-7-5-3-2-2-3-4-5
但是 BFS 风格的遍历(任何节点只能访问一次)看起来像:
5-4-3-2-1-1-2-3-4
| | | | | | | | |
5-4-3-2-2-2-3-4-5
有人有更聪明的方法来做到这一点吗?最坏的情况也许我可以进行多次 N 次图遍历,但是按照时间表,所以我每 X 秒只进行一次食物节点遍历......