一.大赛介绍
全国大学生数学建模大赛简介:
全国大学生数学建模竞赛创办于1992年,每年一届,是全国高校规模最大的基础性学科竞赛,也是世界上规模最大的数学建模竞赛。
全国大学生数学建模竞赛作为全国高校规模最大的课外科技活动之一,2022年高教社杯全国大学生数学建模竞赛将在9月15日-9月18日举行!
竞赛面向全国大专院校的学生,不分专业,本科组竞赛所有大学生均可参加。竞赛采取通讯方式进行比赛,地点设在各个高校,比赛期间规定不能与老师交流,但可以在互联网上查阅资料。
二.团队简介
段靖坤
上海交通大学电子信息与电气工程学院2020级微电子科学与工程专业本科生,致远工科荣誉计划学生。
在本次比赛中主要负责建模和可视化部分方面的工作。能够使用c++,python,MATLAB等多门编程语言,对于图论有关问题和算法有一定的积累,同时能够较熟悉地运用MATLAB进行数据的可视化工作。
刘奕辰
上海交通大学电子信息与电气工程学院2020级测控技术与仪器专业本科生。
主要负责写作部分,用的工具是LaTeX。同时在备赛时期也对数学模型和可视化两部分进行相关积累。
薛家奇
上海交通大学电子信息与电气工程学院2020级IEEE专业本科生。
负责编程部分,主要编程语言是python。
三.备赛方法
赛前准备:
1.组队报名
我们小队的组建,首先是因为队内同学一关注到了国赛的相关信息,于是她联系了同学二进行组队,同学二由于在大一下学期与同学三相处较多,再加上其能够熟练运用python语言的缘故,便邀请同学三一起组队。这样就组成了我们现在的队伍。
2.知识储备
组队之后,我们听从校内老师的安排,在指导老师的安排下在暑假的空闲时间参与了学校组织的线下线上的培训,对于数学建模、数学建模国赛、以及相关算法建模思路有了初步了解。
之后通过培训群提供的每日推送以及往年培训的影像资料,我们又及时补充学习了一些建模、算法的方面知识,例如我们后来有所使用到的聚类算法、动态规划等等。
在假期中,我们小队还认真完成了培训老师要求的相关作业,三次作业分别巩固了我们论文写作、算法和可视化方面的知识,让我们对于所学知识的运用更近了一步。
3.技能准备
在校内培训之余,我们还自己不断巩固自己的技能,学习了解了更多python的库及其应用,掌握了更多高效的算法;负责写作的同学进一步巩固了自己的论文写作能力,同时也查阅了很多算法资料;编程同学学习了很多可视化技巧,参考了往年的优秀论文。
4.赛前练兵
在假期过了大半之后,为了加强队员间的配合,同时也为了在国赛之前进行一次预赛,我们参加了上海交通大学等三校一起举办的杉数杯数学建模精英赛。
在这次比赛中,我们采用线上的形势,经过讨论确定选题,针对题目查阅相关资料,学习相应算法,并针对题目具体要求,对于算法进一步优化,实现算法解决问题后一起打磨论文内容。
这次比赛让我们积累了数学建模比赛的经验,增强了我们配合的默契,最终也取得了一等奖的好成绩,为我们迎战国赛提供了极大的信心。
正式比赛:
刚开始拿到题目时,发现三个题目与我们所熟悉的类型以及之前的练习有一定差距,所以其实对三个题目的把握都不是很大,但是由于有队员比较排斥C题数据题,也有队员较为反感化学背景的B题,所以我们选择A题为主要攻破点。
然后开始资料收集,一开始在资料查找上出现一些困难,网络上对FAST望远镜的相关文献只停留于基本情况的介绍,对于如何进行连续性的相互连接的曲面优化,以及如何尽可能满足各种约束条件的问题也出现瓶颈。
为了避免过多时间的浪费,我们决定先将比较容易处理的第一问以及第二问中坐标系转换的已有思路建模实现,同时在一个同学敲代码的时候,另外两个人进行继续的资料搜索与建模思路探讨。
后来同学查找到一篇关于望远镜曲面调节的底层逻辑分析的论文,获得可以将连续问题进行离散化的解题思路。
一开始我们尝试将所有结点移动到理想曲面上的情况,但后来结合实际生活经验和查阅相关资料,我们又认为最好的拟合情况下,实际反射板应该是会穿过理想抛物面的。所以最终以两种解决方案进行计算比较,选出较优结果。
在整个过程中的人员分工较为明确,除去最开始的讨论,其余时间基本是每个人负责自己擅长的那一方面,并且及时将疑问和需求提出来。
所以在确定完建模思路后,编程手立即开始实现,写作手开始写问题重述、模型假设等前期论文准备,保持问题的解决与论文的写作同步进行,每解决一个问题就可以开始同步的写作。
我们虽然在出题当日就完成了题目的选择,但是第一天解题的进度却不是特别理想。一方面由于比赛地点选择在图书馆,会有闭馆时间限制,另一方面可能大家都比较养生(也可能是脑子乱了不想思考),所以我们并没有出现过度熬夜的情况,每天好好吃饭并保证一定的睡眠,第二天准时在开馆的时间到图书馆开始理清头绪继续工作。
这样也使我们一直处于头脑清醒的状态。当然到后期解题思路越来越明晰,三人配合紧凑,最大限度地利用好在图书馆的所有时间,在最后一天下午便完成论文初稿。
之后三个人一起阅读,修改表达不到位或可以提升的地方,并且思考哪些地方可以进行可视化处理,丰富论文内容。在排版附件时出现了一些问题,Python输出过程的展示在LaTeX里会有乱码,所以最终决定将出现乱码的地方截图,然后依次排版插入进去来解决。
当然在刚开始的时候,由于读题不仔细,导致三个人漏掉一些条件,并且理解错定点的位置坐标,在第二题算完之后才发现,只能重头来,所以朋友们一定一定一定要好好读题,每一个条件和符号都是有意义的,附件里的东西也要看仔细。
对于一些条件,比如0.07%的限制,三个人一开始因为实在想不出解决方案,就决定先算着,然后进行检验调整,结果最后算出来有一半都不符合,第三天三个人也没辙了只能在论文里装傻,只在最后的模型缺点里提了一下。
获奖论文截图
但现在想来如果当时一直钻牛角尖,抓住这一点不放,可能就会有不同的结果,所以,(也许可能大概)对于某一些(但起码绝大多数问题都要解决)暂时解决不了的小问题不要死抠,要学会舍得。
遇到的困难:
1.选题
因为有队员讨厌化学,所以尽量不要选B题(他的同伴们善解人意地同意了A题)
有同学认为B题多变量而且不熟悉评价类的问题,相比之下A题感觉思路比较简单。
2.理想抛物面的方程
首先有队员认为抛物面的顶点就在球面上(潜意识里可能是因为这样好算)
结果他的同伴们发现问题,后来改了(这已经是第二天的事情了)
3.代码行数有点多
每新开一个.py文件就复制一次要用的之前的代码而没有import,后来代码多的时候高亮有点跑不动了
当然自己看着也有点费劲了,不过幸好最后不算太多
4.不同python第三方库的应用
为了要读他给的那个.csv文件,先是去学openpyxl,结果发现这个东西只能读写.xlsx文件,再去看xlrd,也不行……最后只能用之前从来没用过的pandas来读,(之前居然从来没用过pandas,所以说还是要多积累)
在比赛前一天刚知道了numba的用法,他就在写的时候一直用,可能能快上几倍吧(也激发了将重复过程当作函数拿出来的热情)
用sympy计算可以算出来的表达式,比scipy每次数值求解应该要更快。
要写.xlsx文件,还是用openpyxl吧(三种文件类型三个库呗,无奈)
5.平板与球面之争
在三个整天里的第一天结束的时候,我们终于算出了接受比,但却发现这个数低得可怜,于是就找问题,发现三角形的平板太大了,接受的地方太小了,如果用的是平面的话,接受比就上不去。
这对于我们来说可以是灭顶之灾了,认为一天的工作全部白费,这次比赛也要以失败告终了。
第二天再改的时候,发现之前的部分并不是全然不能用,只需要进行少部分修改,就能把它从平面变成球面。这可真是意料之外的狂喜。
6.附录排版的困难
由于问题二答案的表格较长,用常用的方式插入表格导致表格是以一个无限长的表出现在一页之上,后来大家查资料发现可以用longtable来解决,这也让大家明白积累这种东西越多越好。
7.最终也没有解决的困难
"变化幅度不超过 0.07%",因为对作出题目,尤其是在0.07%限制条件下的题目不抱有希望,因此,我们决定先把这个条件放过去,等算完了之后再来检验这个限制条件。
然而,在最后一天,当我们检验时,发现几乎有一半的数据不满足这个约束条件。对此没有解决办法,只能静静地等待着截至时间的到来。
想分享的经验经验教训:
1. 不要放弃希望
2. 良好的,模块化的编程是很重要的,这可以尽量降低意外造成的损失。
以上就是我们的全部分享。