康威生命游戏--繁衍与死亡

继 Biods 算法后,我们继续来看看还有哪些有趣的简单的算法,今天介绍的是康威生命游戏

历史渊源

生命游戏的灵感来源于冯·诺依曼在1940年代提出的“自我复制机器”理论。冯·诺依曼试图设计一种能在网格中复制自身的抽象机器,但模型过于复杂。

康威希望简化这一概念,最终创造了规则更简单、却能产生丰富行为的生命游戏。

  • 生命,细胞繁衍与死亡的过程
  • 游戏,强调依赖初始状态演化的特性

核心规则

场所: 一个无限大的二维方格网格上进行

细胞的生/死,一个格子代表一个细胞,格子起代表生,下代表死

  • 出生死细胞若拥有恰好3个活邻居 ,则下一轮变为活细胞。

  • 生存活细胞若拥有2个或3个活邻居 ,则继续存活。

  • 死亡

可能演化出的稳定或动态结构

  1. 静态稳定结构(Still Lifes)
    形状在演化中保持不变,例如
  • 方块2×2的活细胞块。
  • 蜂巢六边形结构。
  1. 周期振荡结构(Oscillators)
    周期性地循环变化,例如:
  • 闪烁灯水平或竖直的3个细胞,在1代后变为竖直或水平。
  • 脉冲星周期为3的复杂振荡器。
  1. 移动结构(Spaceships)
    整体在网格中移动,例如:
  • 滑翔机每4代沿对角线移动一格。
  • 轻型飞船移动更快的经典结构。
  1. 无限生长结构
    如“滑翔机枪”,能持续产生新的滑翔机,展示系统的无限扩展潜力。

核心代码展示

def step(grid) -> list[list[int]]:
    # 计算下一代(标准康威生命游戏规则)
    rows = len(grid)
    cols = len(grid[0]) if rows else 0
    next_grid = [[0 for _ in range(cols)] for _ in range(rows)]
    for r in range(rows):
        for c in range(cols):
            live_neighbors = 0
            # 统计 8 邻域存活数(不越界,且不算自己)
            for dr in (-1, 0, 1):
                rr = r + dr
                if rr < 0 or rr >= rows:
                    continue
                for dc in (-1, 0, 1):
                    if dr == 0 and dc == 0:
                        continue
                    cc = c + dc
                    if 0 <= cc < cols:
                        live_neighbors += grid[rr][cc]

            # 规则 1:活细胞在 2 或 3 个邻居时继续存活,其余则死亡
            if grid[r][c] == 1:
                next_grid[r][c] = 1 if live_neighbors in (2, 3) else 0
            # 规则 2:死细胞在恰好 3 个邻居时复活,否则保持死亡
            else:
                next_grid[r][c] = 1 if live_neighbors == 3 else 0

结果展示

life_grid

康威生命游戏以极简的规则揭示了“简单规则产生复杂行为”的深层原理,连接了数学、计算机科学与哲学。它不仅是一个有趣的模拟实验,更是理解复杂系统、计算理论和人工生命的重要窗口。

1 个赞

有点像显微镜下的细菌是怎么回事 :smiley:

1 个赞