数学建模全攻略
从最开始的准备到最后的实战
笔记导航
写在前面
这篇文章主要是针对编程手和带团队来说的,其他的略有涉及
如果你对数学建模一头雾水,可以先上知乎多搜一搜数学建模,大概有个了解,我们再选方向前进。
这里给出一些参考文章:
引入:椅子问题
一个经典的问题:椅子可以在不平但是连续的地面放稳吗?
答案是可以,四只脚都落地的那种。
模型建立
抽象
- 椅子:四个正方形同平面的点ABCD
- 地面:一个连续曲面
- 对地面建一个坐标轴,AC与x轴的夹角为 θ \theta θ, f ( θ ) f(\theta) f(θ)为AC与地面距离之和, g ( θ ) g(\theta) g(θ)为BD距离之和
- 重要前提:四个点,至少有三个是可以接触的,也就是f和g至少有一个是0
- 椅子是中心对称的
解模型
- 根据前提4,令 f ( θ ) = 0 f(\theta)=0 f(θ)=0,假设没有放稳,必然有 g ( θ ) > 0 g(\theta)>0 g(θ)>0
- 根据前提5,对椅子旋转90°以后,BD就可以接触地面,而AC不能同时接触地面,所以得出 f ( θ + π 2 ) > 0 f(\theta+\dfrac{\pi}{2})>0 f(θ+2π)>0且 g ( θ + π 2 ) = 0 g(\theta+\dfrac{\pi}{2})=0 g(θ+2π)=0
- 设 h ( θ ) = f ( θ ) − g ( θ ) h(\theta)=f(\theta)-g(\theta) h(θ)=f(θ)−g(θ),那么在 [ θ , θ + π 2 ] [\theta,\theta+\dfrac{\pi}{2}] [θ,θ+2π],有 h ( θ ) ⋅ h ( θ + π 2 ) < 0 h(\theta)\cdot h(\theta+\dfrac{\pi}{2})<0 h(θ)⋅h(θ+2π)<0,根据连续性原理,必然有零点,使得 f ( θ 0 ) = g ( θ 0 ) = 0 f(\theta_0)=g(\theta_0)=0 f(θ0)=g(θ0)=0
推广
实际上矩形也可以证,之前不是转90°嘛,本质上还是把两条对角线互换达成0函数值转移的目的,所以转一个对角线角度即可。
证明过程同上,仅仅是吧 π 2 \dfrac{\pi}{2} 2π换成 θ 0 \theta_0 θ0,其为两对角线的夹角
数学建模一般思路
什么是建模呢?从上面的问题来看,建模就是将现实问题用具体的数学符号去描述。
理论上,一个问题有n种建模方式,好的建模方式处理起来很方便,可以简化问题。
建好模以后就是用各种方法去求解模型,得出答案。
数学建模系统学习
找现成的课程
我后面列出了很多理论上的资料,但是这些东西有点像是底蕴,虽然可以带来更高的上限,但是同样有准备时间长的缺陷。
如果想要快速上手,或者是想快速找准后续学习的方向,我推荐先系统地看完一门数学建模课程,这方面我还是推荐国内的书和课。而且我还建议组内3个人全部看同一门课程,打好基础,否则交流都交流不懂,后面各自再朝着自己的方向加强。
课程有三种:
- 学校内部的课程,可以信任
- 慕课/b站的视频,需要筛选
- 付费类型的课程,比如清风的课程(舍友上过,评价不错)
只要你把一门课学完,你的框架就有了,历练一两次就具备了拿奖的潜力了,至于后面能拿到多高的奖,那就是看你的积累了,无论是建模人的数学理论,还是编程人的编程技术,亦或是论文人的论文排版与文笔。
《Mathematical Modeling》读书笔记
这本书内容不错,仅仅分开三个模型,广泛适用,而且五步法流程非常完善,可以培养一个好的习惯。
缺点就是,模型分的不够细,还有很多知识没有覆盖到,以及没有智能算法,所以我们还需要其他补充。
智能算法
计科学生这学期会有最优化方法的课,虽然我云过去了(doge),但是就打算这两天快速过一下只能算法,毕竟之前的课堂录屏就那么多,已经有基础的前提下开个两倍速很快就刷完了。
Python实现以及细节算法学习
初学python,我的建议是《python编程从入门到实战》
ISBN:9787115428028
0基础学python这本书无脑冲就可以,我的建议是先集中精力看完前半部分,之后在后半部分选择数据分析项目进行实战,之后就可以进行后面阶段的学习了。
《Python数学实验与建模》-司守奎
ISBN:9787030645272
书挺不错,讲了很多基本库,数据分析可视化等基本技术,后面讲了各种高等数学,线性代数,微分方程,概率论的python实现,非常实用,通俗易懂,代码也给了。
对于有一些python基础的编程手,最好都看完,不过其实看到200页就已经够应付了,可以实现各种idea以及画出漂亮的图。
如果有精力建议全看完,对未来发展有很大的好处,尤其是对于想搞人工智能的小伙伴。
还有一本不错的书,叫《python数据科学手册》
ISBN:9787115475893
这本书是进阶用,里面有大量的数据分析基本操作,练熟了无论是以后打比赛还是搞科研,亦或是生活中自动化办公,都会很方便,不用写一行代码再查一个函数了。
Matlab等其他软件学习
这个随缘,作为一个高贵的寄科人,头发都掉光了才学好的Python,你还去费大力气学MATLAB语法就不错了,更别说其他下水道。
其他工具针对性学一学就好,一个软件学一天够给面子了。
主攻Python,MATLAB等其他的,能看懂代码就够给面子了。
其他能力要求
Latex论文写作
论文的颜值很影响分数,Latex是颜值之王,外国的书都是用Latex写的,顶流,不接受反驳。
推荐三个人都学Latex,然后用 overleaf 在线编辑,协作。或者是两个人用比较随意的方式写文本,然后由写论文的整合到latex里。
建议熟练掌握调整版面的能力。
latex编写容易碰到各种意外,以及文章本身语言的表述也很重要,编程手请注意,一定要把这些搞明白。
文献检索能力
一般来说,模型都是从一些论文里借鉴的,所以找论文是很重要的。
- 常用数据库有SCI(自然科学),SSCI(社会科学),EI(工程),IEEE(电子/计算机类)
- 常见搜索引擎web of science,百度学术/谷歌学术,配合学校数据库使用
- 搜索引擎技巧,比如site,type等关键字使用,自行学习,这个在日常中也经常使用。
如果能ke@xue上网是最好的,不懂的自己去搜,这些不能明说,这四个字足矣,自行百度。
不行的话就只能用谷歌学术镜像,百度学术等等,还要熟练使用学校的数据库,到时候找文章就方便很多。
交叉能力
这一项属于锦上添花的,比如我主要编程,但是实际上我建模和论文都会,而建模的数学系同学,也会写论文,写论文的同学本身也学统计,也有R语言数据分析的基础。
如果互相有能力交叉,交流起来会非常方便,更容易协作,一个人忙起来别人也容易帮忙,或者去同步干一些辅助工作。
数学建模比赛经历
队伍配置
这点,计科+数学+经济学,我所在的队伍可以说是完美的搭配了,三个人的知识有交叉,而且都有强项。
理论上,是可以一个人搞定的,但是如果没有经验+极强的实力,还是老实点招队友一起分担,冲奖。就我们这么豪华的阵容了,第一次打比赛还是很吃力,因为要学太多东西,时间主要花在学习上了,我简直是持续7天们每天在那里学学学,最后一天晚上23:58分交上去,50页论文,人都麻了。
项目文件(打过的比赛都有)
项目文件里面有:
- 程序源代码,一般是ipynb,有时候会整理为py文件,因为做附录还有支撑材料都需要py文件
- latex源码
- 论文pdf
百度云提取码:cyyy
一轮校赛:热身
校赛是国赛的前奏,我们学校规定不参加三轮校赛,不可以参加国赛。所以校赛也不能轻视。
校赛每一轮都是10天,所以时间相对充裕,给人更多的时间去适应,学习,改进,迭代。
试题分析与经历
第一步我们是先提前看一下试题,然后见个面,讨论一下题意,定下初步的计划。
最开始就是选定方向,大体用什么方法,然后进行数据清洗,初步可视化。
经济学同学找了很多数据,然后我对着数据就开始用pandas洗,读入。
然后可视化就是简单画点scatter,plot,然后拟合一下。后期需要阅读文档画出尽量好看的图,数据可视化也是个很好的软实力,值得持续学习提升,DataCharm公众号是个专注于python可视化的公众号。
评价类模型由数学系同学做,我做预测和可视化,论文调版面。
对于样本只有10个的,预测采用灰色预测,对于有40个的,用时间序列ARIMA。
收获
- 首先我是有一些数据分析基础的,毕竟那本书看了也有80多页了,几个库用的也还算凑合。
- 其次就是现学一些模型,比如ARIMA,灰色预测,这些都在书里有,只不过在后面。
- 总之就是很简单,考的都是经典模型,就是热身,但是就热身而已,我们也搞了好几天。时间主要花在了学习上(对,就是我,他们其实不需要怎么锻炼),第一轮校赛结束回头看,其实工作量也就是一天的事儿。
二轮校赛&华中杯
第十四届华中杯。比赛不大不小,难度又高于一般校赛,很适合练手。
试题分析与经历
说实话拿到赛题一看我头都大了。但是进行分析,查了查论文以后,做出一张问题分析脑图后,心里稳定很多。
们选择了C题,第一步去噪,网上一堆花里胡哨的方法,都没用。最后还是通过朴素的观点得出结论的,因为波形呈现正弦形状,所以直接用移动平滑即可抹除正弦噪音。
之后就是我的专场,手撕几百行Python代码,逐层封装函数,对数据进行切割,精巧的处理,最终得出各种易于直接使用的结果,比如可以直接用来topsis的表格,以及各种图片,具体数据表格等等。
值得一说的是,读取文件的操作被我单独封装,修改文件路径轻松很多,这就是系统解耦,统一接口的魅力吗?
最后就是论文写作,这次踩坑了,图片质量太高,编译超级慢,最后提交前几分钟才想明白原因,为时已晚。具体参考我前面的latex坑点文章。
华中杯论文排版不够完美,但校赛还有7天,我找了一天时间好好研究了一下帖代码的技术,终于让我找到了代码高亮pdf的技术,即先用highlight.js将代码转化为高亮的HTML,然后通过简单的web技术做出pdf的标题效果,最后在网页里直接
收获
- 知乎上竟然还tm有很多人发思路的,这一点令我有点惊讶。客观看待,这个对于初学者还是很友好的,毕竟有总比没有好,但是对于老手就没必要去用了,你自己的思路说不定比他好,参考一下就好。
- 写代码一要注意封装,二要注意解耦,参数可以多写点,尽量别用全局变量,然后读取文件专门写一些get函数。
- 论文踩坑详见
- 优美代码技巧详见
西南财经大学校赛——帮朋友秒杀校赛
试题分析与经历
2022年西南财经大学数学建模竞赛赛题
航空管理问题
航空公司的运营管理非常复杂,航空管理问题是运筹学应用的典范之一。
航空管理问题的描述包含许多概念,包括:
时间:航空公司的运营是跨时空的。本题时间的表达由时分组成,例如:落地“0055”代表“夜间24点55分”。所有时间均指定北京时间。
机场:航班的起飞和到达,以机场为节点。机场的标识一般按照国际民航组织IATA标准的三字码。比如“PEK”为北京首都机场,对应城市为北京。
航线:飞机飞行的路线称为空中交通线,简称航线。
航班:指飞机的一次起飞和降落,是航线的一次执行。航班号可能按天或星期重复,当航班应用于机组排班时也叫航段,每执行一次航班使用一架客机,本题不区分客机类型。1个航班号有两次飞行,代表此航班为经停航班。往返的连续航班号可简写,比如“AB0001/2”代表航班AB0001从广州至北京、航班AB0002从北京至广州。
乘机旅行线路:直达或转机的整个路线,简称“线路”。例如,从北海至广州的乘机旅行线路,可以采用北海至南昌的航班,在南昌转机南昌至北京的航班,在北京换乘北京至广州的航班,描述该线路为:北海-南昌-北京-广州,该线路的旅行时间为10小时15分。
注:如果概念定义和过程描述与业界有出入,皆以本赛题为准。凡是本赛题没有提及,可不在考虑之列。
附件文件包含北方航空公司的2022年春季的4组航空数据,分别对应4个问题。若乘坐北方航空公司飞机,请你们根据这些数据分别对乘机线路进行分析:
2、无线路重复的日航班计划
本题采用“问题2航班数据”。需转机的旅客必须提前到达换乘机场候机,本问中,换乘机场候机需提前1小时,从一城市到另一城市乘机线路指采用最短时间的线路。请确定:
(1)6小时之内可到达的线路有多少条?
(2)转机次数最多的线路中转机几次?有多少条?
(3)时间最长的线路为从哪个城市至哪个城市?并描述该线路及给出线路旅行时间。
朋友事情比较多,他自己搞不完了,并且打算通宵,所以我虽然也有个互联网+压着,但是还是拯救一下朋友的肝吧。这题其实挺简单的,校赛看来都不难,尤其对于我来说,这就是一道算法题罢了。具体步骤:
- 首先定下思路,因为要最优解,所以暴力搜索,bfs或者dfs(最后选定了dfs,因为要保存所有路径,bfs比较麻烦)。
- 语言选择。c语言没跑了,暴力搜索python我没试过,但是怎么也得一两分钟一次,如果数据量再大点我就不敢想了。而且数据也不难,所以用python将excel转化为csv格式(c语言难以处理excel格式),并稍微调整一下表头以及一点不太好操作的数据,变成舒服的格式。
- 之后就是写程序了,c语言编程采取c++ STL技术+面向对象设计,写的比较舒服,几百行代码也是很快就敲出来了,一边敲一边测试,保证代码无误后开始跑结果,结果也非常舒服。
项目文件
- python用来转化格式
- c++用来跑结果
收获
- 主要是复习了算法,说来也有趣,当年学的时候挺折磨的,自己多练几次以后,也能自己写出来了,说明计算机编程本身没有难度,什么专业都可以学,也都得学,难度在于背后的知识体系。
- 其次就是复习了面向对象,不过没有用虚函数多态继承,也就是简单用了封装,运算符重载,以及c++的文件读写。
2022国赛
试题分析与经历
A题偏物理,B题偏数学,C题偏数据,C题的人是最多的,因为C有大把算法可以用,是最好啃的骨头。我们也选了C。
感觉没什么技术含量,差异性分析,对于自变量是定类变量的,用卡方检验,自变量是定量变量的,用方差分析。这是定量,其实这题的重点在于定性,因为你刚拿到数据肯定是一头雾水,所以一定要先分组+画图。
本来应该按照高钾/铅钡+风化/未风化分4组,我给分了7组,具体在论文里说了,分组以后,直接画两个矩阵,一个是直方图,另一个是箱线图。其实画出箱线图以后,比例就很明确了,结论也就一眼看出来了。
其实C题下限是很高的,毕竟大家都能做完,只是想脱颖而出很难罢了。
至于其他的,有一个问题在于三个人写代码的习惯不一样,另一个人写的tex代码在我本地跑的都是bug,让我难蚌,如果要团队写代码,一定要注重代码规范,防止bug的产生,你想想你正急着工作呢,tmd因为另一个人出了bug,内心是及其崩溃的。
另一个就是附录代码制作,这次轻车熟路,非常快,质量非常好,highlight.js真的好用,配合我提供的工具包,不用配置一步到位。
这次给我最深的印象有两个,一是时间的紧张,二是流程的繁琐。
时间方面,我们第一天啥也没干,就上课了,所以实际消耗时间只有两天,而且我们都没有熬夜,所以消耗时间是其他队伍的一半。我们就用这些时间完成了C题全部,以前我的工作量很大,这次虽然还是很大,但是我已经有意识地把任务分配出去了很多,大家都基本没闲着,这才能在规定时间弄完。
流程方面,国赛是真繁琐啊,因为国赛要求及其离谱的准确性,所以流程很多,这个我建议交给比较闲的人(比如写论文的)做,这次我就是把我的账号给她,让她全程提交,给我省了不少的心。队友靠谱还是很舒服的。
收获
- subplots子图的精细操作,坐标轴修改,维度保持
- 在subplots子图上用seaborn接口绘制直方图+概率密度曲线。
- 在subplots子图上用seaborn接口绘制箱线图
- 对Series理解更深,主要是DF的每一行/每一列都是Series,其name就对应行/列的名字,用loc相当于对名字的花式索引,iloc是对位置的花式索引。
- spss pro平台真的牛逼
感悟
数学的重要性
对于计算机学生来说,尤其是要走算法的,数学超级重要,线代超级重要,数值分析超级重要,概率论超级重要,这些都是基础中的基础。
别的东西,你都可以现学,唯独数学,不会要再学是真的麻烦,所以我在本科期间,具体点就是考研之前,有条件的话就下学期之前,要把以下几本书看完,回炉重造。
《普林斯顿微积分读本》
《线性代数及其应用》(原书第五版)
《数值分析》(原书第二版)
《概率论与数理统计》(原书第九版)
是的,你没有看错,都是外国的,而且我可能会看英文对照。国内的书和国外的书差距很大,国内的书是教材,非常浓缩,不注重理解,国外的书更适合自学,加入很多应用和直观理解,请你明白,数学不是凭空诞生的,必然有应用,必然有解释,我在学校最大的问题就是,学的时候学不到太多解释,我要通过这些书,建立对数学世界的基本理解,可以说,我现在只是一个数学熟练工,不是一个数学学生。
至于能不能看完,这倒还好,毕竟已经学过一次了,看起来会块很多。
编程能力提升
处理数据,首要的就是清洗,老实说,成功的数据清洗,处理就成功了一半,数据清洗是最恶心的,没有之一。
具体的细节其实很多,用python处理数据的时候,我是真的感受到了Python的博大精深,这门语言或者说是其背后的编程范式,思想值得深学。
Python语法不难,难在背后的运行机制,以及牵扯到的大量数学知识。开箱即用是个伪命题,一个函数有参数和返回值,你如果不理解背后的逻辑,那么就不能灵活运用参数,也不能灵活处理返回值,出了bug更是难以解决。
学到现在,也对计算机专业的英语要求有了理解。其实编程初期不需要英语能力,只有到了后面要查官方文档的时候才会用英语,这就将一个普通编程者和掌握一手信息的编程者区分开了,而且未来如果搞科研,对英语的要求更高,所以计算机高要求英语是非常合理的。
硬实力仍然很重要
华中杯我们只能做c题,A下不了手,B结果无法保证。
非常可惜的是,如果我能力比当时更强,AB题都是可以做的,可惜可惜,这更激发了我的斗志。这说明,硬实力还是很有用的,很多人鼓吹的现学,至少在计算机学生身上是不成立的,这些都是计算机的覆盖范围,尤其是以后有志于科研或者算法岗的同学,一定要提升硬实力。
竞赛就是厚积薄发,不想茫然无助,就请少摸鱼,高效积累,痛快学,痛快玩。
任何比赛都需要积累
可以这么说,即使有很强的个人能力,直接上手国赛,表现肯定大打折扣,因为有各种意外情况会出现,你不一定能全部摆平,也不一定能迅速摆平。
就比如第一次,我们知道了自己的学习方向。第二次我更明白硬实力的重要性,以及latex论文写作的注意点。
下一次,我又会积累到什么经验呢?三轮校赛的设置是非常合理,强制参加三轮才能参加国赛的规定也非常科学,在此我感叹设计者的高瞻远瞩,只是可惜了有些菜鸡心高气傲,既没本事,又不训练,幻想国赛一步登天,做梦。没有绝对实力,就多积累,如果没有校赛之类的,请多参加诸如华中杯,mathorcup,电工杯之类的比赛,一个月参加一次,多训练几次,就熟练了,很多拿金奖的团队,都是从第一次的摸不着头脑开始,到最后一次的金奖,期间会经历少则3次,多则10次的比赛。
请放平心态,厚积薄发。
保持态度和效率
华中杯里态度和效率不太完美。
一点令我不太满意的是没用全力的态度。
首先是两名队友在刚拿到题的晚上无动作,他们是有事情,我非常理解,在我们决定要打华中杯之前,他们就有事情排在第一天晚上了,所以很正常
对于华中杯这种小比赛,可以不那么重视,但是国赛美赛,一定要提前把这个时间段的事情都推光,切记,三天时间太紧张了,一定要全力以赴。
另一点我不太满意的就是我们三个人聊了一天的闲话。
第二天全天聚在一起推进工作,我们聊天太多了,虽然我尽力克制,但是我也说了不少,所以我也有问题。一边吹牛一边工作效率不会高,要不是我提前对题目做了分析,一上午能不能定下题目还不一定。后面三个人干了一中午下午晚上,竟然没有找出一个合理的去噪模型,其实三个人一言不发找2小时就可以找出来。所以,聚可以聚,但是队长一定要有克制的觉悟,要有大局观,不能让三人聊天太多。
后续感言
笔者最后的这段话写自大四下学期(2024年2月记),其实我在大三就不搞数学建模了,我在实验室有科研项目,没有时间搞这个比赛,美赛也是水过去了,虽然这篇文章的名字很霸气:《全攻略》,但是写这篇文章的作者并没有在北京市取得什么好的奖项。
究其原因,在于我们并没有真正投入大把时间,甚至说是没有投入时间,全靠我们自己的底子在支撑,这底子也就一般般,稍微比平均水平好一点儿,这也证明了,除非底蕴异常雄厚(比如大二就已经发过科研论文),能直接拉开足够的差距,否则你想拿奖就必须真正砸进去时间学习,后来者如果想要搞数学建模,想要拿奖,请务必做好心理准备,把我上文所说的东西学了,尤其是数学建模的理论知识,务必从头刷一遍。
建模,归根结底还在于模型,开发和写作只是配角。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)