ML-For-Beginners 实战为彼得与狼Q-Learning 环境扩展能量与疲劳状态让世界更真实【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners在 ML-For-Beginners 的强化学习章节8-Reinforcement/1-QLearning中基础版彼得与狼环境允许智能体Peter几乎无代价地移动既不饿也不累。本节作业Assignment:A More Realistic World要求学习者基于原版 notebook.ipynb 重写游戏规则为状态引入**能量energy与疲劳fatigue**两个维度并据此重构奖励函数与胜负判定让 Q-Learning 学习到一套能够真正战胜狼的最优策略。完成本文档后你将掌握如何把连续生理状态引入离散网格强化学习、如何重设计奖励函数驱动稀疏目标猎狼成功是稀有事件的学习、以及如何用随机行走 vs Q-Learning对照实验公平评价算法效果。一、任务背景从取苹果升级为猎狼求生在原版课程 README.md 的设定中Peter 的目标是在一张8×8棋盘上找到苹果同时避开狼与水。他每走一步要么胜利到达苹果要么失败落水或被狼吃掉移动本身没有体力成本因此状态仅是位置Q-Table 也只需覆盖width × height × len(actions)个格子。而作业A More Realistic World捷克语翻译版见 translations/cs/8-Reinforcement/1-QLearning/assignment.md英文原文见 8-Reinforcement/1-QLearning/assignment.md提出了 5 条新规则彻底改变了游戏难度与目标规则编号规则内容引入的系统性影响1每从一个位置移动到另一个位置Peter消耗能量并累积疲劳移动不再免费最短路径不一定是最优路径2Peter 可以通过吃苹果获得更多能量苹果从终点目标降级为补给资源价值语义发生变化3Peter 可以通过在树下或草地上休息即走进树/草的绿色格子消除疲劳绿色格子的语义从装饰变为可交互的恢复区4Peter 需要找到并杀死狼游戏终止条件与成功定义整体重写5杀死狼需要足够的能量与足够低的疲劳否则战斗失败引入战前状态门槛成败取决于到达狼格时的瞬时体力对比原版可见狼不再是单纯需要避开的死亡格而是可在满足条件时被击败的最终目标苹果与绿色格子的作用也从目标/普通地形变成了维持续航的资源。这套设计迫使学习者必须重新思考状态表示与奖励函数正是本节作业的训练重点。二、状态表示升级把能量与疲劳装进环境作业注释assignment 原文明确指出了实现路线状态变得更复杂除人的位置外还要包含疲劳与能量水平。并给出了三种可选表示法用元组(Board, energy, fatigue)表示状态定义状态类可从Board派生直接修改 rlboard.py 中的原始Board类。2.1 从源码看原版Board的可扩展性先看Board底层结构rlboard.pyclass Board: class Cell: empty 0 water 1 wolf 2 tree 3 apple 4Cell枚举里tree、apple、wolf、water已全部存在说明新规则2、3可以直接基于现有地形语义实现无需新增格子类型。原版还提供了几个关键原语支撑移动消耗 触地判定的重构at(posNone)返回当前位置或指定位置的格子类型rlboard.pymove_pos(pos, dpos)与move(dpos, check_correctnessTrue)先算目标位置、再执行位移其中move支持在check_correctnessFalse时越界移动以终止回合rlboard.pyrandom_start()把 Peter 放到一个empty格作为回合起点rlboard.py。2.2 参考答案的状态封装一个轻量state类仓库中的参考解法 solution/assignment-solution.ipynb 选择了方案二独立状态类把能量与疲劳的全部演进逻辑收敛在一个对象里值得借鉴class state: def __init__(self, board, energy10, fatigue0, initTrue): self.board board self.energy energy self.fatigue fatigue self.dead False if init: self.board.random_start() self.update() def at(self): return self.board.at() def update(self): if self.at() Board.Cell.water: self.dead True return if self.at() Board.Cell.tree: self.fatigue 0 if self.at() Board.Cell.apple: self.energy 10 def move(self, a): self.board.move(a) self.energy - 1 self.fatigue 1 self.update() def is_winning(self): return self.energy self.fatigue这个类逐条落实了新规则move(a)每步统一energy - 1、fatigue 1——对应规则 1update()检测到apple时把能量拉回上限10——对应规则 2update()检测到tree时把疲劳清零——对应规则 3这也是作业所说的绿色格子可休息is_winning()用energy fatigue判定是否有资格猎狼——对应规则 5的能量水平门槛。该解法的精巧之处在于棋盘Board本身未做任何修改仍通过组合方式被state持有Q-Learning 的格子索引逻辑x, y s.board.human得以沿用原版结构。三、胜负判定与随机行走基线一切评价的锚点作业要求在解决方案中保留随机行走策略代码并在结尾比较你的算法与随机行走的结果以赢、输场次计——因此随机行走必须被重构为兼容新规则的基线。参考答案的行走逻辑如下def random_policy(state): return random.choice(list(actions)) def walk(board, policy): n 0 # number of steps s state(board) while True: if s.at() Board.Cell.wolf: if s.is_winning(): return n # success! else: return -n # failure! if s.at() Board.Cell.water: return 0 # died a actions[policy(m)] s.move(a) n 1与原版walk见 README.md 的 Random walk 一节用return -1表示被狼吃/落水相比新逻辑有两个关键变化遇见狼不再等于失败进入狼格时先调用is_winning()判定战斗胜负。胜利返回步数n能量不足则返回-n失败落水单独计为0与被狼打败的负值区分开便于统计三类结局胜、败于狼、死于水。为输出可比的对照统计可继续沿用课程里的print_statistics(policy)思路跑 100 局统计平均路径与失败次数把返回值分成胜利次数与失败次数两个口径即可。四、奖励函数重设计用体力差驱动全过程学习4.1 原版奖励的局限原版课程给出了极简奖励函数代码块 5见 README.mdmove_reward -0.1 goal_reward 10 end_reward -10 def reward(m, posNone): pos pos or m.human if not m.is_valid(pos): return end_reward x m.at(pos) if x Board.Cell.water or x Board.Cell.wolf: return end_reward if x Board.Cell.apple: return goal_reward return move_reward在该框架下狼必然是end_reward-10的绝对禁区。但在新规则中狼格可能是通关点因此奖励函数必须重写。4.2 新奖励即时反馈 终局胜负参考答案给出的新奖励函数设计得相当精炼def reward(s): r s.energy - s.fatigue if s.at() Board.Cell.wolf: return 100 if s.is_winning() else -100 if s.at() Board.Cell.water: return -100 return r它的核心思想是奖励函数要能被分解成即时收益与终局收益两层逐格即时项energy - fatigue把状态自带的生理信息直接转成奖励数值。能量高、疲劳低时分数为正鼓励 Peter 先去补给再推进随着能量耗尽、疲劳累积分数转负自然抑制无意义的原地兜圈等价于一种自带步数惩罚的连续化版本——不再需要手工设定move_reward-0.1体力差本身就是自适应步数成本。终局胜负项±100胜利给100、被狼反杀或落水给-100用一个远大于即时项的绝对量级保证赢下整局的长期回报优先于任何单步即时收益。这正是课程 README.md 反复强调的核心洞察多数情况下游戏只在结束时给出实质性奖励算法必须能回溯记住那些通向正奖励的好步骤——这正是 Q-Table 与 Bellman 公式存在的意义。对自研方案而言只要保证(a) 每个非终局状态都有连续可学习的即时反馈(b) 终局奖励在量级上显著压倒即时项使猎狼成功这种稀有事件能被 Q 值逐步扩散传播即符合本作业对奖励函数完整定义的验收要求对应评分表中Needs Improvement奖励函数未完整定义的规避点。五、Q-Learning 主循环改造状态变复杂学习不变课程核心算法 Q-Learning 依然适用唯一变化是每个训练步都要经state封装读写能量与疲劳。以下给出参考答案在 solution/assignment-solution.ipynb 中的完整训练循环from IPython.display import clear_output lpath [] for epoch in range(10000): clear_output(waitTrue) print(fEpoch {epoch}, end) # Pick initial point s state(m) # Start travelling n 0 cum_reward 0 while True: x, y s.board.human v probs(Q[x, y]) while True: a random.choices(list(actions), weightsv)[0] dpos actions[a] if s.board.is_valid(s.board.move_pos(s.board.human, dpos)): break s.move(dpos) r reward(s) if abs(r) 100: # end of game lpath.append(n) break alpha np.exp(-n / 3000) gamma 0.5 ai action_idx[a] Q[x, y, ai] (1 - alpha) * Q[x, y, ai] alpha * (r gamma * Q[x dpos[0], y dpos[1]].max()) n 1对照原版训练循环README.md 的 Python implementation 一节可见改动高度局部化要素原版新规则版原因Q-Table 结构np.ones((width, height, len(actions))) * 1/len(actions)完全不变状态新增维度未展开进 Q-Table仍按物理坐标索引能量/疲劳体现在该状态是否可达/何时终止动作选择直接m.move(dpos, check_correctnessFalse)先校验is_valid再s.move(dpos)新规则下越界应被阻止而非用于终结回合终局只由狼/水触发回合结束判定r end_reward或累计奖励过小abs(r) 100终局奖励正负都是100统一判绝对值学习率衰减alpha np.exp(-n / 10e5)即 /100000alpha np.exp(-n / 3000)单回合更长、信息更密集衰减加快以稳定收敛回合数 epoch500010000见下方稀有事件分析折扣因子 γ0.50.5可保持不变5.1 为什么必须加大 epoch 并调学习率猎狼是稀有事件作业注释特别强调游戏成功与狼战斗并取胜是稀有事件你可能需要多得多much longer的训练时间。结合新世界进一步解读原版里找到苹果的成功率尚可5000 个 epoch 足够让奖励沿路径传播新世界要求 Peter 先积累足够能量、清空疲劳再恰好走到狼格并以energy fatigue收场是一条补给 → 赶路 → 挑战的长链条单次成功所需步数大幅上升终端奖励 100 只在回合真正胜利时出现一次若训练轮数不足Q-Table 中多数格子仍未收到可用的传播信号因此除调大 epoch 外通常还需配合学习率衰减曲线让后期小幅微调 Q 值避免如课程 README.md Investigating the learning process一节所描述的训练后期路径长度陡增的Q 值被新样本覆盖污染现象与回合上限约束。课程末尾的挑战任务给walk限长、禁止回退在此同样适用可作为防止死循环的辅助手段。六、策略评估与作业验收用胜/负场次说话训练收敛后用课程标准的两种 Q-Table 策略做评测def qpolicy(m): x, y m.human v probs(Q[x, y]) a random.choices(list(actions), weightsv)[0] return aqpolicy即按 Q-Table 值成正比的概率采样动作是训练期探索与利用平衡策略的推理版。最后调用print_statistics(random_policy)与print_statistics(qpolicy)各跑 100 局统计胜负场次即可完成作业要求的对照。6.1 作业评分表Rubric解读assignment 提供的评分标准直接定义了优秀的边界等级判定条件对学习者的自查点优秀Exemplary提交含新世界规则定义、Q-Learning 算法与文字解释的 notebook且 Q-Learning显著优于随机行走是否写了规则/奖励设计的文字说明胜负场次差异是否肉眼可见代码是否结构清晰合格AdequateQ-Learning 已实现并有改善但不显著或 notebook 文档化差、代码结构不佳确认了 Q 值已更新但提升幅度小补足注释与模块划分需改进Needs Improvement只尝试重定义了世界规则但 Q-Learning 不工作或奖励函数未完整定义检查回合是否永远不结束、reward是否覆盖所有格子类型狼/水/树/苹果/普通地面结论核验的标准简单而硬核同一个print_statistics把随机行走与 Q-Learning 的胜场数、负场数并排输出。若 Q-Learning 在猎狼成功次数上明显压过随机行走即完成作业核心目标。七、实验建议与避坑清单基于上述源码与参考实现实际动手时建议按以下顺序迭代先冻结基线不改任何学习代码先让随机行走在新规则 walk 新 reward下能稳定输出统计口径胜/败于狼/死于水保证后续对照可信再改状态与奖励推荐先照抄state类封装能量/疲劳逻辑把update()的树/苹果/水分支写对再用energy - fatigue做即时项、±100 做终局项最后调参训练以epoch参考实现用 10000、alpha衰减分母参考实现用 3000、gamma课程用 0.5为主轴做小规模网格尝试每轮训练后立刻跑qpolicy统计看趋势验证奖励完整定义显式检查reward(s)是否覆盖wolf / water / apple / tree / 普通地面五种情形——这是评分表Needs Improvement档位最典型的丢分点保留解释性输出m.plot(Q)把学习后的策略画回棋盘配合plt.plot(lpath)观察每回合步数随 epoch 的变化曲线成功步数应逐渐下探可显著提升 rubric 中文字解释维度的得分。小结A More Realistic World是本课程的经典进阶作业它在不更换算法框架的前提下迫使你重建状态语义、重写奖励函数并重定义成功从而真正理解状态设计、奖励塑形reward shaping与稀疏回报这三个 RL 工程的核心命题。仓库中的 solution/assignment-solution.ipynb 提供了一套可直接对照的完整参考实现而8-Reinforcement/2-Gym课程则承接本作业的结论进一步把相同思想迁移到 Gym 环境中处理连续状态空间——完整学习路径可沿8-Reinforcement/1-QLearning/README.md的 Navigation 与课后资源继续深入。【免费下载链接】ML-For-Beginners12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all项目地址: https://gitcode.com/GitHub_Trending/ml/ML-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考