PettingZoo 官方项目标识

PettingZoo

Stars

Farama Foundation 的多智能体强化学习环境库,提供 AEC 与 Parallel API,并收录棋类、Atari 等多种可供训练与评测的环境。Tic-Tac-Toe 是其中一个按智能体轮流行动的 Classic 环境。

Multi-Agent Reinforcement LearningAEC · Parallel APIPython · Classic Games
MULTI-AGENT ENVIRONMENTS · STATE SERIALIZATION

复制对局,必须能从同一个回合继续

构造参数只能重建空环境;完整的复制需要带走 AEC 棋局状态,同时把 pygame 渲染资源留在进程本地。

LIVE ENV · AFTER TWO MOVES
XO
agent_selectionplayer_1legal moves7 cells

棋盘、回合、奖励与终止状态都属于运行中的对局

BEFORE · EZPICKLEdeepcopy(env) → raw_env(render_mode, size)
BOARDRESETTURNRESETREWARDSRESET

只重放构造参数,无法接着当前局面行动

AFTER · STATEFUL COPY__getstate__ → __setstate__
GAME STATEPRESERVED ✓SCREEN · CLOCKRECREATEDRENDERLAZY INIT

deepcopy 与 pickle:同一局面,两个独立环境

状态丢失

复制后棋盘和当前回合回到起点

Tic-Tac-Toe 的 `raw_env` 继承 `EzPickle`,复制或 pickle 往返时只按构造参数重建新环境,不保存进行中的棋盘、当前行动者、奖励、终止标记与合法动作掩码。复制对象看似成功,却已经退回初始状态,不能从原局面继续行动。

边界划分

棋局字段可保存,屏幕与时钟需重建

复制环境需要保存 AEC 运行状态,而不是重新调用构造器;但 pygame 的 `screen` 和 `clock` 属于当前进程的渲染资源,不能直接随状态序列化。应保留棋局与智能体字段,单独排除渲染对象,并在复制对象再次渲染时按需重建。

序列化修复

保留运行字典,渲染资源按需初始化

移除 `EzPickle`,用 `__getstate__()` 复制环境字典、去掉 `clock` 并将 `screen` 置空;`__setstate__()` 恢复运行字段,并为 human 模式重建时钟。把显示资源初始化抽为 `_initialize_rendering()`,由 `reset()` 与 `render()` 共用,使复制后无需重置棋局也能重新渲染。

行为验证

中局、终局与复制后独立落子均保持正确

`deepcopy` 与 pickle 往返现在都保留中局棋盘、当前行动者、奖励、终止状态、观测和动作掩码;复制对象的 RGB 渲染与原环境一致,继续落子也不会修改原对象。终局测试额外锁定胜负奖励与双方终止标记,避免只修复进行中的局面。