单元四
第14课 游戏里选最高分动作——奖励与动作选择

一、任务目标
根据每个动作的累计奖励,选出当前最好动作。
二、知识点短列表
- 动作:智能体可做的选择,如左/右/跳。
- 奖励:告诉“好不好”的信号;可累计。
- 策略:如何根据奖励选动作;本课用贪心:选最高分。
- 函数「choose_action」 返回最佳动作名。
- 不能安全试错的场景,不要乱用强化。
- 本课若出现并列最高分,实现会保留先遍历到的那个动作(取决于字典迭代顺序)。
- 奖励可以是累计分,也可以是最近一次即时分;本课用累计分数字典。
三、机器学习在说什么
强化学习不靠事先贴好的分类标签,而靠与环境互动:做动作→得奖励→改进策略。本课把“改进”简化为:看当前分数字典,选分最高的动作。
贪心策略简单透明,便于小学理解“奖励驱动”。真正的强化还有探索(偶尔试低分动作)等,以后再学;先把接口与安全边界立住。
代码里 scores 是字典:动作名→分数。遍历找最大,记下对应动作名返回。
强化与有监督的关键差要说清:有监督靠“这张图的标签是猫”;强化靠“这一步之后加了 5 分”。没有现成标签,但有可感知的好坏信号,才考虑强化。校园里多数作业仍是有监督或规则任务,不要为了用强化而用强化。
安全句抄写:能试错、有奖励、代价可接受——三才满足再进入强化设计。缺一,就换方法。
四、相关积木怎么用
scores = {"左":1, "右":5}表示累计奖励。- 用
best_s is None or s > best_s找最大。 - 迷你例子:函数「choose_action」 →
右。
走查:输入 函数「choose_action」 → 输出 右,因为遍历时右的分数 5 大于左的 1,best 被更新为右。若加入 "跳":9,则输出变为跳。
想一想:过马路能不能用“撞了扣分、平安加分”来训练行人?用本课安全标准答是或否,并写半句理由。
奖励表实验:先用左 1/右 5 得右;再只改跳=9 得跳;再把所有分改成一样,观察返回哪个键(依赖遍历顺序)。三次实验记录在案,证明 choose_action 读的是表,不是猜动作名。安全题答案必须是“否”。
强化两句:环境给奖励,策略按奖励选动作。本课贪心选最高分键;奖励表变则最优动作必须变,写死 return 右会在换表时露馅。安全三问:能试错?有奖励?代价可接受?一否即禁用。
要点串讲:强化靠奖励信号而非分类标签;动作可选择;choose_action 贪心选最高分;不能安全试错则禁用。本课过关标准:能从分数字典选出最优动作,并举一个校园禁用强化的例子。加练:把“跳”的分数改成最高,确认 choose_action 跟随变化——策略依赖奖励表,奖励表由环境与记录产生。
五、操作步骤
六、解题思路
任务:根据每个动作的累计奖励,选出当前最好动作。 先想清楚:输入是什么、处理后得到什么、屏幕上应出现什么。
本课主要用到:屏幕输出。
- 1明确任务「根据每个动作的累计奖励,选出当前最好动作。」:运行后你希望看到什么结果(文字、图形或计算结果)。
- 2用「打印」积木把结果说出来,确认屏幕上出现预期内容。
- 3找出重复动作,用「计数循环/遍历」积木写成循环,少抄几遍。
- 4写出判断条件:什么情况下走 A,什么情况下走 B。
- 5把可复用的一段动作做成函数,主程序里调用它。
- 6对照参考积木(或代码)跑通后,只改一个参数,观察结果如何变化。
流程示意(可对照左侧文字)
七、图形块功能讲解
本课用到的 Mixly 图形块均已在前面的课讲过。请直接对照编程练习搭积木;若有遗忘,回到该积木首次出现的课页复习。
即时验算:{"左":1,"右":5}→右;把跳改为 9 后应选跳。过马路场景回答“否,不能乱试”。分数表变而返回值不变,说明写死了动作名,必须重写遍历比大小。
best 初始化用 None:第一个动作先当冠军,后面更高分再替换。说清这一句,才能解释为何空字典不能选动作。安全题标准答案“否”写入课堂记录。贪心策略:永远选当前最高分键。
八、课堂练习
先完成两道正误判断,再做其余题目;选出后点「检查」。
判断:过马路也用“试错扣分”来学;或选动作时不看分数乱点。
判断:只在可安全试错任务用强化;用 choose_action 选当前最高分动作。
选择:游戏通关 AI 常靠试错加分 →
判断:过马路不能乱试,不适合乱做强化学习。
判断:奖励是告诉动作好不好的信号。
判断:本课贪心策略选当前最高分动作。
选择:先贴标签再分类 →
九、知识点讲解
- 能用自己的话复述:输入是什么、按什么规则变、输出应怎样。
- 练习时改一处、看一处,确认现象和概念对得上。
先弄清本课输入与输出,再进编程练习对照现象。
十、编程练习
用下拉列表切换题目;下方 Mixly 默认显示图形化积木。请在 Mixly 工具栏点「运行」;「检查」读取 Mixly 代码自动判题。
参考代码(对照抄写到下方 Mixly)
def choose_action(scores):
best_a = None
best_s = None
for a in scores.keys():
s = scores[a]
if best_s is None or s > best_s:
best_a = a
best_s = s
return best_a
print(choose_action({"左": 1, "右": 5, "跳": 3}))
正在载入编程环境
正在载入 Mixly 图形化编程环境…
十一、本节小结
你现在能实现 函数「choose_action」:从分数字典中选出当前最高分动作,并说明不能安全试错的场景禁用强化。step,返回新位置与即时奖励。