2018数学建模国赛

2018年数学建模国赛终于尘埃落定,第一次参赛,非常幸运地拿到了国一,在这里记录下这段难忘的经历,分享一些个人的看法心得。

其实严格来说,我从接触数模到参赛只有一个月左右的时间,我之所以能拿奖很大程度上要感谢两位认真负责、经验丰富的队友,当然我也绝不是一路躺过来的,我们每个人也付出了很大的努力。

作为计算机专业的,其实一开始并没有想到要参加这个比赛,甚至一度认为这比赛特别高大上,特别难,而我数学学得又不太好(虽然高数线代都是90+,但知道自己只是会做题而已),所以潜意识里有点不敢参加。但为了将来保研的时候能提高竞争力,就想拿个奖,听说数模含金量相对高一点,就开始关注起这个比赛。

后来阴差阳错地在老乡群里看他们聊数模比赛,也过去凑个热闹,认识了后来的队友。他们也恰好缺个编程的,就一拍即合组了队。

然后介绍下我们的队伍配置,我觉得是比较完美的阵容了。
队友A机械专业,负责建模
队友B应数专业,负责论文
我计算机专业,负责编程
其实我有看到那种三个都是理学院或者三个都是偏计算机或者信息专业的,我觉得这样不好(当然大佬除外),最好不同专业组合着来,各自发挥特长。如果让文案能力强的妹子来负责论文就更完美了哈哈哈哈。
当然这并不是意味着每个人只干一种活,首先自己负责的部分一定要保质保量地完成,然后最好对其他人的工作也能帮得上忙,毕竟大家是一个team。比如大家要一起讨论模型,一起找资料,一起改论文,配合默契很重要。
然后队友很放心地把所有编程工作都交给了我,这样他也可以专注建模不必多考虑其他因素,如果模型我觉得不能实现我也会告诉他。

接着讲讲我这次从准备到参赛的整个过程吧。我们学校是每年派出30+个队参赛,校内培训赛报名了90+队,所以还要刷人。不过两个队友已经有过一年多的数模经验了(队友拿过一次省一、美二),所以培训赛就是让我练手的。培训赛有八次题,前三题的时候我还在实验室实习,所以都是队友再弄,我水过。后五题是全程参与的,而且是按照国赛的时间点,三天一题,中间休息一天拿来讲评,那半个月还是挺累的。而且学校出了好几道大数据的题,有点押题的意思(虽然没压中2333),数据清洗痛不欲生T_T。最后学校根据八题得分排名选队伍参赛,其实我们培训赛做得并不好,所以参赛前还是有点慌慌的。后来也是赛前拿着论文去找老师,给我们指出一堆问题,主要还是在论文表述上的,模型解释不清等等。从培训赛结束到正式比赛的一周时间里,A整理各种常用模型,我看了一堆常用算法,备了些代码模板,B看了一堆历年的优秀论文,大家都卯足了劲冲国奖。

国赛那三天学校给包了一层宾馆,每个队一个房间,待遇真的很不错了。倒霉的是那天A的电脑居然坏了,开不了机,最后自己试了半天都不行,然后拿去店里修,那时候都已经放题了。然后我和B就在房间里看题找资料。
A题是隔热服,偏物理的,看了下第一题就是给了些数据,建一个回归模型,模型的建立需要查文献来确定,而第二题、第三题就是在此基础上的线性规划问题。这种题对第一题建模和计算的要求较高,也应该是有个固定的答案,如果没算对国奖的几率就很小了。
B题是RGV调度策略,典型的调度规划问题。第一题针对一道工序,第二题针对两道工序,第三题是在前面的基础上引入了故障情况,难度是越来越高的。由于A是机械专业的,有背景知识,而且A题感觉看了些文献也没有什么眉头,于是当晚十点我们就决定了做B题。
说实话这题刚开始觉得很复杂,因为小车移动、上下料、CNC车床加工零件都分别需要不同的时间,系统运行过程中会有各种时间差。第一晚我们查了些资料,一点钟左右就睡觉了,没熬夜。
第二题一大早起来就开始深入读题,一上午基本上把上下料这些的流程给弄清楚了,之前有过前车之鉴,如果题目没理解就开始动手,后面如果发现走错路就gg了。刚开始考虑当作TSP问题来做,作为线性规划问题用lingo来解,最后发现情况实在太复杂没法建模。之后也考虑过排队论,用遗传算法的思路来解,最后都否决了。所以第一天还是很痛苦的,搞了半天没啥头绪。在队友苦思冥想建模的时候,我就开始手工推算前几次的情况,看看能不能发现什么,最后还真发现,第一轮的时候当RGV给每个CNC上完料以后,第一台机子还在加工中,这段时间RGV根本动不了,而当第一台机子加工完成后,RGV过去换料,过程中其他车床也陆续完成了加工。可以这么认为,只需要对第一轮加工过程进行调度,后面都只是在重复第一轮,直到八个小时结束!但是这种做法并不妥,是迎合数据去的(CNC加工时间比RGV移动、上料的时间要多出一个数量级),不过倒是坚定了我之前的一个想法。
作为计算机专业出身,看到这题我第一反应就是操作系统的进程调度算法,FCFS、SJF、RR调度等等,如果能简化成一轮内的调度问题,那就相当简单了,代码也非常好写。但我之前有担心一个问题,就是"饥饿"问题,有可能会造成一个现象,就是在这种调度情况下,某台CNC永远处于闲置状态,然后CNC在其他几台车床间来回跑,这种情况是不符合实际的。但是明显这题的数据是给凑好的,不会造成这种现象。
最后我们采用了动态规划的思路来建模,初始阶段就是第一轮,通过搜索全排列四万多种组合,找出用时最短的一种方案作为起始,之后每一次调度都当作一个子问题,基于”最近距离先服务“的调度原则求解每个子问题,然后进行状态转移,以此类推。
思路定好以后,就开始了神奇的建模和编程分离的过程...因为我们都明白思路了,然后A开始造模型,写公式,我就用模拟仿真的形式去实现代码求解,解出答案填表格。
第二题两道工序更加复杂了,不过还是延用同样的思路,在此基础上假设CNC是严格按照第一道工序、第二道工序交替进行,来简化问题的复杂度(其实题目的意思也是如此)。然后A根据他的专业知识提出用生产节拍同步来计算两道工序刀具的配比。这题我是第二天晚上熬夜写完的,所以印象深刻哈哈哈。
第三题就是引入故障情况,我也没管队友模型咋建,按着自己的想法来写代码了。
最后做了个模型推广到多台RGV的情况,算是个小特色吧,为了拿国一有点小料。

晚上8点前先交了一波,然后开始改论文摘要,改排版,九点半交了终稿。然后吃了顿夜宵,美美的睡了一觉~

最后总结和分享一些备战国赛的经验吧:
1.参赛时间点:最好还是早点接触,第二次参赛和第一次参赛的简直就是天壤之别,我们学校拿国一的基本都是大二的。一年玩下来,这个比赛啥套路基本都摸清了,参赛就很有优势。如果是为了保研的话,大三参赛是来不及的,因为出成绩都11月了,保研早结束了。
2.关于队友:有大腿抱可以成长地非常快,但是抱大腿不是意味着躺,而且你得有一定的实力,大腿才会愿意带你。
3.学习资料:建模这块入门看姜启源的《数学模型》,其他的诸如《数学建模方法与应用》进阶也可以看,不过我是编程的,所以这块没怎么深入。算法这一块,去图书馆随便借几本MATLAB的书就行,入门的话可以看下中南大学的MATLAB的网课,还是很不错的。然后编程这块最好是计算机专业的同学来负责,学过数据结构、算法之类的课,不管是设计算法还是敲代码都很高效。
然后本人也整理了一堆网上搜刮来的资料,各种模型、软件、代码、教程等等大概20个g,需要的可以评论留邮箱,我把网盘地址发你。
 

猜你喜欢

转载自blog.csdn.net/xzy5210123/article/details/84196314