men100-ai 用 Python 驱动真实网页游戏《是男人就下100层》,把浏览器页面包装成 Gymnasium 环境,支持带 LSTM 的 RecurrentPPO、规则基线和贪心落板基线。训练不是本地复刻版,而是直接接 https://game.haiyong.site/100/ 这个 Egret canvas 游戏。
如果你是换电脑后接手开发,建议先按这个顺序看:
其中:
README.md负责总览、环境安装、常用命令docs/HANDOFF.md负责新电脑接手步骤docs/DEVELOPMENT-2026-04-17.md负责今天的完整开发过程和设计演进
项目默认使用本地 venv:
python3 -m venv .venv
. .venv/bin/activate
pip install --upgrade pip
pip install -e ".[dev]"
python -m playwright install chromium推荐额外做一次环境自检:
. .venv/bin/activate
python - <<'PY'
import platform, torch
print("machine:", platform.machine())
print("torch:", torch.__version__)
print("cuda_available:", torch.cuda.is_available())
print("mps_built:", torch.backends.mps.is_built())
print("mps_available:", torch.backends.mps.is_available())
PY
pytest -q如果你在 Apple Silicon 上开发,并且 mps_available: True,训练时建议显式传 --device mps。
当前主算法不是 DQN,也不是 TensorFlow 方案,而是:
- 强化学习算法:
sb3-contrib的RecurrentPPO - 策略网络:
MlpLstmPolicy - 深度学习后端:PyTorch
- 环境并行:
DummyVecEnv/SubprocVecEnv - 归一化:
VecNormalize
默认训练组合是:
preset = stable_v1reward_profile = stable_v4summary_layout = target_v2n-envs = 2
默认思路不是“让模型自己从零猜怎么跳”,而是:
- 环境给出目标板导向的观测特征
- 奖励函数鼓励朝首选目标板靠近
- LSTM 负责处理“下落过程”和“顶针逃生”这种时序决策
今天实际做了两轮优化:
- 从基础浏览器环境和原始奖励出发
- 加入
RecurrentPPO - 加入
stable_v1训练 preset - 加入
VecNormalize、checkpoint、best model、early stopping - 奖励升级到
stable_v3
这轮的主要目标是先把训练跑稳,避免“刚学会一点就迅速训崩”。
- 加入共享目标板选择器
targeting.py - 让规则基线与训练观测复用同一套目标板逻辑
- 观测升级为
target_v2 - 奖励升级为
stable_v4 - 增加
target_approach/target_landing - 加入同维不同语义模型的兼容逻辑
这轮的主要目标是提高稳定性,让模型在下落过程中更像“主动找板并对齐”,而不是只靠运气落到安全板。
显示浏览器并运行规则基线:
. .venv/bin/activate
python -m men100_ai.rule_baseline --agent rule --episodes 5 --show-browser显示浏览器并运行贪心落板基线:
. .venv/bin/activate
python -m men100_ai.rule_baseline --agent greedy --episodes 5 --show-browser显示浏览器训练 RecurrentPPO:
. .venv/bin/activate
python -m men100_ai.train \
--algo recurrent-ppo \
--preset stable_v1 \
--total-timesteps 50000 \
--show-browser使用多个浏览器子进程并行训练:
. .venv/bin/activate
python -m men100_ai.train \
--algo recurrent-ppo \
--preset stable_v1 \
--n-envs 2 \
--headless评估模型并录制视频:
. .venv/bin/activate
python -m men100_ai.evaluate \
--algo recurrent-ppo \
--model runs/recurrent-ppo-YYYYMMDD-HHMMSS/best_model/best_model.zip \
--episodes 3 \
--show-browser \
--record-dir videos/eval这里优先加载训练时 EvalCallback 保存的 best_model/best_model.zip,这是最稳的检查点。若该 run 使用了 VecNormalize,评估入口会自动从同一个 run 目录里恢复对应的 vecnormalize.pkl。
离线绘制训练曲线:
. .venv/bin/activate
python -m men100_ai.plot_curves \
--run runs/recurrent-ppo-YYYYMMDD-HHMMSS \
--output curves.png--show-browser会打开可见浏览器,你可以直接观察训练或评估过程。- 这个环境现在使用宏动作和子步采样:每个
env.step()会执行一个120ms或240ms的控制片段。 - 训练模型是
sb3-contrib的RecurrentPPO(MlpLstmPolicy),比单帧 MLP PPO 更适合“低血保命”和“安全落板”这种时序决策。 - 训练默认 preset 是
stable_v1:更小的学习率日程、更低的熵系数、target_kl、更大的 rollout/batch,以及VecNormalize + early stopping。 - 当
--n-envs > 1时,训练默认自动切到真正的多进程SubprocVecEnv,每个子进程独立启动一个浏览器环境。 - 这个环境是实时网页游戏,不是离线模拟器,所以训练速度受浏览器帧率限制。
- Playwright 视频会在 browser context 关闭后落盘,因此
record-dir下的文件会在一次 episode 结束后出现。 - 训练和评估默认奖励配置是
stable_v4:在stable_v3的楼层、血量、顶部风险、钉子/滚动板惩罚基础上,额外加入朝向首选目标的轻量密集奖励,以及更像样的目标对齐落板奖励;stable_v3和default_v2仍可通过--reward-profile回退。 - 训练和评估现在支持
VecNormalize。训练会把归一化统计和best_model/ checkpoint / final model 一起保存;评估会自动恢复同 run 下的统计文件。 - 评估入口兼容旧模型:如果 checkpoint 是老的
154维 observation,程序会自动切回旧布局;如果是第一版166维 summary-feature 模型,会按旧的summary_v1语义解释;新的第二轮优化模型仍然是166维,但会通过 run 配置切到新的target_v2语义。 - 曲线工具会递归读取 run 目录下的 TensorBoard event 文件,优先绘制
eval/mean_reward、eval/mean_ep_length、rollout/ep_rew_mean、approx_kl、explained_variance,并在存在时补充其它标量。 - 如果 run 目录上层有
config.json,曲线标题会尽量带上preset和reward_profile,方便区分不同 preset 跑出来的实验。
如果你拉下代码后想直接继续当前主线开发,先跑:
. .venv/bin/activate
python -m men100_ai.train \
--algo recurrent-ppo \
--preset stable_v1 \
--n-envs 2 \
--headless \
--reward-profile stable_v4 \
--total-timesteps 20000 \
--eval-freq 2000 \
--checkpoint-freq 5000src/men100_ai/browser_adapter.py:Playwright + JS bridge,读写游戏状态src/men100_ai/env.py:Gymnasium 环境封装src/men100_ai/train.py:RecurrentPPO 训练入口src/men100_ai/evaluate.py:模型评估入口src/men100_ai/rule_baseline.py:规则代理和贪心落板基线