我正在编写一个简单的游戏模拟,其中我有一些计算机控制的生物在节点图上移动。他们想要走向目标(想想,比如,狼想要走向兔子)。
我已经实现了简单的寻路,所以生物可以找到直接朝向给定目标节点的最快路线,但是在多个目标的情况下(多个节点上的食物很多),我想我想生成类似于图上的热图梯度使得狼可以只查询邻居节点并走向最热的邻居。
有人知道在图表上生成热图的有效方法吗?我能想到的最快的方法是进行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秒只进行一次食物节点遍历......
答案 0 :(得分:3)
为什么不模拟图表周围的热量流?也就是说,如果 t 时节点 i 的温度为T i ( t ),然后设置:
T i ( t + 1)=αF i ( t )+(1 - β)T i ( t )+γΣ j ∈n( i ) T j ( t )
其中F i ( t )是节点 i 上的食物量 t ,n( i )是节点 i 的邻居集合,α,β和γ是模拟的参数。 α是热量进入系统的速率,β是热量离开系统的速率,γ是热量从节点流向其邻近的速率。所有这些都应该是小数字:你必须通过试验找到它们的好价值。
使用这个等式,需要O(| nodes | + | edges |)来更新每个节点的温度,所以你应该能够定期计算它(理想情况是每一帧)。
上面的等式用于离散模拟(具有恒定时间步长)。如果你有可变的时间步长δt,那么试试:
T i ( t +δt)=δtαF i ( t )+(1 - β)δt T i ( t ) +δtγΣ j ∈n( i ) T j (吨)
答案 1 :(得分:0)
您的一般方法很好,但我认为您被热图概念所蒙蔽。从本质上讲,你想要计算所有目标的加权平均位置,并让你的猎人前往那个点。我将按如下方式实现: