在2020年“高教社杯”全国大学生数学建模竞赛(CUMCM,简称“国赛”)中,上海交通大学电子信息与电气工程学院(简称“电院”)计算机系高晓沨老师指导的学生张嘉乐、赵文滔、刘哲恺获国赛三大奖项之一“知网研学奖”(比例0.0024%),这是上海交通大学首次斩获该奖项,也是上海交大继2018年获得最高奖项“高教社杯”(获奖团队:刘一鸣、王超玥、赖鹏程;指导老师:高晓沨)之后再次获得国赛重要奖项。这支队伍的三名成员均有丰富的数学建模比赛经历,下面就让我们来认识他们一下吧!
(左起:赵文滔、张嘉乐、刘哲恺。2020年12月5日摄于同济大学)
一、逐年迭代的数模之旅
张嘉乐是上海交通大学电院IEEE试点班计算机方向的学生。故事还要从上海交通大学的“致远荣誉计划”说起,该计划是学校为了培养基础科学人才而开展的理科实验班项目,高考招生后,在校内二次选拔前10%的学生组建班级特别培养。致远荣誉计划最早包括数学、物理、化学、生命科学、计算机科学五个方向,后来又创立了工科项目(简称“致远工科”),而张嘉乐就在入学时被选拔为致远工科中的一员。为了增强不同学科学生之间的交流,致远学院为一年级新生组织了郊游联谊活动。就在这次活动中,张嘉乐认识了一位计算机方向的同学邀请他和另一位物理方向的同学共同参赛,三人一起参加了高晓沨老师组织的数学建模培训营。
高老师的数学建模培训营自从2013年开展以来,连续取得突破性成绩,培训营不断壮大。暑假期间,他们队伍在高老师的培训营中参加共五十多小时的讲座培训,小组内3人交流学习超过20小时,形成十余个专题的学习资料。
********************************************************************
赵文滔也是上海交通大学电院IEEE试点班的学生。他第一次参加数学建模竞赛是2019年国赛,他的同学邀请他组队参赛,那也是他第一次听说数学建模比赛。经过简单调查,他认为这是一项非常有趣的学科竞赛,并且有助于培养一些重要技能,比如用数学知识和编程能力解决实际问题的能力、团队合作的能力以及论文写作的能力,因此他欣然接受了同学的邀请。
当时他们队伍三人完全没有比赛经验,也不知道学校里有数学建模培训营,于是就自行在网上找了一些讲解数学建模的资料,用来准备比赛。这些资料基本上是各个大学建模培训的课件,往往缺乏细节。在没有讲解的情况下他们的学习效果并不好,很多概念看了之后印象不深刻,例题解答也没看明白。但即便如此,赵文滔还是耐着性子把搜集到的资料看了一大半,了解了许多数学建模的方法。
在那个暑假,赵文滔认为自己犯的一个错误就是花了太多时间学习理论,忽视了编程技能。直到比赛前两周,他才学习建模需要用到的编程语言MATLAB。由于缺乏经验,在面对内容繁琐的编程语言教学讲解时,他也不知道如何挑选学习重点,所以没能迅速掌握MATLAB编程的核心能力。到了比赛的第一天晚上,他使用MATLAB处理数据时就遇到了麻烦,不得不现场学习相关知识,浪费了不少时间。
比赛过程中,赵文滔和一位队友共同承担了建模和编程的任务。他们选择了A题,这是一道物理题,需要编写模拟程序进行仿真,搜索最佳策略。他们通过独立思考加合作讨论的方式构建出了解题模型,然后就进入到编程实现他们想法的环节。编程时,他需要不时地学习一些繁琐的语法规则。在调试代码时,对语言不熟又使他要用很多时间来排查问题。 当时他队伍中写论文的同学对于论文写作并没有做好准备,很多东西也是现场学习的,队员之间的沟通也不充分,导致没能阐释清楚建模思路,更无法在论文中凸显亮点。最后他们跌跌撞撞地完成了比赛,并未取得理想的成绩。
赵文滔直言自己的第一次参赛就是打酱油,但重要的是把各种各样的错误都犯了一遍。通过反思自己的不足,他知道了以后应该怎么做来避免再次犯这些错误,也明白了大学中一年的课程远不能提供数学建模所需的知识,还需要继续努力。想清楚了这些,他也就坦然接受了这样的结果,准备再接再厉。
在接下来的一年中,赵文滔和张嘉乐一样学习了概率论与随机过程、数据结构与算法、凸优化等课程,编程和数学应用能力都有很大提升,再加上之前的经验,他信心满满地参加了2020年的国赛。这次参赛的准备中,有了高晓沨老师举办的数学建模培训营的助力,赵文滔感到能够快速理解建模知识。队伍三人每周坚持组织的两次交流会也让他特别训练了编程能力,在暑假的时候实现了许多算法。交流会同时让大家增进彼此的了解,找到高效的沟通合作方式。
********************************************************************
刘哲恺是上海交通大学机械与动力工程学院“钱学森班”的学生,专业是机械工程。他一共参加了三次数学建模比赛。第一次参加比赛是2019年国赛。当时正处于大二刚开学,仅学过基础课数学分析和线性代数的他只是抱着试一试的心态参加了比赛。他和两位机械与动力工程学院同专业的同学组队,当时的分工是编程,于是他在2019年暑假期间自学了Python和Matlab。由于掌握的数学工具有限,他们在建模的过程就遇到了很大的问题,最后堪堪完成了论文,没有得到理想成绩。
但通过这次比赛,他在学习的过程中编程能力有了极大提高,同时对数学建模也产生了浓厚的兴趣。 有了之前比赛的经历,刘哲恺决定继续和张嘉乐合作参加今年的国赛。
********************************************************************
今年国赛从9月10号下午18时开始,比赛过程从一开始就非一帆风顺。他们先分散在图书馆中分别阅读A、B、C三题,在一小时后相聚讨论选题。前期的充分准备积累带来的一个副作用就是三人都对自己阅读的题目有思路。赵文滔想选A题,张嘉乐想选B题(设计穿越沙漠小游戏的策略),刘哲恺想选C题。他们又花了一小时各自查找资料来争取说服全队选自己最先研究的题目。虽然B题的资料是最少的,但张嘉乐非常喜欢这一道题,并且分享了自己在一年级暑假参加学习编程综合实践课程的一段经历。这门课是程序设计和数据结构的后续进阶课程,其中的一次算法考试中,题目是玩一个塔防游戏,出题人给出了游戏的代码,要求学员在五小时的考试时间内设计输入游戏策略,游戏得分就作为考试得分。在这场算法考试中极少有人能够实现启发式搜索等优化算法,但游戏经验丰富的他凭直觉最后也得到了和最优解相近的结果。张嘉乐觉得这道B题与当时情况很类似,即使想不出好的数学方法也能凭经验给出一个结果,同时他还承诺尽快把游戏程序写出来让大家一起玩,即使没思路也不会无聊。他对这道题的热情和数学建模相关的丰富经历最终还是说服了两位队友。
当晚张嘉乐就开始设计游戏程序,到凌晨完成了两百多行代码的编写和调试,次日一早三人就用这一程序来试验各种思路,相比手工计算就大大提升了效率。对于一般的数学建模题目,完成编程之时往往已经胜利在望,但这一次,挑战其实才刚刚开始。队伍三人在比赛的第二天愉快地玩了一上午穿越沙漠小游戏,尽管获得了一些还不错的游戏分数,但如何在数学上证明这是最优得分呢?要严格说明这一点,除非能够尝试所有的策略。虽然确实可以设计算法让计算机自动尝试所有策略,找出得分最高的一个,但经过分析,所需的时间是远超出比赛时长的。
有算法基础的张嘉乐很快就想到了对于这种情况应该用动态规划算法,于当天晚上实现了程序代码并做了一些调试和优化。这一基础模型在之后成为了整个论文的基石,相应的程序衍生出十几个变种,在附录中占了一百多页。
动态规划基础模型的建立只代表三个问题中第一问的完成,而比赛时间已然过半,论文还进展缓慢。由于没有参与这一问的编程,赵文滔和刘哲恺对第一问的模型理解不太深入,写论文较难表达到位。对此,张嘉乐是早有心理准备的,他明白选择了编程也就选择了写作,要向队友讲明白自己的思路,让写作手达到与自己相同的理解水平还不如自己动笔。因此,尽管对于模型和程序还有很多改进的想法,他仍然在最后24小时放下程序,回到写作的位置上,从头梳理思路,确定论文的整体框架。
在队友建模的过程中刘哲恺整理了结果。有更多作图经验的他负责了整篇论文的可视化工作,使文章的结果表达更直观,可读性更好。在动态规划模型的建立基本完成后,刘哲恺对第二问逐渐有了思路。随着第二问开始题目的难度进一步增加,之后的问题也不再有精确解。在完全没有现有理论和模型的情况下,刘哲恺根据之前自己玩本题目游戏的经验以及和队友的讨论,想到了用数据分析的思路来解决问题。他想到了利用统计的方法解决问题。他还创造性地想到运用等效替代方法,通过数学推导,大大简化了问题的复杂性。最后他完成了论文第二问的撰写。由于问题的特殊性,刘哲恺在没有成熟理论支撑的情况下根据自己对题目的独到理解完成了第二问的解答,对问题处理的一些方法和细节得到了评委老师的好评。
由于B题的三个问题层层递进,如果每一问都需要等到程序给出结果后再开始下一问的建模就让时间显得捉襟见肘。赵文滔在比赛前中期就对此有所预感,主动承担起了最困难的第三问任务。此时第一问的动态规划模型还没有给出最后结果,第二问的统计模型还只是雏形,他就开始筹划第三问的博弈论模型。
三人对这一问需要的博弈论知识都只是略有耳闻,赵文滔需要在两天时间内完成基本概念、方法的学习并应用到当前的问题中。在之前比赛中锻炼的搜索资料和自学能力就发挥了作用。他迅速找到了相关的英文资料,提取自己所需的概念、定理,计算出了结果。
在比赛的最后一天,知识技能的充分积累让他们爆发了惊人的潜力,三个人同时建模、编程、写作。最后完成了28页正文和100多页的代码。这次参赛经历可以说是一波三折,跌宕起伏,令人难忘。
二、多轮凝练的经验体会
1. 组队方式:
数学建模的成绩不仅是个人能力的体现,更是团队默契配合的结果,如何组队、分工和共同学习也是大家非常关心的问题。“团队成员间的熟悉和理解对比赛至关重要。”刘哲恺说,“首先是组队,我们队伍三个同学都是致远荣誉计划工科的同学,赵文滔和张嘉乐又是同一个专业的同学,因此我们相互都比较熟悉。刚接触数学建模的时候以为队伍里专业背景不同更容易有新思路,其实成员之间的熟悉,沟通的愉快顺畅对于激发灵感可能更为重要。”
2. 比赛分工:
在比赛分工方面,由张嘉乐负责整体写作思路和工作计划,全员共同参与建模、写作阶段,也分工完成查资料、编程、可视化等具体工作,在整个比赛阶段让每个人都保持充实的工作状态。不简单按照建模、编程、写作来分工,而是具体问题具体分析,这其实对于组织管理其实提出了更高的要求。谈到团队的组织管理,张嘉乐在几次数模竞赛当队长过程中也有很多收获,他借鉴了很多高老师培训营的组织技巧方法,比如每次小组交流都需要形成会议纪要文档,整理建模知识按照原理、代码、应用, 模拟考试和比赛尽量留下记录方便经验总结等等。尽管只有三个人,但在制度设计上,他们俨然已经为更大的团队打下了基础。
张嘉乐对于写作和队长这两个角色的结合也有自己的体会:“刚接触数学建模的同学可能以为建模、编程、写作三个分工中写作部分是体力劳动,但我认为主写作的同学核心任务是确定整体思路,提出有用的问题来推进全队的进度。”
其实张嘉乐写的字数不一定是最多的,但他会搭好整个框架让我们一起去填,这个确定思路的工作相当关键。”刘哲恺如是回忆比赛中的情形,“国赛到最后一天,虽然我们的程序部分还有些问题,但嘉乐果断放弃编程而是来重新组织编排我们的文章,改完后整体的完整性和逻辑性确实强多了,然后我们依照这个框架一起把内容填上,让文章看起来像模像样。”
3. 赛前学习:
赵文滔:“暑期学习对于比赛具有重要意义,在学习方法上,听讲与阅读结合比单纯看书有效,组队共学比个人自学有效,也要注重实战经验。我们参加了高晓沨老师举办的培训营,平均每周上三次课,每次课大约2小时,我们从课堂上学到了很多平时学不到的与建模相关的数学知识。我们小组做得非常好的一件事就是每周坚持开两次组会,大家会在组会上交流课后学习的成果,以及分享如何用代码实现课上学习的一些算法。我们在学习理论知识的同时,高度重视把理论与解决实际问题相结合。在比赛前一周,我们参加了培训营举行的模考,这次模考让我们团队完整地体验了从选题、分析到解决问题、撰写报告的过程,帮助我们找到了合适的沟通合作方式,提升了小组成员之间的默契度。通过假期的努力,我们储备了丰富的知识,并在比赛前调整到了最好的状态。”
4. 选题考虑:
能够在数万队伍中脱颖而出,不仅需要长期的准备来争其必然,还在于选择合适的题目来把握偶然。说到选题,张嘉乐直言能够选到这个喜欢又擅长的题目是一种幸运:“选这个题我既是一时兴起又是准备已久。当时我一看到题目是做一个游戏AI,网上没什么可查的,几乎是要自己从头来探索和实现,自由度很高,可写的内容也很多,一下子就很有兴致。整个比赛过程中一直有事可做,参赛体验很好。”
三、回首前望的收获感想
一段旅途的结束也是下一段旅途的开始,知网研学奖团队的同学们并不会在此停下前进的步伐。“一方面,我们希望把数学建模传承下去,因此也参与到高老师培训营的工作中,建设资料库,分享经验。也是用实际行动表达对高老师以及培训营数模前辈们的感谢。”
12月10日,刘哲恺、张嘉乐在交通大学数学建模培训营进行经验分享和模型讲解
另一方面,数模之旅可以算一次缩减版的科研经历,因为我们完成了从选题到提出自己的想法解决问题再到论文写作的整个过程。几次比赛可以算是为我们打开了科研的大门,而现在我们已经到了开启科研旅程的时候,所以接下来我们会全力以赴地进入到学科最前沿的探索中,去发现有趣的问题,继续运用数学来享受解决问题的过程。”
(2020年12月5日摄于同济大学。左起:赵文滔、刘哲恺、张嘉乐、高晓沨)