5

我正在尝试实现捕食者 - 猎物模型。它是基于代理的模型。每隔几毫秒就是一个新动作。在球场上有两种类型的生物:捕食者和猎物。他们每个人的行为由以下规则给出:

猎物:

  1. 刚搬到一个无人居住的牢房
  2. 每走几步就会为他的旧牢房创造后代
  3. 预期寿命受移动次数的限制

捕食者:

  1. 捕食者带着猎物移动到牢房。如果没有这样的单元格,则在任何空闲的相邻单元格中
  2. 相同的
  3. 相同的

我对猎物移动的选择有疑问。 猎物

例如,我在 5 号和 9 号牢房有猎物。它们每个都可以移动到 6 号牢房。我该如何解决这个冲突?谢谢

4

5 回答 5

4

使用异步更新。以随机顺序遍历猎物,让它们依次决定应该移动到哪个单元格。

这是模拟中常用的方法。它还有一个额外的好处是它消除了动力学中的极限循环。

于 2012-01-20T11:11:09.427 回答
0

请参阅此相关问题和我的答案。它描述了一种良好的碰撞检测机制。

避免碰撞检测的 O(n^2) 复杂度

于 2012-01-20T09:59:01.067 回答
0

“搬家”需要多长时间?如果你移动一个,那么在猎物移动之后,你移动下一个,没有冲突。猎物只会看到空间已经被占用并移动到其他地方。

如果移动需要时间,你可能会说猎物互相监视,看看是否有其他猎物试图移动到某个地方(就像人们观察交通中的汽车)。然后,当来自 5 的猎物试图移动到那里时,您可以将目标字段的状态更改为“为 5 保留”。然后来自 9 的猎物可以看到这一点并决定是否要与 5 碰撞(可能很有趣:P)或避免 5。

于 2012-01-20T09:39:37.417 回答
0

取决于游戏逻辑。如果猎物可以在同一个单元格上,那么只需使用显示猎物数量的指示器。如果您使用 2D 数组来表示当前字段状态,则可以使用以下代码:

-1 - predator
n - preys

n >= 0,(n = 0 - 单元格为空,n = 1 单元格包含 1 个猎物,依此类推)。

否则(如果猎物不能出现在同一个单元格上)使用回合制策略。将所有猎物保存在数组中或给每个猎物编号。在这种情况下,猎物的移动由简单的循环(伪代码)表示:

for each prey in preys
    move(prey)
end

其中移动逻辑描述了你的猎物如何移动的算法。

于 2012-01-20T09:40:26.217 回答
0

相当多的方法,取决于你是决定和移动两步还是一步,等等:

  1. 跟踪每个猎物的预期移动,并防止其他猎物占据这些移动。
  2. 检查是否有其他猎物已经占据了目的地,如果是,则什么也不做。
  3. 如果它们都试图占据相同的位置,则随机移除其中一个猎物。
  4. 如果目的地被占用,请重新评估移动选项。

没有真正的“正确”方法来做到这一点。

于 2012-01-20T09:40:58.463 回答