【趣味】【python元胞自动机】【附赠HTML版本】

1.代码

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

# 定义细胞的状态常量
ALIVE = 1
DEAD = 0

# 定义网格的大小和细胞的初始状态
grid_size = 100
init_config = np.random.choice([ALIVE, DEAD], size=(grid_size, grid_size))


# 定义细胞自动机的规则
def get_new_state(grid, i, j):
    # 获取相邻细胞的状态
    neighbors = grid[max(i - 1, 0):min(i + 2, grid_size), max(j - 1, 0):min(j + 2, grid_size)]
    # 计算相邻活细胞的数量
    alive_neighbors = np.count_nonzero(neighbors) - grid[i, j]
    # 更新细胞状态
    if grid[i, j] == ALIVE and 2 <= alive_neighbors <= 3:
        return ALIVE
    elif grid[i, j] == DEAD and alive_neighbors == 3:
        return ALIVE
    else:
        return DEAD


# 初始化细胞状态
grid = init_config

# 初始化可视化
fig, ax = plt.subplots()
im = ax.imshow(grid, cmap='Greys', interpolation='nearest')


# 更新细胞状态的回调函数
def update(frameNum, grid, im):
    new_grid = np.zeros((grid_size, grid_size))
    for i in range(grid_size):
        for j in range(grid_size):
            new_grid[i, j] = get_new_state(grid, i, j)
    im.set_data(new_grid)
    grid[:] = new_grid[:]
    return im,


# 使用 FuncAnimation 实现动画
ani = animation.FuncAnimation(fig, update, fargs=(grid, im), frames=100, interval=50, blit=True)

plt.show()

这段代码实现了一个生命游戏的动画,生命游戏是一种细胞自动机,它由一个二维的网格和一些简单的规则组成。这些规则决定了每个细胞在下一次迭代中是否存活或死亡。

在这段代码中,首先定义了细胞的状态常量,然后生成了一个随机的初始配置。接着定义了一个函数来计算每个细胞的新状态。这个函数会获取相邻细胞的状态,并根据规则计算新的状态。然后在主函数中初始化了细胞状态和可视化,并使用 FuncAnimation 实现了动画。在动画中,每一帧都会调用 update 函数来更新细胞的状态,并将更新后的状态显示在可视化中。

2.HTML

<!DOCTYPE html>
<html>
<head>
    <title>元胞自动机</title>
</head>
<body style="background-color: #d8d8d8;">
    <canvas id="canvas"></canvas>
    <script>
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        const width = 576;
        const height = 864;
        canvas.width = width;
        canvas.height = height;

        let cells = [];
        for (let i = 0; i < width; i++) {
            cells[i] = [];
        }
        for (let i = 0; i < width; i++) {
            for (let j = 0; j < height; j++) {
                cells[i][j] = Math.floor(Math.random() * 2);
            }
        }

        function update() {
            let newCells = [];
            for (let i = 0; i < width; i++) {
                newCells[i] = [];
            }
            for (let i = 0; i < width; i++) {
                for (let j = 0; j < height; j++) {
                    const neighbors = countNeighbors(cells, i, j);
                    if (cells[i][j] === 0 && neighbors === 3) {
                        newCells[i][j] = 1;
                    } else if (cells[i][j] === 1 && (neighbors < 2 || neighbors > 3)) {
                        newCells[i][j] = 0;
                    } else {
                        newCells[i][j] = cells[i][j];
                    }
                }
            }
            cells = newCells;
        }

        function countNeighbors(cells, x, y) {
            let count = 0;
            for (let i = -1; i <= 1; i++) {
                for (let j = -1; j <= 1; j++) {
                    const row = (x + i + width) % width;
                    const col = (y + j + height) % height;
                    if (cells[row][col] === 1) {
                        count++;
                    }
                }
            }
            return count;
        }

        function render() {
            ctx.clearRect(0, 0, width, height);
            for (let i = 0; i < width; i++) {
                for (let j = 0; j < height; j++) {
                    if (cells[i][j] === 1) {
                        ctx.fillStyle = 'black';
                    } else {
                        ctx.fillStyle = '#79c995';
                    }
                    ctx.fillRect(i, j, 1, 1);
                }
            }
        }

        setInterval(function () {
            update();
            render();
        }, 100);
    </script>
</body>
</html>

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
动机(Cellular Automaton,CA)是一种离散的、自动的计算模型,由一个规则网格(grid)组成,每个网格单元被称为细(cell),且每个细都有一定的状态。在元动机中,时间是离散的,系统的演化是通过在每个时间步骤中,根据一定的规则更新每个细的状态来实现的。Python提供了丰富的库和工具,可以用来实现元动机的模拟和可视化。 以下是一个简单的Python代码示例,用于实现基本的元动机模拟: ```python import numpy as np import matplotlib.pyplot as plt # 设置元动机的规模和初始状态 grid_size = 100 # 网格大小 num_steps = 100 # 模拟步数 initial_state = np.random.randint(2, size=(grid_size, grid_size)) # 随机生成初始状态 # 定义元动机的演化规则函数 def evolve(grid): new_grid = np.zeros_like(grid) for i in range(grid_size): for j in range(grid_size): # 根据邻居细的状态更新当前细的状态,这里使用了经典的Game of Life规则 live_neighbors = np.sum(grid[max(0, i - 1):min(i + 2, grid_size), max(0, j - 1):min(j + 2, grid_size)]) - grid[i, j] if grid[i, j] == 1: if live_neighbors in [2, 3]: new_grid[i, j] = 1 else: if live_neighbors == 3: new_grid[i, j] = 1 return new_grid # 模拟元动机的演化过程 state = initial_state for step in range(num_steps): plt.imshow(state, cmap='binary') plt.title(f'Step {step + 1}') plt.show() state = evolve(state) ``` 上述代码使用了NumPy库来处理网格的状态和更新操作,并使用了Matplotlib库来可视化模拟的过程。其中,演化规则函数`evolve()`实现了经典的Game of Life规则,根据细周围邻居的状态来更新当前细的状态。在模拟过程中,每个时间步骤都会将当前状态绘制出来,最终形成一个动画效果。 通过修改演化规则函数和初始状态,你可以实现各种不同的元动机模拟。希望这能帮助到你!如果有任何进一步的问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值