Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 实现一个基本的捕食者-食饵模拟_C_Algorithm_Simulation - Fatal编程技术网

C 实现一个基本的捕食者-食饵模拟

C 实现一个基本的捕食者-食饵模拟,c,algorithm,simulation,C,Algorithm,Simulation,我试图实现捕食者-猎物模拟,但遇到了一个问题。 捕食者搜索附近的猎物并吃掉它。如果附近没有猎物,它们会移动到一个随机的空细胞。 基本上,我遇到的问题是当我进入“一代人”的时候 假设我有一个3x3的网格,每个单元格的编号从0到8。 如果我在0和1中有2个捕食者,第一个捕食者0被选中,它移动到3号或4号单元格 例如,如果它进入细胞3,那么它会继续检查捕食者1。这似乎是正确的 但它有点“优先”于指数较低的生物。。我试过使用2个数组,但这似乎也不起作用,因为它会检查生物存在但不存在的地方 任何人都知道如

我试图实现捕食者-猎物模拟,但遇到了一个问题。 捕食者搜索附近的猎物并吃掉它。如果附近没有猎物,它们会移动到一个随机的空细胞。
基本上,我遇到的问题是当我进入“一代人”的时候 假设我有一个3x3的网格,每个单元格的编号从0到8。
如果我在0和1中有2个捕食者,第一个捕食者0被选中,它移动到3号或4号单元格
例如,如果它进入细胞3,那么它会继续检查捕食者1。这似乎是正确的 但它有点“优先”于指数较低的生物。。我试过使用2个数组,但这似乎也不起作用,因为它会检查生物存在但不存在的地方

任何人都知道如何“公平”和“正确”地做到这一点吗?

如果你的猎物非常密集,这是一个常见的问题,我怀疑你没有长寿的“种群”。也可以作为评论,随机更新你的捕食者。也就是说,你不需要一步一步地搜索你的位置,而是把你的捕食者名单随机化,然后一个接一个地更新它们。我认为这是必要的,但我不知道这是否足够。

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

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

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


一种随机化的方法是创建一个
(行、列)
对的链表。然后洗牌链表。在每一代中,选择一个随机索引开始并继续处理。

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

编辑:看来我对你的问题读得不够透彻。双缓冲和随机化可能都是必需的,这取决于规则的复杂程度(但如果除了您描述的规则之外没有其他规则,随机化就足够了)。不过,它们解决了两个截然不同的问题:

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

如果您担心由于更新循环的扫描而在较低的索引中给捕食者带来不公平的优势。。。为什么不每次从一个随机位置开始扫描呢?在网格上选择一个随机点,从那里扫描,直到你绕回到那个点。下次你将从另一个角度开始。是的,这似乎是最符合逻辑和最简单的答案。这仍然在算法中引入了一种不受欢迎的规则模式,对模拟所寻求的那种同时性造成了冲击。想象一下对一个大数据集的影响。有了大量的捕食者,规律性会更加明显,但我认为重点是公平性,而不是随机化。如果你的目标是随机化,你可以每次将指针向前移动一个随机量,或者让它保持静止,并在x和捕食者数量相对较多的时间读取列表中的x个节点。良好的生物学观察,但我担心这在技术上是不够的,因为你仍然会面临随机选择两个相邻的捕食者并错误地更新它们的风险——请看我的答案。哎呀——我对这个问题读得不够透彻;你是对的,随机化是必要的。是否足够取决于规则;如果他给我们展示的规则是唯一的,我认为随机化就足够了。双缓冲也会带来一个问题,两个捕食者可能会进入同一个细胞,或者吃掉同一个猎物。我想可以通过检查两个缓冲区来解决。@Blorgbeard:True;实际上,需要根据两个缓冲区做出决策;我以前没有想到过+1.