宋一凡
环境保护与安全工程学院核安全工程专业
大学生活即将结束,回顾几年的经历,数学建模竞赛留给我太多的回忆。虽然数模竞赛已经远去,但至今看到听到“三天三夜72小时”时,精神还会为之一振。在要告别数模竞赛的时候,想写一点自己零零碎碎的思考和总结,并给以后参赛的学弟学妹一点建议。
1. 关于我的数模之路
大一从学长口中知道了数模竞赛,就想参加,自学了姜启源的《数学模型》,但校赛时,队友不给力使第一次校赛不了了之,至今仍然遗憾大一时校赛未能入围;大二时,和本院的两个同学组队,比我高一级的闯哥给了不少经验和资料,经过暑假的培训和多次模拟赛训练,12年国赛拿到了湖南赛区的三等奖。
13年寒假,留在学校参加美赛,偌大的宿舍楼空无一人,好不凄凉,南方湿冷的冬天让我这个北方人冻得难以忍受,搞完比赛回到家时已经是腊月二十七夜里,美赛S奖使我很失落,也从中找到了自己的很多不足之处。
因今年考研,本不愿参加国赛,但两位新队友的盛情邀请让我不忍拒绝,于是重新组队,再战国赛,一雪前耻,最后拿到国家一等奖,为大学的数模之路画上一个圆满的句号。
从大一到现在,关于数模的比赛,热身赛、校赛、模拟赛、国赛、美赛,大大小小不记得参加过多少次,也不知道熬过了多少个“72小时”。建模、程序员、写手,三个角色的工作我都认认真真做过,饱尝里面的酸甜苦辣,一步一个脚印走来,最后得到一个不错的成绩,收获颇多,感触颇深。
数模给我打开了一扇窗,窗外的世界带给我不一样的精彩,而不仅仅是拿几张证书,加几分综测。外人看来,数模痛苦、费人,而我感觉数模自由、快乐。尤其是竞赛结束,早上八点交卷的时刻,经过三天三夜的努力,队友通力合作,从第一天的一筹莫展,到最后一天的顺利解决,疲惫、兴奋、满足、急切、不安,很多的感受一时涌上心头,那是只有真正参加比赛的人才能体会到的快乐!
2. 关于数学建模竞赛的作用
在做一件事情之前总会去思考做成这件事情有什么好处,这样的心里再正常不过了。而数模竞赛这种需要投入很多时间和精力的事情,更需要好好决定下是否要参加。指导老师说:数模“费时间,强意志,提能力”,我以自己的经历来讲下数模竞赛的作用。
2.1 对自身能力的提高
参加数模竞赛可以提高自身能力,这一点是毋庸置疑的,全国数模竞赛组委会的网站上都有写“一次参赛,终生受益”。可能一两次的比赛看不出来,经过多次竞赛的锻炼,与没有经过数模竞赛的人相比,就会慢慢感受到这种细微的变化:
在遇到一个问题时,你会更多地去关注其内部的数学规律;在问题比较复杂时,也会更快地找到问题的关键所在;在任务繁重时,你的工作效率会更高;在需要熬夜工作时,你的耐力也会好过其他人……
学习的很多专业课程,其整体思路和数模是类似的,数模的训练使你学习更快;对与科研工作,一次数模比赛的过程就是解决一个课题的缩影,二者在流程上十分的类似,数模也培养了你科研的实力;甚至是单单写一篇论文,你完成起来也更加容易……
指导老师说:有了数模的锻炼,毕业设计可能不过是一个星期的事情,甚至只要三天三夜就能搞定。有一点夸张,却也说明了数模的巨大作用。
2.2 对考研和保研的作用
今年7月我去中国科学技术大学参加夏令营,面试环节中,我和面试的三个老师并没有谈物理、加速器等专业相关问题,而是讨论了数模中所用到的“神经网络及其MATLAB实现”,最后顺利通过了面试,拿到了“提前面试通过函”这张免死金牌,这在很大程度上归功于在数模竞赛中积累。
由于南华大学的档次不高,考研复试时往往受到歧视被刷。而一位拿过美赛S奖的学长说:“我在面试中差不多是免试的,其功劳可以说是归功于我的数模历程的”。
2.3 对工作的作用
有数模的经历,应聘时拿几张数模的获奖证书,在找工作时候,一定更受青睐,我认识一个机械的学长,毕业时由于数模的经历拿到一份很好的工作。
就我而言,在参加数模之前,计算机方面是个彻头彻尾的小白,word都玩不转,两年数模经历,我长了不少知识,而且结交了很多学长、朋友,他们给我的影响和帮助已经远远超过了数模竞赛本身。
3. 关于组队
两年参加国赛,我是在两个不同的队中,而且我也见到一些由于组队不当而造成比赛失利的情况,在组队方面也有一些感受。
想要拿到好成绩,一支优秀的队伍是必须的,三个队友的个人素质不容马虎。不论特长与能力,至少要对数模有积极性,能够踏实做事,认真负责,队长分配的任务必须按时完成;准备、培训到比赛的整个过程要能完整参与,不能半途而废;有学习的热情,对新东西要有比较强的好奇心和求知欲;学习能力强,能比较快地接受新知识;时间观念要比较强,能够高效率工作。
我很推荐不同学科背景的同学组队,今年参加国赛时我所在队伍的三个人专业分别是核技术、核安全工程、预防医学,分别是偏理、偏工、偏医学,在分析问题时候不同知识结构更能碰撞出好的思路。如果三个人来自一个专业或是一个学院,平时上同样的课,学相同的知识,就会形成类似的知识结构,假若题目恰是三个人共同盲区,不就死掉了。
借用一点队长的见解,三个人中最好有一个思维比较“跳”,脑海里往往有一些新奇的东西,经常闪现出一些火花,在论文中形成亮点;单有这个人也是不够的,还需要有一个人踏实一点,防止前面那个思维飞得太远,不切实际,做不出结果。这样的队伍完成的论文就会感到有张有弛,既有条理的思路、严谨的推导,又有突出的亮点,有别与其他队伍。
队长很重要,虽然只是三个人的队伍,但是队长也如同军中之统帅。队长要决定任务的分配,把握思路的走向,规划时间的安排,责任重大。
队友之间不能有沟通障碍,要相互尊重和信赖,如果在比赛的过程中队内互相掐架,怎能完成论文?
男女搭配,干活不累,此言不虚也。队中有妹子,必是极好的。
4. 关于分工
按照一般的说法,队伍中的三个人,一个建模,一个编程,一个写作。
建模的队友,要有比较好的数学功底,熟悉各种模型的适用条件,明白他们的来龙去脉;程序员要负责模型的求解,至少要会MATLAB,并有大量实战的经验;写手要把做好的东西以论文的形式完美呈现,有时候一篇文章行文流畅、思路清晰的作用甚至超过了建模本身。
比较好的一种组合是,每个人在自己负责的方面要精通,同时对其他两个方面有一定的了解。例如,三个人都要有各种模型的基本了解;要知道程序员实力如何,不能建立一个程序员没法求解的模型;三个人都要有一点写作的底子,自己做的工作自己写,可能比写手直接写更省时间,写的东西也更准确。
今年我所在的队伍分工大概是这样的,队长曾玉读核技术专业,思维活跃,总有新奇的点子,主攻评价类模型,负责论文排版、写作、图形图形处理方面的工作;吴文博读预防医学专业,善于统计和SPSS软件,主攻各类统计模型,英文好,搜索文献能力强;我读核安全工程专业,去年参赛时又做建模又做写作,今年做程序员,主攻理工科背景的模型以及各类模型的MATLAB实现,解决建模中遇到的各种计算机方面的问题。
分工虽是如此,但是并不严格:曾玉虽主要写论文,但是在各类模型上都有所涉猎;吴文博虽主攻统计,但其他模型也略知一二,所以可以把统计模型与其他模型很好结合在一起;我虽然是程序员,但也可以把自己做的工作完整写成论文。三个人能力互补,在遇到各类问题时都能游刃有余,不至陷入盲区。
例如在今年的国赛中,我们所做的题目是“车道被占用对城市道路通行能力的影响”,一共四个问题:前两问题是统计的问题,吴文博的长处得以发挥;后两问建立车流波动模型,需要物理知识和编程,正是我可以做的;我们做的工作写成初稿交给曾玉,她可以写成一篇高质量的论文。
5. 关于知识储备
数模竞赛所需要的知识太多,方方面面,难以理出个头绪。有些观点说,数模知识不需要学,比赛时候现学现用就可以。我并不同意这一观点。
我认为应该在准备竞赛的过程中尽可能多学,肚子里东西越多,看问题就越深,前期掌握了的东西,就不用在比赛的时候花力气去学,省下来的时间可以把文章作出亮点。我曾经看过2011年题目“重金属污染”的国家一等奖论文,深有感触,和我校那年参赛时的论文相比,国一论文中做得工作量至少是我校论文的两倍。如果不是前期的积累,哪有时间做这样多的内容,譬如论文中的“偏微分方程数值解”是不可能在比赛的几个小时内就学会使用的。
下面分别谈下各方面的知识储备。
6. 关于数学模型和算法
参赛者大多是从姜启源的《数学模型》开始接触各类模型的,我也是如此。这本书浅显易懂,是数模入门的好书,可以让你懂得什么是数学建模、建模的流程是怎样的、有哪些方面的模型、每种模型的总体思路。但是在实际参加比赛时,这本书的实用性不强,难以应对比赛中遇到的复杂问题。准备参加比赛,要对每一种模型和算法有更为深入的学习。
系统学习各类模型和算法,可以看《数学建模算法与程序》(司守奎,海军航空工程学院,http://wenku.baidu.com/view/fb7d696e7e21af45b307a845.html),俗称“算法大全”。这本书有900多页,涵盖了比赛中用到的大多数模型,而且每一种模型都有MATLAB代码,实用性较强,可以系统学习,也可以作为工具书查阅。
学习过程中,不必太过细究其理论,要着重考虑的是:基本思路是怎样的,可以解决哪些问题,如何求解,关键点或者最难解决的部分在哪里。
以下是我使用一些模型时的感受以及对学习的建议。
1)优化
各类优化模型永远是数模中的热点,各类实际问题的目标往往是使其达到最优,我的感受是,优化模型的建立和求解都是难点。
先说建模,在一个复杂的问题中往往分不清哪个是目标函数,哪个是约束条件,哪些条件是重要的,哪些条件可以忽略,明知道是一个优化问题,总是写不出优化的模型。再说求解,简单的模型可以借助LINGO软件编程求解,复杂的多维非线性优化模型还需要借助相关智能算法,选择的算法是否适用,运算效率如何,智能算法中参数如何确定,是否达到全局最优还是只求出了一个局部最优解,都是要仔细考虑的问题。
所以要多做练习,多看些复杂题目的论文,细细揣摩其中的思路,提高分析优化问题的能力。
2)统计
统计类模型非常重要,近几年,国赛数据量逐年加大,似乎也预示着大数据时代的到来,相关的统计方法和数据挖掘技术也渗透到数模之中,如数据处理、回归分析、假设检验、因子分析、聚类分析、通径分析等等,可与SPSS软件一起学习。
3)预测类模型
包括了回归预测、灰色预测、马尔可夫链、时间序列等等,选择合适的模型是关键。预测结果不好是很正常的,可以尝试多种模型结合,如时间序列搭一个神经网络,可以起到一定的修正作用。
4)评价类模型
评价类的模型大多有一些主观的成分在里面,能够自圆其说即可。大家的方法都类似,作出亮点才能吸引评委。例如某年国赛题目“上海世博会经济影响力评价”,一篇国一的论文就引入了了“Google搜索量的变化”这一评价因子,成为亮点。
评价方法包括模糊综合评价、层次分析法等等,大同小异。我认为主要问题在于权重,权重确定要合适、准确、让人信服,在生产实际中,往往采用专家打分的方法,但是在比赛中除了队友不能与其他活物打交道,权重确定只能通过查阅文献得来。
5)图论
图论是一个相对独立又十分难学的部分,第一次听图论课的场景至今心有余悸。但是图论的应用又是十分广泛的,很多题目归根到底就是一个图论题。例如2013年国赛的“拼图题”(B题),总体的思路就是一个“旅行商TSP问题”,只是又复杂了许多。
图论的学习重在程序实现,很多算法的程序是现成的,如kruskal算法的MATLAB程序,就不需要自己一点一点去敲,平时要注意相关代码的积累。
6)智能算法
随着数模的题目复杂度越来越高,求解难度越来越大,传统的求解方法在复杂题目面前简直不堪一击,学习智能算法是必须的。从最基本的神经网络和遗传算法学起,然后有模拟退火算法、粒子群算法等等,其应用非常广泛。
推荐《MATLAB智能算法30个案例分析》(MATLAB中文论坛系列书籍,北京航空航天大学出版),每种算法都用于一个实际的案例,并有详细的代码分析。还可以看“MATLAB中文论坛”的视频教程http://www.ilovematlab.cn/thread-22239-1-1.html。
7)实际模型
在遇到具体问题时,要在通用模型的基础上,查阅该学科的文献资料,选择有学科背景的模型,更有说服力。例如,11年“重金属污染”,评价污染程度时候,就要采用“地积累指数法”;13年“车道占用对交通流量的影响”,需要采用“车流波动模型”
数模中用到的模型还有很多没有说到,例如微分方程模型、数值计算、蒙特卡罗方法等等,学习模型是个长期积累的过程,要多学习,多应用,一个模型只有实际去解决一个问题并得到结果,才能算是真正学会。
7. 关于程序员
程序员的任务是把建立的模型用程序求解,还要解决比赛过程中遇到的各类与计算机有关的问题,下面分软件来谈谈如何炼成一个合格的数模程序员。
1)MATLAB
MATLAB的强大自然不必说,有人问我,做数模能不能不学MATLAB?我回答:除非你的C足够强,否则就老老实实去学吧。
学习开始,要打好矩阵运算的底子,在整个编程的过程中要有矩阵的思想,然后再分块分模型去逐个击破。平时练习中写的代码要及时保存,也要注意积累其他人的代码,定期整理,比赛时拿来就用,不需要重新写。
一定要有一本教程和一本函数手册,推荐《MATLAB语言实用教程》《MATLAB数学实验与建模》(马莉,清华大学出版社),《MATLAB函数速查手册》(邓薇,人民邮电出版社)。
MATLAB做图功能很重要,一定学好,论文中一张好看的图顶一大段话。
要善于使用网络资源,“MATLAB中文论坛”是个好去处。
遇到不懂的函数,可以查帮助文件,英文并不难,这是最准确的说明。
不要总写脚本,要学着写函数,提高运行效率。
MATLAB编程的方法和技巧,网上太多了,多看多学多交流。
2)SPSS
SPSS操作并不难,要与统计知识一起学习。由于涉及的知识比较多,可以将MATLAB和SPSS分给两个人去学习。
3)LINGO
在规划问题上,LINGO和MATLAB相比,编程简单,运算效率高。学起来也很容易,推荐参考书籍《LINGO和Excel在数学建模中的应用》(袁新生等,科学出版社,http://ishare.iask.sina.com.cn/f/60817679.html)。
4)latex
论文写作的软件,一般都选word,但是latex排本效果更好。尤其是英文排版上,与latex排出的效果相比,word的效果简直不堪入目,所以美赛推荐使用。Latex学习曲线陡峭,如果没有事先学好,匆匆使用,会带来很大的麻烦。找好模板,比赛前练习完整写一篇文章,比赛时就能应用自如。
使用Ctex中文套装即可,套装中的帮助文件是不错的入门书籍。极力推荐“Chinatex”网站的视频教程:http://www.chinatex.org/?page_id=218.
5)Excel
普通的数据处理,excel必不可少,如果有时间可以学习“excel宏和VBA”,但用处并不是特别大,它能实现的功能,都可以通过MATLAB编程实现。
6)各种图形相关的软件
VISIO作流程图,AutoCAD做工程图,Google sketchup做三维立体模型,photeshop或是美图秀秀做图形处理……这些图形类软件的简单使用需要掌握。
7)其他
Mathtype 写数学公式(使用快捷键,至少要会Ctrl+h和Ctrl+l吧);adobe acrobat 处理pdf;
文本编辑器,高手装13用VIM,普通至少要用sublime text或者notepad++吧,用记事本怎么对得起“程序猿”这三个字呢?
资料太多,推荐everything搜索文件,totalcommander整理文件;
8. 关于论文写作
最后拿给评委看的就是论文,论文写作的好坏及其重要。写手主要要解决两个问题:文笔和排版。
文笔:文章的思路要清晰,语言要准确简练,能够把做的工作清楚地写出来,需要有一定的功力。多看些优秀的论文,看论文的结构,如何引入问题,如何叙述模型,如何描述结果,如何分析误差,如何与实际联系,都要仔细体会。
排版:学习word排版可以看《word排版艺术》(侯捷),也可以选择用latex来完成论文(要慎重!)。主要的问题有字形字号页码行距,图形、表格的排版、配色,公式规范书写等等,很多问题都在细微之处,但是细微之处的毛病在评委看来就非常扎眼。在模拟赛中,最好拿一篇写好的论文给指导老师仔细修改,改正其中的错误;正式比赛前做一个模板出来,比赛论文直接往进套。
论文写作中最重要的是摘要的写作,在最后一天晚上,一定要空出几个小时仔细写摘要,三个人一起修改,里面的内容要字斟句酌,无一废话,主要的句式就是“使用什么方法,得出什么结论,解决什么问题”,而且要着重写出文章的亮点。
9. 关于优秀论文学习
学习往年的优秀论文很重要,就像练习英语阅读,也要泛读和精读相结合。
泛读的文章要看文章的思路,使用了那些模型,各部分如何衔接,文章有什么突出的亮点,那些方法是自己没有见过的,要拿来学习。
精读更为重要,要选出有代表性的文章拿来精读。精度不能仅仅局限在读,最好是三个人实战做一遍题目,找资料,建模型,写程序,得结果,分析误差,最后一定要自己拿出一篇完整的论文,不能只是从优秀论文中拿过来粘贴。论文写好再和优秀论文比较,就能看出差距,最好能和指导老师一起分析一下。有些问题和bug只有实际去做了,才能发现,早点处理掉,否则在比赛的72个小时里解决,影响心情,影响进度。
10. 关于模拟赛
学校的培训每年都会安排几次模拟赛,我的感受是一次模拟赛能够学到的东西比在平时10天学到的都多,同时也是队员之间相互了解相互磨合的过程。模拟赛一定要认真对待。
虽为模拟,但也要拿出实战的感觉来完成题目。如果题目不难,可以自行把时间缩短,来锻炼工作的速度。除了学校举办的比赛,队内三个人可以拿往年的题目来自己组织模拟赛,做完后与优秀论文比对。还有一些网络赛,可以进行练习。
不过模拟赛毕竟只是模拟,不要累坏自己,尤其是比赛前的那次,一次模拟赛死多少脑细胞,正式比赛时没有精神就不好了。
11. 关于正式比赛
前面的准备工作做得再好,等到正式比赛那天8:00公布题目时,也会有措手不及的赶脚。只要按照以往的节奏,一点一点做下去,三天三夜,是一定能把问题解决的。
最开始的审题非常重要,我们队的做法是题目出来后,打印稿每人拿一份,各自分析一个小时,期间并不交流,只是各自理出对问题的分析和基本的解决方案;一小时后,一起讨论,交流对题目的看法,同时确定选做哪个题目,并确定基本的思路和分工。某些队伍直到第一天晚上还在嚷嚷着选题,在他们白白浪费了一天的时候,我们已经完成了很多工作。
接下来就查阅文献,查阅文献的广度和深度,直接决定了论文的质量,通过文献的分析,调整思路,最终确定文章的结构和分工。然后,建模者和程序员开始建模求解,写手就可以开始写论文,搭起论文的整体框架,完成一些不太重要的部分(如问题背景)。论文一定要从最开始就写,不能等到把所有的东西全部搞定,到第三天才开始写,那样太过仓促。
第一天晚上,三个人都需要回去睡觉,好好休息,至少要睡六个小时。
如果进展顺利,到第二天晚上,基本可以完成建模部分和某些部分的求解。如果需要,第二天晚上程序员可以适当熬夜,把模型求解的结果弄出来;如果程序复杂,也可以放在第二天晚上跑。第二个晚上,如果进度跟不上,就不要回去睡觉了,后半夜眯几个小时就行;如果进度很快,第二个晚上也可以回去睡,为第三天晚上的冲刺保存体力。
第三天在前两天工作的基础上再做进一步的模型优化和推广,使之与实际情况更加吻合,或是有新的想法,插在前面的内容中。第三天的傍晚的时候,论文就要基本成型了,到晚上零点之前的时间,总稿,排版论文,最后的论文一定是队里三个人都要检查过的。
最后一夜是一定要通宵的,写摘要,改摘要,检查论文中的错别字,最后定稿,标好版本序号,别最后提交的是一个半成品。虽然8:00交卷,但是可以提前半个小时到一个小时交卷,防止堵塞现象造成提交失败。
比赛中队友之间的交流、分工和配合很重要,要防止出现做重复工作的情况,也不能出现一个时间段内有某个队友无事可做,这就需要队长的领导和协调。
比赛过程中注意文件的备份,尤其是写好的部分论文的备份。防止出现一个人电脑挂掉,然后就没有然后了。此外,最后有一台备用电脑,里面装好建模所需要的所有软件,以备不时之需,也可以用来跑一些花费时间较长的程序。
比赛过程中要保持三天高效率的工作状态,要吃好喝好,学校提供了一餐15元标准的免费饭菜,还有各种水果,最后一夜面包、泡面、咖啡、巧克力,三天过得还是蛮滋润的。
比赛结束后,不要把三天的文件放在删掉了事,万一获奖通知去答辩时,只留下一篇论文,还要再重新弄一遍。
12. 关于美赛
美赛和国赛相比,有许多的不同,网上有各种总结,不再赘述。其实,美赛获奖比国赛要容易一点,因为毕竟参赛队伍少,获奖率高,大概有一半能获二等奖以上。
美赛的评阅标准和国赛不同,美赛建模不需要太复杂,主要看思路是不是有创意。我参加13年美赛做“烤面包”的题目,用了复杂的三维传热方程,用有限元方法求解,弄的很复杂,还是没有受到老美的青睐。
英文论文的写作是个考验,一般采取的方法是找翻译,我们队找到了大学英语老师作为翻译,最后一天跟我们熬夜翻译,才算弄出论文来。我了解到,中国矿大也是这么做的,最后一天集中很多英语老师来翻译文章。
13. 写在最后
“数模伤身体,参赛需谨慎”,比赛真的很辛苦。每次比赛完后,总有脑细胞死伤太多的感觉,几天都缓不过来。亲眼看到一个胖胖的学长搞完一个暑假的数模后瘦了一圈,不失为一个减肥的好方法。
至今依然怀念暑假一起集训的日子,几十个参赛者无私分享,激烈讨论,交流方法,帮忙查bug,每天奋斗到深夜,真是一段激情燃烧的日子。
衷心祝愿母校的数模发展蒸蒸日上!
祝愿各位指导老师身体健康,工作顺利!
祝愿后起的学弟学妹能够获得更好的成绩!
告别数模!