【问题标题】:Implementing a basic predator-prey simulation实现基本的捕食者-猎物模拟
【发布时间】:2023-03-10 00:24:02
【问题描述】:

我正在尝试实现捕食者-猎物模拟,但遇到了问题。 捕食者寻找附近的猎物并将其吃掉。如果附近没有猎物,它们会移动到一个随机的空单元。
基本上,我遇到麻烦的部分是当我推进“一代”时。
假设我有一个 3x3 的网格,每个单元格的编号从 0 到 8。
如果我在 0 和 1 中有 2 个捕食者,则检查第一个捕食者 0,它会移动到单元格 3 或 4
例如,如果它去细胞 3,然后它继续检查捕食者 1。这似乎是正确的 但它有点“优先考虑”具有较低索引值的生物体。我尝试使用 2 个数组,但这似乎也不起作用,因为它会检查生物体存在但不存在的地方。 ._.
任何人都知道如何“公平”和“正确”地做到这一点?

【问题讨论】:

  • 如果您担心由于更新循环的扫描而给较低索引中的掠食者带来不公平的优势......为什么不每次都从随机位置开始扫描呢?在网格上选择一个随机点,从那里扫描,直到你绕回那个点。下次你将从不同的点开始。
  • 是的,这似乎是最符合逻辑和最简单的答案。嗯。

标签: c algorithm simulation


【解决方案1】:

这个问题可以通过一种称为双缓冲的技术解决,该技术也用于计算机图形(为了防止当前正在绘制的图像干扰当前显示在屏幕上的图像)。使用 两个 数组。第一个保持当前状态,您根据第一个数组做出所有关于移动的决定,但您在另一个数组中执行移动。然后,你交换他们的角色。

编辑:看来我没有仔细阅读您的问题。可能都需要双缓冲和随机化,具体取决于您的规则有多复杂(但如果除了您描述的规则之外没有其他规则,随机化就足够了)。不过,它们解决了两个不同的问题:

  • 双缓冲解决了正确性的问题,当你有规则时,关于单元格中的生物将发生什么的决定取决于相邻单元格的内容,而关于相邻单元格的决定也取决于这个细胞。如果你例如有一条规则说,如果两个掠食者相邻,它们会彼此远离,你需要双缓冲。否则,在您移动第一个捕食者后,第二个捕食者将看不到任何相邻的捕食者,并且会留在原地。
  • 随机化解决了资源有限时的公平问题,例如当猎物只能被一个捕食者吃掉时(这似乎是您关心的问题)。

【讨论】:

  • 双缓冲还会引入一个问题,即两个捕食者可能会进入同一个细胞,或者吃掉同一个猎物。我猜可以通过检查两个缓冲区来解决。
  • @Blorgbeard:是的;实际上需要根据 both 缓冲区做出决策;我以前没有想到。 +1。
【解决方案2】:

我最近在 Java 中做了一个类似的任务。从上到下处理掠食者不仅会给较低的指数带来“不公平的优势”,而且还会在猎物和掠食者的运动中产生模式。

我通过随机选择行和列来克服这个问题。这样一来,每个捕食者/猎物都有相同的机会在一代的早期被处理。

一种随机化的方法是创建(row,column) 对的链接列表。然后打乱链表。在每一代,选择一个随机索引开始并继续处理。

【讨论】:

    【解决方案3】:

    某种循环方法怎么样。将你的掠食者放在一个循环链表中,并保留一个指向当前“第一个”节点的指针。然后,将第一个指针前进到每一代列表中的下一个位置。您可以轻松地在循环列表的前面或后面插入新的掠食者。

    【讨论】:

    • 这仍然在算法中引入了一个不受欢迎的规则模式,给模拟所寻求的那种同时性带来了麻烦。想象一下对大型数据集的影响。
    • 捕食者数量较多时,规律性会更加明显,但我认为重点是公平性,而不是随机化。如果您的目标是随机化,您可以每次将指针前移一个随机量,或者保持它静止并在 x 和捕食者数量相对质数时读取列表 x 节点。
    【解决方案4】:

    如果您的猎物如此密集以至于这是一个常见问题,我怀疑您没有可以长寿的“种群”,那么更多作为评论然后是其他任何东西。也作为评论随机更新你的掠食者。也就是说,不要逐步遍历您的位置数组,而是获取您的捕食者列表并将它们随机化,然后逐个更新它们。我认为是必要的,但我不知道是否足够。

    【讨论】:

    • 良好的生物学观察,但我担心这在技术上还不够,因为您仍然会冒随机化选择两个相邻捕食者并错误更新它们的风险 - 请参阅我的答案。
    • 糟糕——我没有仔细阅读这个问题;你是对的,随机化是必要的。是否也足够取决于规则;如果他向我们展示的规则是唯一的,我认为随机化就足够了。
    猜你喜欢
    • 2012-02-14
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多