基于Actor-Critic策略的Atari中的pong_v3
基于Policy Gradient策略的Atari中的pong_v3
1. 故事背景与原始目标
Pong_v3 是基于经典 Atari 游戏《Pong》的多智能体强化学习环境。它模拟了两个玩家在屏幕两侧控制挡板,试图将球击回并得分的场景。
背景: 这是一个经典的双人对抗游戏,强调反应速度与击球角度。
目标: 每个智能体的目标是将球击回并让球越过对方的挡板,从而获得分数。
2. 动作空间
每个智能体拥有 6 个离散动作:
动作编号 | 行为描述 |
---|---|
0 | 无操作 |
1 | 发球(Fire) |
2 | 向右移动 |
3 | 向左移动 |
4 | 向右发球 |
5 | 向左发球 |
注:虽然游戏看起来简单,但动作组合可以影响球的速度和角度,进而影响策略表现。
3. 状态空间
- 形状:(210, 160, 3),即 210×160 像素的 RGB 图像。
- 值范围:每个像素值在 [0, 255] 之间。
含义:这是游戏画面的原始像素表示,智能体需要从图像中识别球的位置、速度、对手位置等信息。
4. 奖励机制(Reward Mechanism)
-
得分奖励:当一个智能体成功让球越过对方挡板时,获得 +1 分,对方获得 -1 分。
-
发球超时惩罚:如果智能体在接球后 2 秒内未发球,将被扣除 -1 分,并重置发球计时器。
这防止了智能体通过“拖延”来规避游戏进程。也意味着该环境 不再是严格的零和博弈。
5. 可配置参数:
参数名 | 描述 |
---|---|
render_mode | 是否可视化游戏画面(如 “human”) |
num_players | 玩家数量(支持 2 或 4) |
seed | 随机种子,保证实验可重复性 |
6. 代码项目实现
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as np
from pettingzoo.atari import pong_v3# 超参数
GAMMA = 0.99
LR = 1e-3
EPISODES = 500# 预处理函数
def preprocess(obs):obs = np.mean(obs, axis=2).astype(np.uint8) # (210,160)obs = obs[::2, ::2] # (105,80)return obs.flatten()# Actor-Critic网络
class ActorCritic(nn.Module):def __init__(self, obs_shape, n_actions):super().__init__()self.input_dim = np.prod(obs_shape)self.fc1 = nn.Linear(self.input_dim, 256)# Attention参数self.attn_seq_len = 8 # 可调节,序列长度self.attn_dim