[我分享] 数学建模MATLAB代码实战训练笔记-1:序

[复制链接]
qibbxxt 发表于 2021-7-22 00:36:52
作者:祁彬彬、马良

  • 写在正式内容之前


[高教社杯全国大学生数学建模竞赛]即:CUMCM,近年来在国内大学聚集了不小的人气,参赛人数有逐年上升的趋势,甚至数学建模比赛已经开始向中学阶段扩散辐射。一些高校对这项赛事的成绩关注度也在提高,甚至在一些特定的评价体系里,把这项赛事的成绩作为评估的参照选项之一。不过相比于它在简历中可能焕发出的光彩,这项赛事更重要的意义应当在于:历年来相当一部分赛题,无论在逻辑推理、模型抽象、论文结构组织与撰写,还是代码实现等方面,都对我国高校的本科生的基础能力提出了挑战,更不说为获得理想的名次,还具备团队合作,项目组织方面的潜在要求。因此各个高校的研究生院、用人企业单位等,无疑都非常乐于将上述能力真正达到相当程度的人才招揽至麾下。

但从一个刚刚从高中升入大学的本科生视角来看,想要在相对紧迫的时间里,经过训练而达到符合CUMCM数学建模竞赛要求,并堪能在实战中绽放光彩的相关能力,并非易事。培养建模能力,从没有什么直接看完藏诸于百度谷歌的某些“标准答案”,就能迅速走上康庄大道的热血桥段。

取得建模竞赛成功的原因可能很复杂,且因人而异,例如有些学生数理基本功展示,因此在推导和模型构造方面可以迅速适应;另一些学生也许在中学阶段就对算法、编程产生浓厚兴趣,或具备一定计算机方面的天赋,也可能在较短的时间内,掌握MATLAB、Python、Lingo等语言的基础功能;还有些学生擅于语言文字的表述,可以很快经资料查找和领会小组成员的意思,而写出漂亮的论文。以上特长都能在最终的论文提交中得以展现,但无论哪种情况,想真正取得理想的竞赛成绩,一个难以回避的问题最终都会横亘在每个建模小组的面前,那就是针对模型的代码方案与实施,通俗地讲,搭建出再好的模型,也要用程序快速算出结果,才有可能产生一篇合格的论文,否则,就很可能从数学建模变成语文建模,再转换为天马行空的胡编乱造。

想在一个差不多可以确定非常短暂的培训期内,训练出一定程度的数学建模MATLAB代码实战能力,我们并不建议进行所谓的“系统性”学习,为了建模,从认识MATLAB界面开始,学习`sum`、`plot`、索引、向量化、数据读写...,等一步步学会和掌握所有内容,再返回头打算把它用在数学建模里,估计大学已经快毕业了,更何况短短几个月,甚至几个星期内泛泛学到的所谓“基本命令用法”,绝大多数不会被直接用在数学建模的实际竞赛题目中,因为这些知识还没有经过恰当地加工和组合,或者说,还没有真正见过类似的命令、函数以什么样的常用组合方式,用在模型搭建的哪个部分。因此,建模培训阶段后期,最常见就是因训练没有效果,只好囫囵吞枣抄些带有:“神经网络”、“图论”、“遗传算法”等高大上字眼的算法代码,幻想能在实际赛题里,把这些代码生搬硬套在某些环节。这种看不到方向的黑灯瞎火乱枪打鸟,是建模培训期间,学习MATLAB的最大忌讳——因为代码训练针对性的严重缺失。

以数学建模为目标学习MATLAB,具有明确的目标以及明确的截止时间,和单纯学习MATLAB还有所区别:软件既为建模而服务,但达到一定熟练程度,代码的验证功能同样可以反过来影响建模论文的走向,两者间存在着相互促进的关系。学会自顶而下,认真而仔细地拆解某个成形且完整的数学建模代码方案可能才是更容易找到方向和兴趣点的方式,或以小组形式,或自行研究,无论如何都建议把一个完整数学建模历年赛题代码案例,从头到尾研究透彻。这样做有如下好处:

  • 一些基础命令函数的常见搭配组合,在Help的倒查过程中,参数意义,用法理解更深刻;
  • 一套完整代码,如何构思框架,怎样组织和安排子函数,能做到心里有数;
  • 核心难点的算法实现,一定会用到大量基础和进阶的代码技巧,揣摩过程中,即使暂时还写不出来,至少可以尝试看懂他们,即使看不懂,在查找资料的过程中,也会知道建模代码,在表述模型时究竟难在何处?这种带有明确指向性的学习,既是利用数学建模学习MATLAB,又何尝不是借助MATLAB窥得数学建模精义的难得机会?


当然,带着针对性学习编程语言,学习数学建模,这并不是什么了不起的秘密和诀窍,实际上,绝大多数曾在高教社杯建模方面取得成绩的高校,通常都会采用这样的方式来训练一届又一届参加数学建模的学生,只是多年累积,辅导体系里积累了相当多的成功经验和典型案例,这让后期的培训变得有更多回旋空间,可以针对学生的具体短板,做针对性的训练与辅导。但我们也应当看到,也有很多热爱数学建模,却得不到体系化学习机会的学生,会经常性地在自学摸索过程中屡屡碰壁,上演一个又一个“从入门到放弃”的悲情故事,其中一个关键原因,就是陷入了“建模水平不足 → 代码审美能力欠缺 → 无法判断|遴选恰当代码案例完成专项学习”,最后又回到“建模水平不足”的死循环。

没有真正合适的建模赛题完整代码方案以及深度剖析,作为一个数学建模系统学习和入门的敲门砖,可能才是导致很多同学,即使经过长期努力的钻研,然而水平依旧停滞,来年拿到题目依旧没思路、没代码,成绩多年无法彰显的核心原因。

鉴于这样的现状,我们打算为参加数学建模的在校大学生们,撰写一套以提高利用MATLAB在数学建模中运用能力的代码分析系列。这个系列中既有一些往年培训中的基础训练问题,也有历年各类数学建模竞赛中的赛题全真代码方案剖析,系列的每个专题,都只会针对某个关键问题,编写相关代码,并分析代码为什么这样写,关键函数及使用要点是什么?且很多情况下同一个子问题的求解会给出多种代码方案,其主要目的是直接通过解决建模实例问题,切实而快速提高参与建模的大学生们,利用MATLAB做数学建模时,真正的代码嗅觉和实战能力。

  • 预备知识


1.  关于MATLAB

- 任何与下载、安装等有关的问题,我们默认如果参与建模的大学生们都能够,或者已经解决,因此不会在任何公开场合指导或评论与这两项有关的内容和问题,原因大家懂的都懂,不懂的看完不懂也得懂;
- MATLAB尽量使用新版本,至少是2019b或之后,因为在2019b版本,MATLAB的基于问题建模的代码结构与前期版本发生一些变化,如果不是新版本,运行我们的代码,不保证是否会产生莫名错误;

2. 关于Yalmip

2.1简介

`Yalmip`作为一个第三方的优化建模、求解工具包,自身天然拥有表达复杂模型的基于问题建模描述方式,同时它提供调用市面上绝大多数求解器(如`Gurobi`、`cplex`等)实现模型求解的接口功能,当然它也能在MATLAB平台上,与MATLAB官方自带求解函数(全局优化求解工具箱除外)无缝集成。此外,`Yalmip`自身也带求解器,可以求解某些MATLAB自身不能完美求解的问题,例如混合整数非线性规划问题(Mixed Integer Nonlinear Programming, MINP)。更重要的是,`Yalmip`可以在MATLAB环境下直接调用其他第三方求解器,这是一个非常犀利的开放式功能,如果没有它,我们在MATLAB里写调用程序还是比较麻烦的,MATLAB目前在求解器调用这一块相对封闭,而使用`Yalmip`可能只换一个字符串就解决了。

2.2 Yalmip的安装与设置

步骤:

(1). 在[下载链接-1](https://yalmip.github.io/)或[下载链接-2](https://github.com/yalmip/YALMIP)找到工具箱并下载;
(2). 下载的工具箱解压缩到MATLAB工作文件夹(注意:一般不推荐放在安装路径);
(3). MATLAB中,依次单击:`HOME`→`Set Path`→`Add with Subfolders...`,将`Yalmip`工具箱的路径加入搜索路径,`Save`→`Close`.

3. 关于Gurobi

3.1 简介

新一代大规模数学规划优化器,针对线性规划,尤其大型整数线规问题,拥有相当出色的运算速度与精度,此外,其学术申请免费Lic可能是所有优化类软件里,对用户最为友好的。

3.2 安装与设置Gurobi

步骤:

(1). 进入官网:点击[这里](https://www.gurobi.com/),进入Gurobi官方网站,注册账号(如果已有跳过这一步);

(2). 登录账号:点击[这里](https://www.gurobi.com/academia/academic-program-and-licenses/)进入学术License申请页面;

(3). 下载安装软件:按页面要求,进入[下载页面](https://www.gurobi.com/downloads/),下载左侧的`Gurobi Optimizer`并按照默认文件夹安装;

(4). 申请License:进入[申请页面](https://www.gurobi.com/downloads/end-user-license-agreement-academic/),点击`I Accept These Conditions`,按要求操作跳转页面得到key,`Win+R`→`运行`→`cmd`,复制刚才得到的key运行;

(5). MATLAB设置:

   1. 打开MATLAB,当前工作路径跳转到`Gurobi`安装路径下的`Matlab`文件夹,例如:“`C:\gurobi911\win64\matlab`”;
   2. Command Window输入:`gurobi_setup`,`Enter`运行;
   3. MATLAB中,依次单击:`HOME`→`Set Path`→`Add with Subfolders...`,将`Gurobi`中的如下路径加入搜索路径,`Save`→`Close`,如果该路径加入MATLAB搜索路径,优化时会默认调用Gurobi一些同名优化函数,如`linprog`或`intlinprog`等执行对应特征的优化计算。

   “`C:\gurobi911\win64\examples\matlab`”

   > 注:目前的Gurobi必须经过校园网申请License,如果不是校园网,需要在认证时通过VPN实现;

4. 关于其他可能用到的软件

首先,本系列的文章,仅探讨以MATLAB为平台调用官方函数、第三方工具箱或软件的模型代码编写以及求解方式,数学建模而言,可调用或运行的软件、工具集非常之多,由于我们自身才学的限制,并不熟悉其他工具软件的用法,因此完全不会探讨其他优化软件的优劣高下;

其次,以上提到的`Yalmip`和`Gurobi`是我们在后续系列问题的代码中,常用的两个工具,如果在后续文章里用到了其他工具,其安装方式会在具体问题中提及,或后续进一步在这篇文章中陆续补充。

5. 小结

这是系列专栏的第1篇文章,主要是讲明训练目标和适合人群:完全针对代码实施能力的培训,适合于即将在数学建模比赛中,承担编程工作,且已经决定以MATLAB为主,进行代码编写的本科大学生。

当然,因为一些特定情况,部分学校可能无法使用MATLAB作为建模的代码编写工具,我们今后如果有时间和精力,可能会推出这个系列的Python版,但目前还没有一个明确的时间表。

在下一篇文章中,将针对一个简单的代码问题,同时利用`Lingo`、`MATLAB`基于问题和基于求解器方式、`MATLAB+Yalmip`、`MATLAB+Gurobi`等不同方法,解释优化模型在代码中的基本结构,找到并总结不同软件在解析、表述和运算一个优化模型时,那些变和不变的因素。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表