ProtoLife 旨在验证在有限二维世界中构建具备代谢、感知、行动能力的数字生命体并让其通过强化学习 / 演化形成自主策略的可行性。本仓库提供环境、策略、遗传、通信、记录等模块的初步框架,便于快速迭代实验。
- 纯规则驱动的物理/生理法则:环境负责移动、碰撞、能量代谢、食物/毒素交互、死亡与再生等硬规则,不写死智能策略。
- 多阶段实验开关:通过配置切换生存、繁衍、战斗、通信、环境改造等机制,便于逐步演进实验复杂度。
- 压缩日志与回放:地图编码为单字节单元,可在运行时或离线重放实验过程,支持地图存档导入导出。
- GPU 优先的向量化并行:建议在单卡 V100 上并行多个环境与个体,减少 Python 循环。
config/
default.yaml # 通用默认配置,可作为基底
phase0_survival.yaml # 生存阶段示例(可复制到 model/<name>/<name>.yaml 使用)
model/
demo_model/ # 单个模型/实验的归档目录
demo_model.yaml # 仅此一份主配置(建议由 config/ 复制后修改)
checkpoint/ # 训练产生的完整 checkpoint(full_step_xxx.pt)
log/ # 以时间戳命名的 map.log / agents.jsonl 回放日志
config/ # 训练时自动保存的 merge 后配置快照
protolife/
env.py # 网格环境与规则实现
encoding.py # 地图压缩编码
agents.py # 个体状态结构与批量管理
policy.py # 策略与价值网络
rewards.py # 行为奖励配置
genetics.py # 繁衍与变异逻辑
communication.py # 消息接口
logger.py # 实验记录
replay.py # 回放工具
config_loader.py # YAML 配置管理
utils/
cuda_utils.py
seed_utils.py
schedulers.py
scripts/
train_phase0.py
map_editor.py # 命令行地图编辑器
maps/
default_map.hex # 简单示例地图(8×8 全空)
当前仓库提供的是“可跑通流程”的最小原型:环境、策略与配置均为占位实现,但可以直接执行一轮前向推理与环境步进,用于验证依赖安装和配置是否正确。
-
准备 Python 环境
- 建议 Python 3.9+,可用
python -m venv .venv && source .venv/bin/activate创建虚拟环境。 - 安装依赖(CPU 版本示例):
pip install torch pyyaml。 - 若需要 GPU/CUDA,请根据显卡与 CUDA 版本替换为官方给出的
pip install torch==<ver>+cu118 -f https://download.pytorch.org/whl/torch_stable.html或直接使用给出的pip_CUDA121.bat,这是绝大部分搭载较新的NVIDIA GPU都能使用的一键安装脚本。 - 中国朋友请记得先切换pip清华源,方法自行搜索。
- 建议 Python 3.9+,可用
-
运行基本 Demo tip:请在项目根目录运行
# 初次使用 python -m scripts.train_phase0 --config .\config\default.yaml
按照指引对模型命名后,训练就开始了。如果需要修改参数,请先Ctrl+C停止代码运行,然后到
model/<model_name>/<model_name>.yaml中更改。相关参数的注释在config/default.yaml# 再次训练 python -m scripts.train_phase0 --model-dir model/<model_name>
预期输出:
- 打印训练进度和速率
- 显示模型实时画面(如果开启了"实时渲染"的话)
- 打印一次环境步进后的平均奖励
仅提供
--model-dir时,脚本会,默认从中加载所有模型,如果提供--config则会使用传入参数覆盖model/<model_name>如果不提供--config,脚本会默认尝试加载model/<model_name>/<model_name>.yaml,并在每次训练开始时打印所使用的模型目录与配置文件的完整路径,便于确认当前实验的来源与产出位置。 -
配置文件讲解与自定义 所有 YAML 位于
config/,推荐以config/default.yaml为基础:world:地图尺寸、随机地图中食物/毒素密度、随机种子、外部地图文件(示例:height: 64,width: 64,map_file: maps/default_map.hex)。如果提供了map_file且文件存在,会优先加载该地图,否则回退到随机/空白地图并按food_density/toxin_density撒点资源。 Windows 路径请使用正斜杠(例如G:/maps/demo.hex)或在 YAML 中写成双反斜杠(G:\\maps\\demo.hex),避免未转义的反斜杠导致解析错误。agents:每个环境的个体数量、初始能量等(示例:per_env: 4)。model:use_cnn: 默认开启,环境会为每个体裁剪(2r+1)×(2r+1)的局部网格并拆成多通道(墙/可建造区/食物/毒素/资源/周围其他个体 + 中心自身标记),直接送入 CNN 编码器。cnn_channels/cnn_feature_dim:控制卷积层深度与编码维度。rnn_hidden_dim/rnn_type:启用 GRU(默认)或 LSTM 作为短期记忆,隐状态会作为 Agent 侧的memory保存到 checkpoint,旧存档缺失该字段时会自动补零。hidden:当use_cnn关闭时回退的 MLP 隐藏层规模。
training:并行环境数、回合步数、保存间隔等训练相关参数(示例:num_envs: 8,save_interval: 100,checkpoint_dir: checkpoints/phase0)。 可用entropy_coef调整策略熵正则(默认提供非零值防止动作过早塌缩),action_noise下的gaussian_std与epsilon分别控制 logits 高斯噪声和 epsilon-greedy 随机探索。 若需要调试模型的动作采样,可开启print_actions: true查看每步动作编号与含义。action_rewards:行为基础奖励,可为正/负(示例:MOVE: 0.01,ATTACK: -0.01)。rewards:生存/进食奖励与食物感知奖励开关。enable_proximity_reward:是否根据感知范围内最近食物给予距离衰减奖励(默认开启)。see_food_reward/stand_on_food_reward:看到食物/踩在食物格时的基础奖励(默认0.005/0.02)。vision_decay_mode与vision_decay_coefficient:控制距离衰减;linear模式在半径处衰减到max(0, 1 - coeff),log模式使用1 / (1 + coeff * log(1+d))更平滑。 例如感知半径为 3、coeff=1.0时,线性衰减在距离 3 处约为0,而对数衰减在距离 3 处仍保留约三分之一的奖励。
- 阶段开关:各阶段配置文件通过布尔开关控制功能模块,例如
use_reproduction、use_combat、use_communication、use_terraforming。
如何自定义:
- 复制默认配置:
cp config/default.yaml config/my_exp.yaml。 - 按需修改上述字段;未修改的字段会沿用默认值。
- 运行时指定:
python -m scripts.train_phase0 --config config/my_exp.yaml。
- 默认
model.use_cnn: true,环境会为每个体在 GPU 上一次性裁剪局部网格 patch,shape 为(num_envs, agents_per_env, C, H, W),其中C包含墙/可建造区/食物/毒素/资源/其他个体以及中心“自身”指示。 - 策略网络改为
CNNRecurrentPolicy:卷积编码 -> GRU/LSTM 短期记忆 -> 动作 logits 与价值输出,兼容多环境、多智能体同时运行。 - Agent 侧新增
memory(以及 LSTM 时的memory_cell)字段,reset 时自动清零,checkpoint 会连同地图与优化器一起保存/恢复;旧存档缺少该字段时自动补零以避免维度错误。 - 若需要回退到旧的 MLP,占位策略,可在 YAML 中将
model.use_cnn设为false,其余训练入口与参数保持不变。
-
常见问题排查
ModuleNotFoundError: No module named 'torch':确认已在当前虚拟环境中执行pip install torch pyyaml。- CUDA 未被使用:检查
torch.cuda.is_available()是否为 True,如否则会回退到 CPU。
-
自定义地图加载与编辑
- 在配置
world.map_file中指定十六进制地图文件;确保height/width与文件中单元数量一致(每个单元两个十六进制字符,长度 =2*H*W)。 - 使用命令行编辑器快速制作地图:
# 从空白 16x16 地图开始编辑,保存到 maps/custom_xxx.hex python -m scripts.map_editor --width 16 --height 16 # 基于已有地图微调 python -m scripts.map_editor --input maps/default_map.hex --width 8 --height 8 --output maps/my_map.hex # 打开 matplotlib 图形界面,点击涂抹/按 n 切换笔刷类型 python -m scripts.map_editor --width 16 --height 16 --gui
- 在配置
-
模型与环境 checkpoint / 断点续推
-
推荐每个模型/实验单独建目录:
model/<model_name>/(如上文 Demo)。目录下需要有一份<model_name>.yaml作为训练/回放唯一入口。 -
训练脚本新增参数:
--save-interval:每隔多少步保存模型与完整存档(默认读取配置中的training.save_interval)。--checkpoint-dir:保存目录(默认指向model/<name>/checkpoint)。--model-dir/--model-name:统一管理模型目录,便于续训或共享。--resume-from:从完整 checkpoint 继续推演(恢复地图、agent 状态、优化器与步数)。--load-model:仅加载模型权重,在新地图或新实验上测试。- 启动时会打印模型目录、配置文件、checkpoint 目录以及检测到的
full_step_*.pt完整路径,便于确认输入输出位置。
-
示例:
# 从最新 checkpoint 直接续训(自动定位 model/<model_name>/checkpoint 下最新 full_step_*.pt) python -m scripts.train_phase0 --model-dir model/<model_name> # 显式指定某个存档继续 python -m scripts.train_phase0 --resume-from model/<model_name>/checkpoint/full_step_200.pt # 从其他模型加载 python -m scripts.train_phase0 --resume-from /<model_name>/checkpoint/full_step_200.pt # 加载他人分享的模型只需要把模型文件夹复制到自己的model/下就可以使用--model-dir调用了
-
checkpoint 内容包括:当前地图、全部 agent 状态、策略网络参数、优化器参数与当前步数,可直接用于“继续推演”或模型回滚。
-
-
实时渲染、日志与回放
logging.realtime_render: true时,环境会用 matplotlib 绘制首个并行环境的地图与 agent 位置(参考map_editor的配色,需安装 matplotlib)。logging.save_dir与logging.snapshot_interval控制回放日志写入;运行结束后可用protolife.replay.playback(log_dir, height, width)或脚本python -m scripts.visualize_replay --log-dir <dir> --height <H> --width <W>在 Python 交互式环境中快速查看轨迹。- 每次运行会按照时间戳生成
<tag>_map.log与<tag>_agents.jsonl(第一行包含元数据):map.log记录压缩地图快照,agents.jsonl记录每个 step 的个体状态摘要。需要回放时可直接将--log-dir指向model/<name>/log,脚本会自动匹配最新的成对日志。 - 回放:
-
进入对应的模型目录(例如
model/demo/),确认<model_name>.yaml、checkpoint/、log/存在。 -
回放:在'项目根目录'执行
python -m scripts.visualize_replay --log-target model/<model_name>
或在代码中调用
protolife.replay.playback。
-
本 README 为概览,详细设计思路请参考源码中的中文注释,后续可在此基础上逐步补全能量代谢、战斗、通信等真实逻辑。