网络知识 娱乐 数模竞赛|数学建模比赛该如何准备?

数模竞赛|数学建模比赛该如何准备?

作者介绍:苗枫,华中科技大学管理学院18级博士研究生,本科时全国大学生数学建模国赛一等奖,并多次带队获得美国数学建模竞赛一等奖

下期预告:如何更有把握获得国/美赛一等奖

上一期中有同学询问关于国赛一等、二等以及美赛O、F、M奖的含金量排序及获奖难度问题,这里详细解释下这些奖项的评分过程,然后大家就可以大致明白啦。

一 关于国赛

首先,国赛中,当9月中旬国赛论文提交后,各个省会互评论文,比如湖北省试卷交给山东组委会评,山东省试卷交给山西省组委会评。各个省会选出一批优秀论文来递交给国家组委会评选国家一等和国家二等。需要注意的是,每个学校参评国赛一等的队伍不超过5支,参评国赛二等的队伍也不超过5支。参评国赛一等的结果可能是国赛一等或者二等,参评国赛二等的结果可能是国赛二等或者省赛一等(注意国赛一等或者二等都会有省赛一等的证书)。这也是为什么每个学校国赛一等奖不会超过5支,一等和二等加起来不会超过10支的原因了。

二 关于美赛

再说美赛,美赛的评奖机制是当比赛结束后,首先试卷会在中国区参与评阅,评阅的教授为中国高校教授,评阅过程为打分机制,满分7分,3分以下为S奖(成功参赛奖),3-5分为H奖(二等奖),这部分试卷将会被留在国内,5分以上试卷将会被送往国外参与评审。然后在国外的评审过程中有一个国内教授一个国外教授一起评阅,达到5.5分会被评为M奖(一等奖),其余会被打回成H奖。然后在M奖中再次评选出大约30篇左右评分最高的论文参与O奖(特等奖)和F奖(特等奖提名)的评选,最终会产生约12篇O将,其余为F奖。

Ps:之前说所国赛、美赛获奖难度是按照各个奖项获奖比例而来,就难度排序O大于F大于国一大于国二大于M,但美赛和国赛考察重点也不相同的,这一点在本文后半部分会做重点说明,且二者在不同学校也有着不同参赛规模,所以奖项高低也没办法做出精准的判断,因人而异了。

建模、编程、论文该学点什么

建模、编程、论文是数学建模中三个非常重要的板块,一般而言同一支队伍中三个人要各自分工负责三者之一。一支好的队伍中,每个人对三个方面都有所了解,又有一方面特别精通。

建模

建模是数模比赛的基础,是写出优秀论文的地基。对于初学者而言建模是最难的部分,它过程主要包含建模思维的培养、常用模型的熟悉、以及实际比赛的锻炼。

就我自己的经验来谈谈我是如何开始建模部分的学习的,最开始就是看教材,这里有两本十分推荐的入门教材——姜启源《数学模型》(第四版)以及司守奎《数学建模算法与应用》

《数学模型》的学习

其中《数学模型》偏向于基础的数学建模知识,实用性不强,包含一些最基础的数学模型,是一本能把高中应用思维逐渐向大学建模思维逐渐开阔的教材,并且难度不大,适合大一、大二刚刚接触建模的同学阅读,能为初学者打开学习数学建模的大门。

简单说说我是如何学习这两本书的:

我自己学习这两本书时,每本书读了三遍。

第一遍,粗略过教材。最开始接触数模是在大一时候,没有抱着多么大的抱负去准备,《数学模型》这本书最开始只是把它当做一本故事书来读,大概三天左右就浏览了一遍,知道了什么是数学模型——就像一道比较复杂的应用题。在这期间有很多看不懂的地方就跳,基本没看数学相关的东西,但是在自己脑海中搭建了一个有关建模的框架,受益匪浅。如果本身数学功底不是很好,当初第一次接触就开始细究一些比较晦涩的概念或公式,可能会读不下去。

第二遍,精致过教材。这个时候已经对“什么是数学建模”这个概念有了模糊的认知,那么接下来就认认真真的读课本,一行一行读。不需要从宏观角度去看,只要用心理解每一行每个字的意义,上下文的含义,就像在高中读课本那样,实在不会或者没有头绪的可以跳过去,但是要做好标记,方便以后基础扎实了再回头看。这个过程是最费时间的,也可以学习到很多很多新的知识(虽然可能学过一两天就会忘掉,但是下次拿起他的时候你能很快想到自己之前是怎么看的怎么想的这就足矣)。

第三遍,框架构建。这个时候需要我们有一定的宏观认知能力,要学会做分类,重在思考轻于细节。带着问题去第三遍读课本:这个模型是什么?它能够解决哪些问题?适用于什么样的环境?然后在最后做一次大的梳理,看看自己究竟学到了什么,哪些地方还是很模糊。

《数学建模算法与应用》这本书我是在后面才接触到的,也是很不错的一本书,值得一看。

此外,在学习建模的过程中多问自己几个问题。

第一:这个模型是什么?这个问题对于初学者而言是最难的,很难用系统语言来描述一个模型,但这个过程是必须的,因为你只有把它用自己的话表达出来,才能真正的理解这个模型,在比赛过程中快速与队友、指导老师交流。提供一个小方法:每看完一章节,给队友讲一讲你对这章节内容的看法,你学到了什么,你觉得什么有价值,它的创新点在哪里。如果你能把这一点表达清楚,这一步你就做的非常棒了。

第二:它能够解决哪些问题。这个问题是最重要的,很多人学完很多资料但是看到题目后还是没有什么思路,很可能就是因为这一点。多想、多练、多看、多做总结,经验是最好的老师。

第三:模型的具体操作步骤怎么实现?也就是操作层面上的问题,这个模型可以用什么软件实现?参数怎么调?有没有现成的代码?每一步的操作是否清楚?要做到什么程度呢——我们无需记忆模型具体的步骤但是要对它很熟悉,保证在需要用到这个模型时能很快把它融入到自己的题目中。融会贯通是很难的,这个过程里会遇到很多意想不到的、纸上谈兵时看不到的困难,具体的操作要受你的系统环境、软件版本、时间限制等各种方面的现实考验,没有什么捷径,只有平时多练,多做,才能临场时最快地找到解决的办法。

《数学建模算法与应用》的学习

《数学建模算法与应用》基本涵盖了常见的数学建模算法理论,是学习各类型算法不可多得的好教材,虽然里面部分内容和现在国、美赛题目的热门考点稍有脱节,但是也是学习数模算法的很好的入门教材了。

在学习《数学建模算法与应用》这本书时,因为它更偏向于算法层面,我的建议是先看完《数学模型》后再来读这本书。走到这一步说明你已经有了一定的基础,那么就按照自己的方法来看吧,没有固定的方法,适合自己的才是最有效率的。

我说下我自己阅读这本书时候的一些体会:一定要对每个算法的作用和领域有清晰的认知和判断。

例如规划,包括线性规划、目标规划、整数规划、非线性规划、动态规划等等。他们的应用范围不同但总是解决类型相同或者相似的问题的,是最常见的数模问题。

例如优化算法,能解决问题的特征是问题要求某些量达到最大或最小,比如销售量最大化,而且我们可以人为地控制某些变量,比如原材料的投入量。只要是存在可控制的量和要达到最优的目标,这就是一个优化问题。优化问题由很多现代优化算法,而且往往是和规划结合在一起,密不可分。

但是话说回来,学数学模型,其实看哪本书都可以,一本书只是一个线索。学到比较深入的地步时候一本书上的内容是不够用的,往往需要读者以此为引导去查找相关资料。

学习教材的阶段过去后,进入实战环节。一是看论文,二是模拟赛。

看论文,看往届优秀的获奖论文——国赛二等奖及以上,美赛O、F奖。(这里不推荐看美赛M奖论文是因为M奖中论文质量参差不齐,很大概率会遇到带有误导性质的文章,得不偿失)。

拿到论文,首先看对应的题目,时间充裕的话不妨自己先去拿着做着试试看,大概一天左右就会遇到瓶颈,发现这道题的难点在哪里,这时候再去看看别人的论文时如何解决这个问题的,就会有一种恍然大悟的感觉。

看论文一是看思路,而是看行文结构,例如图表如何做如何数据可视化,文章逻辑如何安排,问题结论如何表示,摘要如何书写等。

魔鬼藏在细节中,要努力使得论文尽善尽美,更好地表达自己的思想。

模拟赛——数模前最关键的环节

重要的事情说三遍,一定要做模拟赛,一定要做模拟赛,一定要做模拟赛。

我身边斩获数模大奖的,90%以上都做过一次以上的模拟赛。

尝试去做往年的真题,如果参加美赛就找美赛原题(英文版),如果参加国赛就找国赛真题。先不要看别人已经完成的,尝试自己解一下,然后参考一下他们的,看看他们是怎么从问题中抽出变量、做出假设、结合现实约束列出方程。

可以看一些经典问题建立模型的书籍,按照自己的思路求解一遍,这样不断做,接触各种类型的题,体会其中建立模型的思路。

具体做题的时候,可以根据问题本身的现实(物理)规律建模,也可以套用已有的经典模型,也可以在经典模型的基础上根据问题适当地改变其中某些变量的表达式,也可以对比两种算法建模对问题求解的效果等等。

编程部分

编程,也就是我们口中常说的编程码代码,由于我自身专业原因,不是专业写代码,但是也学习过不少的编程语言,如c、c++、python等。但是个人认为正常的编程和数学建模中的编程还是具有比较大的区别的。数模中的编程不同于做项目和ACM(国际大学生程序设计竞赛),对编程者的敲代码能力要求其实并不高。实际上,这里的编程更准确说是对软件的使用,包括对、MATLAB、Lingo 、Spss 的使用,还有别的专业软件的使用。编程这一块并非一定是专业码农,软件学得比较快就可以。当然 Matlab 和 Lingo 都不是图形界面,需要命令行输入,有编程基础的同学对这一块儿学起来可能会更加容易上手。此外我认为,会算法要比会编程更重要(一般而言算法学得好的编程不会很差)。司守奎的《数学建模算法与应用》中算法和代码讲的都很好。

Matlab、lingo、Spss是三款必备的软件,matlab是很多工科学生的必修课,常用来解决复杂的科学计算,lingo是用来求解(非)线性规划和目标规划非常有用的软件,Spss可以用来解决数据标准化,数据处理等问题。

此外还有一个小技巧——工具箱是个好东西。比如如果想用遗传算法计算优化模型结果,可以直接使用遗传算法工具箱,而并不需要为了凸显编程能力自己动手,除非对算法设计有自己得独到之处(很多并不要求提供代码附件)。当然可能在某些地方需要编程,比如用Matlab 做个元胞,写个优化算法。但是这部分的编程也都是建立在对已有工具的使用上,而非从底层码起。总而言之,数模比赛对编程要求能力并不高,能够做到对程序的模仿运用便已足够。

有几点个人学习数模编程的经验总结:

1、自己的程序文件要整理好,方便查找和修改:

编程过程中经常会出现对程序的修改和测试:有时是因为程序本身存在问题,有时是因为建模方法改变,有时是因为对模型进行了进一步改进,有时是因为要处理的数据发生变化……因此会产生一些不同版本的程序代码。文件的命名用英文和数字,而且最好形成一种统一的格式,能够“顾名思义”,方便了解是什么时候、哪次建模过程中使用的何种模型以及同一模型的哪个版本。

2、代码要整齐易读,写好注释:

除了方便自己读和修改,也方便队友对程序进行了解。需要注释的地方如:开头可以写一下程序的作用、所需数据格式、程序仍存在的问题等;重要的变量假设、Flag、累积量;每个模块的作用;关键的步骤和函数;常常要进行修改调整的语句……变量假设、函数名称也要易于识别。

3、利用好程序资源,在已有的程序上进行修改可以提高效率:

常用算法的源程序是很好找的,从代码网站、博客或者算法书上总能找到相关的编程案例,自己以前编写的程序也能拿来用而且用起来更顺手,所以不用执着于一定要自己从头到尾地编代码。平时多看一些案例,看到好的代码就收藏起来,分类保存好。 4、函数和工具箱的使用:

软件中常内置有功能丰富的函数和工具箱。有时我们会发现软件中意想不到地刚好存在能实现所需功能的函数,因此编程前可以先在网上搜一搜有没有这样的函数,没有的话再自己写,写好以后也能存起来以后用。工具箱的使用要看情况。有的算法不用工具箱实现比较好,用自己写的代码更灵活和利于修改,而且对于算法的原理也更清楚;依赖工具箱而对算法的解释不清楚的话可能会让论文失色,而且工具箱可能不利于大量数据的反复运算;有时候用工具箱可能更好,主要是对一些算法原理比较简单的运算过程可以减少编程、提高效率,而且有时候用工具箱求解出的数据格式或图表样式也比自己编程做出来的更整齐好看、看起来更专业。

5、积累程序调试的技巧:

对于自己的程序自己要做到完全把握,清楚来龙去脉,出现问题时快速找出问题所在。以MATLAB为例,利用好Workspace和Debug,对于代码节点和每个变量的数值变化能清楚了解。程序运行出岔子常常是因为以下一些原因:数据读取格式不对;变量行列数不匹配;循环出错,在“有些命令放在循环内还是外?”“从什么地方开始循环?”“什么时候停止循环?”“行列式循环时数据怎么对应?”这样的地方出问题;调用函数时变量格式不对;运算式写错,如括号丢失;画图时数据读取出错,如xy搞反。

6、通过编程制作好看的图表:

用excel能做一些图表。编程实现虽然麻烦一点,但能做出很多excel不能做的图。有时候在编程做图的过程中也会为了使图表更好看而不断调试。要熟练掌握一些通过编程画图的常用函数,包括二维图、三维图。除了折线图、直方图、拟合曲线图等一些常用数据统计图以外,还有聚类分析图、树状图、有限元分析图等一些和具体算法相关的图。把代码积累起来,方便展示数据时使用。推荐几款绘图软件:R、亿图(网站)、Eviews等。

总的来说,编程不是很麻烦的事情,主要就是要熟悉:基本语句,数据格式、调用和输出,基本运算符号,基本函数,软件常用视窗和命令。在此基础上能不断研究和积累新函数、新算法。关键还是要建好模型,在假设好变量和确定好要用的公式或算法后,编程就是用代码语言把它重述的过程,是自然而然的后续工作,是建模和论文的中间过渡且与两方都有重叠。 写作

论文写作是比赛获奖至关重要的一步,建模和编程都需要论文来表达,能不能把内容思想结论准确的传达给评委就是写作的同学需要做的事情。

写作中要注重两点。一是要保证论文整体的逻辑性很强,保持前后贯通:论文的各部分的应当是顺接或相互照应的关系,而不是毫无关联的独立部分。国赛题目会有几个小问引导论文展开,而美赛则是一个大问题整体,要做到论文脉络清晰,就要对题目做合理的拆解。二是令人信服,模型结果可以不理想,但是呈现于论文上的一定是有理有据、能够自圆其说的建模过程与模型结果。除了写作的这两点外,论文的排版与插图也很重要,这两个是论文中最直观的。排版大多数推崇用latex,但是latex的弊端就是论文只有一个人可以进行排版,队友只能围观,而word可以队友一起做。至于是不是latex得奖率更高,wps一样拿奖。(更推荐三个人都用office同一版进行写作排版,并且公式采用mathtype)

写论文一定要要深入理解模型。不要因为自己负责写论文就把建模和求解的任务全交给队友来做,造成写论文者初期很闲、后期赶时间的情况。要尽可能地解放发展生产力,团队中的每个成员都要有大局观。

关于写作,推荐比较好的准备方式是多阅读优秀论文,学习别人的行文结构,然后写作的同学一定要记得多学点图表制作方面的内容,非常重要。

作者:苗枫,华中科技大学管理学院18级博士研究生,联系邮箱:460019724@qq.com

排版:程诗童,华中科技大学管理学院17级本科生,联系邮箱:1711156776@qq.com