生命游戏:如何让"实体"并行发展?

Mat*_*oli 7 java parallel-processing cellular-automata

好吧标题不清楚,这就是我的意思.

我正在编程某种游戏(比如生命游戏).例如,有动物(每个动物是一个类的Java实例).

所有这些动物都在地图上,所有这些" 世界 "都演变为每个"转向".

这些动物可以在每个回合动作.例如:狼杀死了一只羊.

但是,我对在状态之间进行这些演变的"方法"有困难,因为结果将取决于我循环通过动物的顺序.

示例:

  • 狼先:狼杀了羊(然后羊死了,所以没动作)
  • 羊首先:羊吃了一些草,然后狼(转过狼)狼杀了羊

我怎么解决这个问题 ?

多线程?(但我会有很多动物,比如1000甚至更多......).是否有算法,"方法"来做到这一点?

谢谢

Pét*_*rök 10

你应该正确地模拟转弯,即让每只动物根据世界的当前状态轮流,以便动作的结果更新到世界的下一个状态,而不是当前状态.即

  1. 在目前的步骤中,羊吃了一些草,狼杀了它.
  2. 在世界的下一个状态,有一只内容狼,没有羊(或羊胴体 - 取决于你的模型).

这样,评估的顺序不会影响结果,这开启了例如并行化执行的可能性,优选地使用FutureTasks和a ThreadPoolExecutor.


Ser*_*gey 1

我认为实体只有在非常简单的场景中才可能并行进化(以康威的生活为例)——对于你的“狼-羊-草”世界,你想得越多,它就会变得越复杂:

  • 考虑有两只狼和一只羊的情况。狼一决定吃掉羊;狼二决定吃羊——你如何决定哪一只吃羊(让我们假设吃是一个原子操作——狼不能分享他们的食物)。所以你仍然需要决定一些顺序,比如狼一得到一只羊,而狼二什么也得不到(这对狼二来说是完全出乎意料的——一秒钟前有一只羊,它张开嘴——砰!——什么也没有)

  • 有两只狼和两只羊;两只羊对两只狼的“吸引力”是相同的,因此它们随机选择猎物。不幸的是,他们选择了同一只羊,狼一吃掉了羊一,狼二也试图吃掉羊一,但羊一神奇地消失在它的鼻子底下。回合结束。在下一个回合中,羊二号逃跑了,狼二号挨饿了——这完全不合逻辑。

因此,我认为简单地迭代动物列表并为每个动物调用执行原子操作的方法会产生更符合逻辑的宇宙。如果您担心较早生成的动物比较晚生成的动物具有不公平的优势,您可以在每轮之前随机化动物列表 - 这样,在您的示例中,要么绵羊吃了一些草,然后被狼吃掉,或者狼在有机会吃草之前就吃掉了它。这就是生活。