【大作业】Lenia - 连续生命游戏

Code

作业来源

Lenia 是康威生命游戏(Game of Life,GoL)在连续空间数学推广。在GoL中,每个格子的下一状态由周围八个格子在这一时刻的状态和自身的状态决定,人们在其中发现了像是Glider, Still life, Oscillators等简单结构,以及更复杂的结构如Glider Gun,Life in Life等。在此之后,不断有人尝试推广GoL的规则,如Larger-that-Life, SmoothLife.

而Lenia则将生命游戏推广至连续的时间和空间之中,原本周围八个格子的状态被推广至一定半径内的邻域,而生长函数也做了平滑处理,通过这些抽象,出现了具有复杂行为,如平动、旋转、复制、躲避等和复杂外观,如轴对称,五角体,六角体等的生物。

这次大作业的是对Lenia原始论文的复现,主要利用了Taichi语言的并行特性来进行运算操作,从而了解Lenia的基础逻辑,其中包括了卷积核的组装,卷积操作,生长函数等部分。

文章:

Chan, Bert Wang-Chak. “Lenia: Biology of Artificial Life.” Complex Systems 28, no. 3 (October 15, 2019): 251–86.

运行方式

运行环境:

[Taichi] version 0.8.8, latest version 0.8.9, llvm 10.0.0, commit 7bae9c77, win, python 3.8.5

运行:

python ./Lenia-taichi.py

在实例初始化中,包含的参数有:

  1. res 决定lenia世界的大小
  2. scatter 每个像素的显示大小
  3. conv_r 卷积核的尺寸
  4. time 更新周期,时间步长dt=1/time
  5. mu 生长函数的参数,可以理解为正态分布的期望值,决定了lenia生物对环境的平均要求
  6. sig 生长函数的参数,可以理解为正态分布的标准差,决定了Lenia生物对环境的适应宽度
  7. kr 卷积核的阶数
  8. kb卷积核每一阶的权重

效果展示

kernel_beta=[1]
lenia_1b

整体结构

-LICENSE
-|data
-README.MD
-Lenia-taichi.py

实现细节:

项目源代码中包含两个类,ColorMap类主要对结果进行可视化,这个类复制自Taichi论坛,在此表示感谢。Lenia类则是作业的主干,具体公式见原文章。

整体流程

  1. Lenia世界的初始化
  2. 根据参数初始化卷积核,kernel_core函数决定了卷积核的分布特点,kernel_shell函数则决定了卷积核的外部轮廓
  3. 将组装的卷积核与当前的Lenia世界进行卷积操作,并将卷积操作的结果传入生长函数
  4. 更新世界,根据生长函数的结果和时间步长得到世界的更新量
  5. 在GUI中显示Lenia世界
7 个赞

Hi @march, 非常欢迎你来到太极论坛,来了就提交大作业,给力。

:joy: :joy:
还是我太菜了,没啥编程基础,做作业起来比较吃力

Hi @march, 非常感谢你提交的太极图形课大作业。作业的内容很有趣,但由于提交时间是在Deadline之后的一周,我们决定给你发送图形课大作业的礼物,但是不再发送图形课的结业证书。你觉得如何?

如果你要大作业礼物的话,可以将你的姓名详细地址手机号 发送到邮箱:
tgc01@taichi.graphics

:joy:什么,还能有礼物,那我太开心了,非常感谢Taichi