2019 美赛 MCM A 题总结

2019 年数学建模,从 1.25 到 1.29 这 4 天零 3 个小时的时间里,我们组三人一行合作,顺利完成了 A 题『真实世界的虚构龙』的建模。整个过程收获很大,主要是这几个方面:

  1. 合作。这次的合作非常成功,写作、建模、写代码三人齐头并进,少了任何一个人都是不行的。
  2. 建模。如何建模,如何查找文献,吸收前人的思想,以前我很少考虑,这次从学长身上学到了一些经验。
  3. 写代码。从这个学期学习机器学习、随机过程时只是会用一下 numpy 的矩阵计算,用 matplotlib 画简单的图,到现在 5 天基本掌握 numpymatplotlibsympyscipy 的核心思想,运用自如。
  4. 数学。这学期学的数学(机器学习、随机过程)让我对数学有了更深刻的认识,现在通过数学建模,这些认识更加深刻。

前期准备

不得不说,前期准备真的非常重要。

我们组一共三个人,另外两位是大四的学长,他们参加过 2018 年美赛,因为去年做的不好,所以想弥补这个遗憾,找到了我一起参加比赛。虽然两位学长已经保研,参加美赛并不会对保研加分有什么帮助,但是出于对数学建模的热爱,还是选择参加比赛。和这么负责、爱建模的学长做队友,真的是我最大的荣幸。

因为两位学长参加过美赛、国赛,对数学建模有了一定的经验。总结去年的问题之后,我们将前期准备定位了如下的任务:

  1. Z 学长阅读 《正确写作美国大学生数学建模竞赛论文》,学习写作的相关知识,写作是美赛最重要的环节,因为我们最终要交的是一份 pdf 的论文,而不是代码,不管模型建得多么好,需要用简洁明了的语言表达出来。
  2. C 学长比较忙,一直忙于毕业设计,没有分配什么任务,不过学长建模的功底已经很强了,也看了不少文章。
  3. 我是新手,所以要学习的东西比较多。主要是看算法、LaTeX、LyX、画图、matplotlib 使用、读 UMAP 上的获奖论文等等。后期因为各种事情没能坚持下来,有点遗憾,不过准备还算充分。

我们前期所做的工作,都存放在 upupming/2019-MCMZPinjun/paper

就拿我准备的 LaTeX 和 LyX 来说,之前没想到会在附录里面贴上自己的代码,不过因为之前学习过 LaTeX 如何贴代码以及 LyX 如何引用 .tex 文件,所以最终节省了很多时间。

还有 matplotlib,我比赛之前特意准备了一个仓库 matplotlib-demos,看了一篇很长的 tutorial,所以之后比赛的时候画图效率较高。

当然,我也有现学的,比如一些 LyX 如何插入链接型的 BibTeX 引用、SymPyMaxent 如何使用等等,这些是我们没有考虑到的,这些本身也很难预见。我在 Maxent 上花费了很长的时间,不过最终还是理解了,而且对我们的论文做了很大的贡献。我们应该做到准备充分,但平时自己的时间确实有限,只需要做到关键点就行了,比如 LyX 的 tutorial 肯定是要看一遍的,对 python 未接触过的包要知道它的存在,有快速上手的能力等等。

我们比赛之前进行了一次 模拟,做出的结果在这里。结果不重要,但是我们为之做出的准备很重要,我们在模拟中学到了:

  1. 模拟之前总结了去年的失误,结合 O 奖论文提出了新战略:从第一天就开始写作,直接写英文而非中文,检查非常重要,不能提交结构组织错乱的 pdf 文件。
  2. 使用 GitHub + LyX + 壁虎通(后来换为 teamviewer) + 黑板进行高效协作
  3. 磨合大家的之间合作(写作+建模+写代码),对比赛进度把控好
  4. 调整好生物钟,中午睡午觉。学会定外卖,我们三人每天 8:00 在我的宿舍见面,一直待到 23:00 之后,中间不去食堂,就是为了节约其中的时间。

写作

  1. 写作要尽量简洁。
  2. Results 里面非常显然的结论也要指出来,把读者当『傻瓜』。除了分析结果,还得与自己的模型相呼应。
  3. 我们的语法水平比较弱,只要意思说明白就行,不追求句式错综复杂,但是一定不能有任何错误。
  4. Grammarly 在语法错误的检查上帮了不少忙。

合作

在整个比赛过程中,我几乎花费了 85% 的时间在写代码。而模型的构建基本上是由 C 学长来完成的,要不是学长耐心地解释公式中每个变量的含义,我会寸步难行。对建模的细节,我至今有一些还没有去深究,但是思想已经知道了,细节又何必深究呢?对于写代码来说,还是最终的公式最重要。在写代码的过程中,我也提出了很多细节上的问题,这些问题在建模人的眼中几乎是很难看到的,所以写代码对建模起了一个『校正』的作用。两者相辅相成,缺一不可。

还有我们特意将 LyX 项目分成了很多子文档,减少大家的编辑冲突,效率大大提升。

我们每天都会开会,尽量让每个人的想法都能够被其他人知道,这是我们做出的最重要的决策。看似浪费时间的讨论,实则加快了大家的效率。

建模以及数学知识

拿到题目之后,我们用 2 个小时阅读完,之后讨论了很长时间来讨论如何建模,应该做什么、可以忽略什么。然后我们才开始查找参考文献。讨论的过程非常重要,虽然看似需要很多时间,其实是可以避免一个人单干进入思维误区,相比之下会节约更多的时间。

之后就进入了我们查文献的环节,这个过程很重要,直接决定了我们后续具体实施时的方案路线 。两位学长看文献的经验比我强很多,能够抓住重点。他们刚开始主要是看一些硕士论文,这些硕士论文往往细节详细,通俗易懂,我们一看就能看到自己是否能够用到其中的哪些点,当觉得比较靠谱的时候,我们再去查阅相关的英文文献做详细的考证。2 小时之后,我们交流并确定了模型的几个大方向,龙的生长、需要的能量、对环境的影响等等,后续就是加东西了。

后续建模的过程中,还是有很多文献要阅读。两位学长的数学功底真是令人佩服,模拟的时候对矩阵操作的熟练程度就让我大开眼界,正式比赛的时候,符号如此之多的式子、积分等等,在他们看来,都是信手拈来,我也是学到了不少。感觉这个学期学的那些机器学习、随机过程里面的数学都是最基础的数学了。随着以后的学习,在数学方面应该也会更加深入吧。

写代码

写代码的能力的提升空间确实是永无止境的,我在 5 天的时间里写了近一个月的代码量,参见 upupming/dragon,感觉对 Python 的掌握又更加深入了一步。

在最开始, S 型曲线的求解顺畅无比。后来要模拟环境条件,就一直在鼓捣 Maxent,那个东西是学者用的,所以看起来比较费劲,又缺乏生物学方面的相关知识,开始花费了一个晚上加一个早上的时间硬是没搞明白。后来转到 Dragon Hunting Algorithm 之后,做完了再回过来看时却发现,一切自然就通了,还是得感谢这篇文档。可能是因为 Dragon Hunting Algorithm 写的比较顺利,对自己的效率大大提升,所以后来就一口气解决了 Maxent,也可能是先前看得多,写 Algorithm 的时候消化得比较充分吧。刚开始看 Maxent 的时候就一直非常纠结,生怕这个模型自己用不到,看懂了也是浪费时间。这里有两个非常重要的启示:

  1. 不要一直关注一个东西,不会的时候放一放,说不定某个时候灵感就来了。
  2. 使用现成的大型软件有一定的风险,要懂得权衡,因为可能并不符合自己的模型。

论文分享

我们的论文已经整理好并且开源,在 https://github.com/upupming/paper ,大家可以下载来编译一下, LyX 用起来真的很不错的。

pdf 下载链接:https://github.com/upupming/paper/raw/simulation/build/1911426.pdf

小事故

我们论文交出之后到了 31 号 11:00 还是显示未提交 (not yet received),当时还在坐火车的我们很着急。不过最后通过邮件与 mcm@comap.com 联系,对方工作人员秒回,最终帮我们解决了这个问题,这一切就真的算是结束啦,等待 4 月份出结果吧!

20190201113631.png
20190201113302.png
20190201113328.png
20190201113407.png
20190201113429.png
20190201113454.png
20190201113510.png

如果大家邮件接收出现问题的话,也一定不要着急,要及时跟组委会联系解决问题。

一些链接

  1. https://github.com/upupming/2019-MCM
  2. https://github.com/ZPinjun/paper
  3. https://github.com/upupming/paper
文章作者: upupming
文章链接: https://upupming.site/2019/01/29/2019-mcm-summary/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 upupming 的博客