Project 4: Mario DQN

Due: 2026.06.07.

Mario


简介

在这个项目中,我们将实现深度强化学习中的 DQN,并将其应用到 OpenAI Gym 下的马里奥场景中。

本次作业所需的文件为:Mario-RL.zip

你需要编辑的文件

文件作用
agent.py用于实现马里奥场景下的 DQN 智能体

你可能需要阅读的文件

文件作用
main.py训练入口
neural.py定义 Q 网络 MarioNet
wrappers.py环境预处理,包括灰度化、缩放、跳帧、堆叠帧
metrics.py记录训练过程中的 reward、loss、Q value 等指标
README.md框架代码运行说明

题目:DQN 方法

在本题中,你需要在 agent.py 中实现 DQN 所需的核心函数,使得马里奥智能体能够在像素场景下进行训练。

请按如下步骤在 agent.py 文件中补全 DQN 智能体:

  • td_estimate(state, action):根据 online 网络给出的 Q 值,返回当前 batch 中对应动作的 Q(s,a)

    def td_estimate(self, state, action):
        """
        Return the TD estimate Q_online(s, a).
        """
        "*** YOUR CODE HERE ***"

    提示:

    • online 网络算 Q 值:current_q_values = self.net(state, model="online"),形状 [batch_size, action_dim]
    • action 取对应分数:current_q = current_q_values[np.arange(0, self.batch_size), action],再 return。
  • td_target(reward, next_state, done):根据 DQN 的目标公式,返回当前 batch 的 TD target。

    @torch.no_grad()
    def td_target(self, reward, next_state, done):
        """
        Return the TD target.
        """
        "*** YOUR CODE HERE ***"

    提示:

    • 结束了只要 reward;没结束加 reward + gamma × 下一状态最高分
    • target 网络:next_q_values = self.net(next_state, model="target")next_q = next_q_values.max(dim=1)[0]
    • return (reward + (1 - done.float()) * self.gamma * next_q).float()
  • update_Q_online(td_estimate, td_target):根据 TD estimate 和 TD target 计算损失,并对 online 网络完成一次参数更新。

    def update_Q_online(self, td_estimate, td_target):
        """
        Update the online network once.
        """
        "*** YOUR CODE HERE ***"

    提示:算 loss,再按 loss_fn → zero_grad → backward → step 更新,最后 return loss.item()

当你实现好后,可以使用下面的命令验证 DQN 是否能够运行:

python main.py --episodes 100 --gpu 0

如果有多张 GPU,可以将 --gpu 0 改成对应的卡号。


实验报告要求

请在实验报告中简单说明以下内容:

  1. 你补全了 agent.py 中哪些函数。
  2. DQN 的 TD target 是如何计算的。
  3. 你的程序是否成功运行,训练输出结果如何。
  4. 长周期训练与收敛分析(重点):马里奥任务通常需要较长训练周期,建议进行上万 episode(如 10000+)训练;请结合 reward / loss / Q value 曲线,分析是否出现收敛趋势,并说明阶段性现象。

代码提交与评分

请你打包提交 agent.py 代码文件,并提交一份 pdfmarkdown 格式的报告。最终提交的压缩包需要命名为 "学号_姓名.zip"。请严格按照如下格式提交。

学号_姓名.zip
│
├── main.py
├── agent.py
├── neural.py
├── wrappers.py
├── metrics.py
└── 报告.pdf / 报告.md
                    

评分标准如下:

  • 环境运行与代码结构:20 分
  • DQN 实现:50 分
  • 实验报告:15 分
  • 代码规范:5 分
  • 拔高部分(长周期训练与收敛分析):10 分

其中:

  • DQN 实现主要考察 td_estimate、DQN 的 td_target 和参数更新过程
  • 拔高部分为重点考察项:马里奥任务通常需要长周期训练,建议至少进行上万 episode(10000+)训练
  • 需基于 reward / loss / Q value 的整体趋势判断是否收敛,并在报告中给出阶段性分析与结论
  • 只要代码能够正常运行,并完成 DQN 的核心逻辑,即可获得大部分分数

学术诚信

我们会将你的代码与其他提交进行逻辑查重。请独立完成作业,不要直接拷贝他人代码。