在数模竞赛中负责编程的同学需要学习哪些知识？
三次数模国奖路过，曾经单挑过两次国赛（第三次有一个负责编程的同学给予我很大的帮助）。稍微谈谈编程这一块的经验吧，现在临近美赛，时间也不多了。最高票回答适合长时间准备(至少有一个从校内赛到国赛的周期，我就谈谈只剩下一个月不到应该如何准备编程这一块工作吧)。 编程的同学，主要是把建模同学的思想给生产出结果，也就是输出一定的东西，可以是图，可以是表可以是数据等等。当你随便打开一本数模书(比如司守奎老师写的《数学建模算法与应用》这本书)，你会被里面的Matlab，lingo等代码吓住，尤其是以前不怎么编程的同学来说更为如此。所以数模三个部分，很多同学会觉得编程非常难以上手。 其实，负责编程的同学，并不是说比谁代码写得长，谁代码写得好，而是应该为建模的同学提供一个结果（只从数模拿奖（功利的角度出发）无论结果的好坏，甚至是否有结果，在比赛即将结束的时刻，都应该给建模队友一个所得过去的“答案”），所以可以在做一些数模问题的时候，用一些较为“傻瓜”的软件，比如SPSS，这个软件可以解决统计学中的很多问题，比如2012年的国赛葡萄酒评价问题，这道题就是使用SPSS的代表。所以说，以其说是会编程，不如说是应该会使用相关软件，让所建模型输出一个不错的结果。还有作图软件Origin，在进行一些简单的作图时候，可以使用Origin而没有必要去使用Matlab进行画图，一般情况下，在问题不太复杂的时候，是没有必要使用Matlab的。还有一款软件叫做Visio，这款软件是画流程图的利器，比如说写完一段程序附上程序框图，或者用系统动力学解决一个问题时画的系统流图，得到的效果都是非常棒的（PS：初次学习建模的同学，无论如何一定要在Matlab上面下一点功夫，即使没有办法掌握，也需要知道如何修改别人的优秀程序，为我所用）。 如果真的想短期学会一个真正需要编程的语言，还是选Matlab吧，虽然在短时间之类，你是无法把这门语言学到精通，但是只要知道Matlab的语法规律，以及一些基本功能，一些基本的工具箱就足够了，这里推荐两本书，一本是《Matlab完全自学一本通》这本书上面基本上包含了可以用得到的功能，至少是基础功能。在数模上面，可以司守奎老师写的《数学建模算法与应用》这本书，一般常用模型的代码都给出来了。还有一个最关键的是，比赛前，多看看别人写的优秀论文。不管是国赛还是美赛，都有着优秀论文集，看看别人写的论文还有别人的代码，争取找到一些灵感。 在比赛的过程中，如果什么地方卡住了，一定不要蒙着头想，应该即使去相关论坛查找一些使用技巧，当然Matlab自身的帮助文档也是挺不错的。 多说一句话，LaTeX是写作排版用的，虽然也是类似于编程语言，不建议编程的人去学习，应该去鼓励写作的同学学习LaTeX，编程的同学应该和建模的同学好好合作，合力把比赛题目拿下。 看到数学建模老司机（国一优秀论文获得者，深圳杯获得者，SAS大赛冠军）的回答了，SPSS在这几年的国赛的赛题（2014,2015,2016）当中确实比较难使用了，问题基本上都是纯物理类问题（2014航天，2015球面天文学，2016受力分析）而且SPSS还有一个非常强大的竞争对手SAS的存在。至少是国赛A题，一般都是需要自己踏踏实实建模，最后使用Matlab实现。但是，A题由于过于考察建模的实力，因此一些非理工科的学生往往望而怯步。 R，Python以及SAS作为数据分析时代的新兴语言，大家可以有空的时候学一学。由于现在有一个SAS数据分析大赛（由汇丰银行赞助，SAS公司主办）搞的还不错，大家可以学一学SAS然后去这个比赛中练一练手。参加过蛮多的比赛，还是发现SAS举办的这个数据分析竞赛（尤其是决赛）给我的参赛体验非常地好。 更新一下，看了下面国一大佬说的有关程序的事项，其实，如果单纯从拿奖的角度来说，某些问题，尤其是国赛B题， 美赛E、F题对于程序要求不高的情况下，可以适当地使用现有的模型理论对具体问题进行分析。但是，从2014年开始每一年国赛A题基本上都很难找到可以直接套用的模型（虽然2016年的系泊系统在知网上面有很多现成的研究结果，但是往往不是太复杂，就是和题目分析的背景有点不太一样），这也是我前面说为什么对于没有经历过理工科训练的学生很容易望而怯步的原因。所以，我觉得如果你想做好A题，在近些年A题越来越需要自己建模，自己使用一定的软件实现的大环境下，建议有一定改编现有程序的能力。 -----------------------------分----------------------隔---------------------线-------------------------------------- 看到留言有提问，现在考试基本上快考完了，我也就来回答一下吧。 首先第一个问题是：美赛E、F题应该怎么做？数模三天（美赛是四天时间）需要做一些什么？ 首先我来回答一下第一个问题，美赛E、F题应该怎么去做。由于美赛E、F题是今年2016年新增加的题目，因此不论对于谁来说都是第一次涉及这两类问题，依据美赛官方COMAP的说法，美赛E题的主题一般是有关环境科学的问题，美赛F题有关政策的问题。从统计的结果来看E题是最受中国人欢迎的ICM的题目，而F题较为冷门（具体的统计数据在我另外一个回答的问题中： 。首先，还是把E、F题的问题的翻译粘贴过来吧（虽然我知道知乎洋文好的人多得很呐）。 E题的翻译： 我们的地球会受渴吗？ 问题说明： 下面是F题的翻译： 上面两大段是E和F的翻译，仔细看起来，阅读量非常大，这也是ICM问题的特色。与国赛相比，MCM/ICM这两个方向的比赛中的ICM更加接近国赛风格。细心的小伙伴会发现，ICM的题量比国赛题量大很多，至少有5问需要解答，而且由于原版是英文版题目，我想应该有一定数量的小伙伴在拿到题目之后就会开始抓狂。不过，不需要太紧张，大概在1~2个小时之后，就有相应的数学建模论坛（比如数学中国），就会陆陆续地发出A~F题的翻译。但是，中文翻译题目在理解上还是会与英文原版题目翻译存在着一定的差距，因此在看完中文翻译之后，了解大体意思之后，还是应该回归英文原版问题。 下面开始具体分析E题： 之前去浙江大学有一些事情，因此没有对文章进行更新，抱歉啦大家。 基本上上述第一点的问题，从竞赛的角度来说，和我们没有啥关系，基本上问题的提出都是由于竞赛组委会提出的。所以赛前只需要祈祷今年的题目尽量都符合自己的胃口，或者背景知识在自己所学的专业范围之内（由于国赛有A、B两道题，而美赛有A、B、C、D、E、F六道题，因此美赛比国赛容易碰到自己上手的问题，国赛则题型比较固定，A题一般是理工科问题，B题一般是社会性的问题）就好。 第二点，模型的假设，这个工作其实不太好做，最好先阅读一些前人的文献，看看别人建立的模型大概了解一下一个模型应该保留什么应该舍弃什么，还必须结合自身的水平对模型进行假设，比如今年的国赛A题，你对系泊系统锚链的受力分析假设完全要结合自己物理的实际水平进行建模，高中水平（文科生或者经管生），普通物理水平（大多数理工科大学生的水平），理论物理水平（物理专业学生或者理科对物理学要求较高的学生）或者工程力学的水平（最适合做这道题，一般是机械类土木类专业的学生）。所以，在模型假设的时候一定要量力而行，不要因为看了几篇高大上的文章就以为自己掌握了别人至少十几年的专业素养，如果这样就太NAIVE了。只有做到自己认为恰到好处的模型假设（就是自己和自己的队友可以把基于假设的模型比较完整地建出来，并且给出一定的结果）那么只要结果有理有据，一般都是可以拿奖的。 第三点，建立数学模型。从功利的角度（竞赛拿奖的角度出发），自己在国赛三天中或者美赛四天中完全独立地建立出一个不错的模型（也就是说纯原创模型），对于大多数选手来说（包括我自己在内， 这种级别的大神除外，对于老司机来说，建模是他最为看重的一个项目了）是一件较为复杂的事情，也就是说，基本上是不可能做到的。所以，我们需要有着快速学习的能力，也就是说，我们需要去快速阅读其他人做的工作（这个问题其实在前面说过了），但是千万不要逞能，读一些研究的深度远远超过自己的认知水平的文章（个人觉得绝大多数的障碍都是自己的数学水平不够高或者很多数学手段没有学造成的结果）。大概自己看得懂一二的文章，可以思考一下别人的方法，对这一个领域的研究手段以及主要研究的问题有一个大致了解的水平（在四天或者三天中对这个领域达到掌握的水平基本上是不可能的），这样就可以使用相类似的办法，构建出一个贴合比赛问题的模型出来，进而使用。 第四点，这一点是较为重要的一点，通俗地说就是模型的求解。也就是说，需要把题目中的一些问题给出具体的答案，如果是评价类问题，就要给出好坏，如果是要得出一条曲线去预测东西，那么就要画出一条曲线，并且说明结合这个曲线以及曲线上面的一些信息，如何预测出什么什么样的结果（记住预测的东西一定要结合实际情况，比如社会因素或者环境因素）。还有一些求解具体参数的问题（构建微分方程或者差分方程进行求解的问题），还有优化类问题，比如线性规划或者最优线路的问题。比赛中如果只建立了模型，而没有给出具体的结果，是比赛的大忌（国赛比较严重，美赛到还是有一定的余地），所以，在比赛的时候，请一定交代程序员（或者你自己就是程序员），一定要出一个结果，不管这个结果的好坏。当然，如果距离比赛结束还有很多充裕的时间，那么请尽可能地提升自己的结果质量，这个问题和第五点就有一定的关系了。以上四点是数学建模竞赛最最基础的四点，也就是说，论文上面只有包含这四点，才是一篇较为完整的论文（能做好这四点，国赛有希望国二，美赛也有希望拿到M奖（至于以上。。。我就不知道了））。 第五点，这一点是属于锦上添花的一点，如果你在写完前四条并且发现时间还非常充裕（至少半天时间），那么如果你想冲击国一或者美赛M奖以及以上的奖项，那么建议你还是做一下这个工作，最好看看自己的结果是否存在比较大的误差，如果有对照数据，则可以使用对照数据拿来检验下模型的合理性（如果发现不太合理，则根据时间的需要决定是否需要更改原有模型，如果有时间则可以对现有模型进行一定的优化，如果没有时间，则可以把这个写入模型的评价中去，还是建议多写模型的优点，少写一些模型的缺点，如果参赛队员写太多缺点，自己否定自己，那么这样的模型还有什么价值呢？）。另外可以对模型做一个灵敏度分析，就是看结果在一定微小的扰动下是否会出现结果出现很大的波动，一个较好的模型应该是有着较好的稳定性或者说是可靠性的，比如可以做假设检验，结果拟合优度检验等等方案进行分析。2015年美赛A题O奖中的上了UMAP杂志的文章就是做了模型灵敏度的分析。 第六点，这一点如果从参赛的角度来说，就没有多少必要考虑了，当然，可以将有关模型的应用写入模型的评价中（一般模型评价分为三点：模型的优点，模型的不足，模型的推广，所以应用部分一般写入推广中去）。当然，如果实在对这个赛题十分感兴趣，是可以把模型真正应用起来，如果模型做得足够出色，至少可以拿去正规期刊发表论文，参加一些其他竞赛（比如节能减排、挑战杯等），或者实现真正的经济效益。 由于读了刘老师的书，所以稍微写了一点有关建模的基本步骤，这也算是给E题开了一个头（貌似今晚完全没有谈到E题。。。。），基本上这也算是给数学建模当中的建模部分写了一个总结，先这样吧。E题的坑有空继续写（2017.1.12 2:29AM） 继续更新吧，已经有大概半个月没有更新这个贴子了。虽然美赛已经比完了，但是我还是继续更新下去吧。第一问在之前基本上都说了，使用马尔可夫链进行预测。问题二就是需要在问题一的基础之上定一些比较具体的指标出来，这个主要还是需要根据自身的能力来具体定一些为何会存在缺水问题的指标出来。可以选择的指标主要有降雨量，河流流量，生活用水，工业用水等作为指标来衡量。对了，第二问需要选择一个地方来进行分析，后面几问也基本上选择这个区域来进行分析当地的水资源情况。所以，我建议大家，以后遇到这类问题的时候，选择尽量好找数据的区域进行分析。比如今年2017年A题有关于非洲修建水坝的问题，由于赞比亚是一个比较偏远落后的国家，因此不太方便找到一些数据，所以建模比较容易蒙蔽。貌似也就Google地球是一个不错的工具，至少可以分析一下大坝附近的海平面高度。因此，选择比较发达国家的缺水地区是一件比较正确的事情，比如美国。当然，选择自己国家也是不错的选择，但是看联合国缺水地图上，中国并不是一个严重缺水的国家「难道是我当时分析有误么？中国主要缺水的两个区域是西北以及胶东半岛，我自己选择了西北的陕西省作为分析的区域」。第三问就是在第一问，第二问的的基础之上继续使用第一问的模型进行预测，编写相应的马尔可夫预测的Matlab代码，这个在司老师的那本《数学建模算法与应用》中就有，只需要稍微修改一下代码就可以放进题目来使用。建议在把数值预测出来之后使用Matlab画出水资源供需压力曲线出来，并且做一下拟合曲线，这样的效果会好很多。因为，只有直观的图表才能让评委老师迅速挖掘出结果，然后给予你高分。对Matlab生成的图表做一定的解释，这样一篇文章就写了七七八八了。下面就是第四问了，第四问画风一变，和三问围绕的预测问题不一样，这一问开始基本上就是优化调度问题了。第四第五问主要的问题就是能否找到一个解决问题的办法，我建议的大家可以参考2013年MCM运水的问题，我觉得参考一些O奖论文的办法应该就问题不大了，而且，貌似我记得题目本身也说了可以参考2013年美赛的题目。今年2017年也是这样类似的问题BCD长得差不多，其中B题还是2005年MCM题目的加强版本。所以，我都有点觉得COMAP与其出这么多的题目，不如与国赛一样，出几道比较好的问题。今年的题目水准甚至低于去年很多。EF题基本上都是评价类问题，非常容易变成吹水的问题，或者不知所云。 我有空继续填坑，大家可以把数模相关的问题写在评论中，我会不定期地把大家的问题写在回答中。不论是建模的问题、编程的问题、还是写作的问题，我有空都会耐心解答。 参考文献: [1] 刘保东, 宿洁, 陈建良. 数学建模基础教程[M]. 北京: 高等教育出版社, 2015.