You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jupyter Notebook运行代码时内核中途崩溃的解决办法咨询

Langton蚂蚁模拟内核崩溃问题解决方法

问题根源分析

你的代码每次循环都会创建新的Matplotlib图形对象、重复调用plt.show(),还把%matplotlib osx放在循环内反复执行,这会导致内存快速累积泄漏,最终触发Jupyter内核重启。另外极端小的pause值不仅没有实际效果,还会额外消耗系统资源。

具体修复方案

  • 将Matplotlib后端配置移到代码最顶部,避免重复执行
  • 只初始化一次绘图对象,循环中仅更新图像数据,不再重复创建图形
  • 合理设置暂停时间,或按需调整绘图更新频率
  • 添加边界检查,防止蚂蚁跑出数组范围引发错误

修改后的代码

import numpy as np
import matplotlib.pyplot as plt

# 配置Matplotlib后端(Jupyter推荐用notebook,支持交互式绘图)
%matplotlib notebook

def ant(nx, ny, nmoves, update_interval=10):
    # 初始化数组,1代表白色,0代表黑色
    arr = np.ones((ny, nx))
    ix, iy = nx//2, ny//2
    dx, dy = 1, 0  # 初始方向向右

    # 仅创建一次绘图对象,避免重复创建导致内存泄漏
    fig, ax = plt.subplots()
    img = ax.imshow(arr, cmap='Greys', interpolation='nearest')
    ax.axis('off')
    plt.show(block=False)

    for i in range(nmoves):
        # 边界检查:防止蚂蚁跑出数组引发索引错误
        if not (0 <= ix < nx and 0 <= iy < ny):
            print(f"蚂蚁在第{i}步跑出边界,停止模拟")
            break

        # 执行转向规则
        if arr[iy, ix]:
            dx, dy = dy, -dx  # 白色格子右转90度
        else:
            dx, dy = -dy, dx  # 黑色格子左转90度

        # 翻转当前格子颜色
        arr[iy, ix] = 1 - arr[iy, ix]
        # 更新蚂蚁位置
        ix, iy = ix + dx, iy + dy

        # 每隔N步更新一次图像,减少绘图开销
        if i % update_interval == 0:
            img.set_data(arr)
            fig.canvas.draw_idle()
            plt.pause(0.001)  # 合理的暂停时间,平衡流畅度与资源占用

    # 模拟结束后显示最终状态
    img.set_data(arr)
    fig.canvas.draw_idle()
    plt.show()

# 参数设置
nx = 175
ny = 175
nmoves = 13000
ant(nx, ny, nmoves)

关键改动说明

  1. 后端适配:用%matplotlib notebook替代osx,更适配Jupyter环境,资源占用更低且支持交互式操作
  2. 绘图对象复用:仅初始化一次fig、ax和img,循环中通过set_data()更新图像数据,彻底避免重复创建图形导致的内存泄漏
  3. 更新间隔优化:添加update_interval参数,每隔指定步数才更新一次绘图,大幅降低系统负载
  4. 边界防护:增加数组边界检查,避免蚂蚁移动到数组外引发索引错误导致崩溃
  5. 合理暂停时间:将极端小的暂停值调整为0.001,既保证动画流畅,又不会浪费系统资源

内容的提问来源于stack exchange,提问作者pdridee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:01:55