通过虚拟机器人竞赛激励加州大学伯克利分校 (UC Berkeley) 的新生学习编程
作者 (UC Berkeley) Timmy Siauw
加州大学伯克利分校 (UC Berkeley) 的 Engineering 7课程 (Introduction to Programming for Engineers, 工程师编程介绍)., 简称为 E7,. 每个学期都会招收 400 多名新生。该课程主要为学生讲授一些在整个大学期间,以及工作中都能运用的编程技能。
E7 通过 MATLAB® 进行授课,已经有超过 15 年的历史。除了帮助学生们快速学习计算机编程的基础以外,对于学习如何运用数学模型和计算方法,MATLAB 也是一个非常理想的环境。在加州大学伯克利分校 (UC Berkeley),许多高级工程课程都整合了MATLAB,学生在 E7 获得的编程技能,都能在这些工程课程中得到运用和加强。正如一位教授所言,MATLAB 的一个主要优势就是能够对一系列工程学科的构想建立原型并进行测试,而不用担心低层次的编程细节,如内存分配等。
作为 E7 的主要助教 (TA),我最近和 Alex Bayen 教授合作,为课程增加了一些新的内容: MATLAB 虚拟机器人编程竞赛。与许多入门编程的作业不同,此竞赛为学生提供了良好的机会,使其通过解决开放式设计问题来展现创新精神和独创精神。此竞赛通过让学生以一种有意义的方式来应用编程规则,利用学生们喜欢竞争的天性,使他们全身心地投入到竞赛中,并且为得到满意成绩而加倍努力, 从而达到激励学习的目的。上学期的竞赛举行之后,导师们受到了此课程有史以来从未有过的关注度和好评,我认为这主要是由于将竞赛作为教学工具取得了成功。
做好基础编程准备
每周的 E7 课程包括教授主讲的两节一小时授课、由助教主持的一次讨论和两次两小时的实验课。我们极力鼓励学生在实验室完成他们的每周作业,或者在自己的电脑上使用 MATLAB 和 Simulink 学生版进行独立作业。
大部分学生来上 E7 课程时都不会编程,也不会使用 MATLAB。为了帮助他们熟悉 MATLAB 环境,并将 MATLAB 的使用跟他们已经学会的概念联系起来,我们在第一次实验课时将 MATLAB 作为一种高级计算器使用。
最先介绍的编程概念包括变量和函数。在过去几年中,学生发现难以准确把握变量使用。现在,我们很早将其引入并在整个过程中进行强化。学习变量和函数后,我们逐步介绍 MATLAB 中的分支语句、循环、递归和绘图。
尽早让学生学习如何编写函数,,这也是自动评分系统另外一个目的。在每次作业中,学生都要编写一个 MATLAB 函数,能够用给定的一组输入数据生成结果。他们向加州大学伯克利分校 (UC Berkeley) 基于 MATLAB 开发的自动评分系统提交作业。该系统用我们分享和没分享过的输入数据来测试学生的函数。自动评分减轻了助教繁重的工作量,从而有更多的时间来与学生互动。
然而最重要的是,实际上学生在用 MATLAB 代替 C 语言编程时,学习得更快,也会应用得更好。因为无需要担心低层次细节,如指针、内存分配、类型声明、预处理、编译或链接等,所以有更多的时间去探索实际的编程概念和实践。
推进计算方法
当学生们都精通编程的基础知识时,他们就开始编写机器人,授课和作业的重点也转移到计算方法。他们使用 MATLAB,完成线性代数、最小二乘回归、插值、求根以及数值微分与积分等作业。在期末作业中,他们计算常微分方程的数值解。
在课程的这个阶段,学生们开始学习到如何应用MATLAB 解决跨学科的工程问题。与此同时,他们继续深化对编程原则的理解,并使用 MATLAB 来构建自己的机器人。他们从第五周开始到学期末编写机器人程序,并在最后一周举行竞赛。
机器人竞赛规则
在机器人战斗中,两个学生编程的机器人在一个虚拟的地图上展开针锋相对的比赛,地图上有燃料箱和炸弹(图 1)。当两个机器人之间距离小于 5 个单位时,比赛结束,获得燃料最多的机器人获胜。在每个回合,机器人必须决定移动的距离和方向。在同一回合中,燃料根据机器人移动的距离而减少。机器人碰到燃料箱则增加燃料,碰到炸弹则耗尽燃料。
编写虚拟机器人程序
每组学生都需要使用 MATLAB编写机器人程序函数,并通过助教编写的主 MATLAB 程序来调用。机器人能完全进入游戏状态,也就是说机器人能知道每个燃料箱和炸弹的位置和大小,还知道它自己与对手的位置以及目前的燃料量。每个回合各函数调用一次;调用后返回 1x2 矩阵,该矩阵包含其下一回合的 delta-x 和 delta-y 值。燃料量消耗函数, 是事先给定的, 定义为 delta-x2 + delta-y2 + 2。学生的函数不允许保留上次游戏的状态,所有决定均基于当前游戏的状态。
基于如上几点简单规定,学生们可以自由执行策略。我们给学生们提供 MATLAB 代码用于在某地等待的机器人,还有其他四行代码,控制机器人的简单行动。我们还会将往届竞赛中优胜组的 MATLAB P 文件分发给学生们。学生们能以此为蓝本测试自己的机器人水平,但看不到对方程序是怎么编写的。
这场比赛竞争激烈,要获得最后的胜利必须投入大量的时间、精力和热情。最佳机器人程序,一般来说,都有 200 行到 250 行 MATLAB 代码。这些程序包含一系列复杂策略,例如预测其他机器人的行动路线,沿地雷改变方向迂回行动,诱导跟踪者触雷。很多学生在运用各种策略的过程中,对知识有了更深层次的了解,他们甚至能仅通过观察比赛中其他组机器人的表现,而对其底层算法进行逆向编程。
竞赛的收获
竞赛对于这门课程来讲,有几个高级的学习目标。学生能够学会如何进行团队协作,学会如何在长达一学期的项目中管理好自己的时间。因为他们的机器人函数由助教开发的战斗程序激活,所以学生们也会学习如何编写代码,并让自己编写的代码与那些看不到的他人开发的代码进行对接。
更重要的是,此竞赛给学生们提供了良好的机会和激励参与软件设计。设计是工程的基础,在我看来,仅开设一门编程课是不够的,因为编程课通常忽略了设计的重要性。在有限的要求和限制下进行软件构造,这让学生们亲身体会到迎战和攻克开放式工程难题的感受。
考试分数反映了他们对编程概念特别是变量范围和函数使用的充分理解。之前有位参加竞赛的学生告诉我,得益于此项竞赛经历, 他改变了职业规划,对计算机科学有了更浓厚的兴趣。我们满怀热情,期待已经参与和将要参与机器人竞赛的在读学生们日后担任我校的助教研究生。
2013 年发布 - 92154v00