本文写于2020年5月22日,由于服务器故障数据回滚丢失,特此补档。
前排警告:这篇文章是小学生作文式的流水账。
五月初的时候,我和另外两个小伙伴一起参加了数学建模校内赛。前几天成绩出了,我们拿了个二等奖。有146个队参加,7个一等奖,14个二等奖,我们只知道奖不知道排名。如果是21名,那其实也不是很理想,如果是第8名,那还是蛮不错的,我自认为是前者,因为我自认为我们的作品质量不高。
先说说我们队伍的配置。队长是J同学,会计专业;另一个队友是togotoo(他网站还没建好,当初就是他借的域名给我做动静分离),物联网工程;剩下一个人就是我,软件工程。这个配置是很标准的,如果我和togotoo有个人是搞数学的,那我们这个队叫绝杀,可惜搞不得。比赛前一两个月togotoo找我问我要不要和他一起搞数学建模,我说“好啊,来啊”,然后之前也了解到J同学是个大佬也有干建模的意向,就也把她叫上了。
建模校赛题目不知道比国赛简单到哪里去了,讲的就是在一个网格图中,有一个仓库,这个仓库要发车给网格图中的若干个销售点送货。开车是要钱的而且有载重和时间限制,距离按曼哈顿距离计算。第一问只有一辆车,这个车可以装很多一次送完不成问题。第二问有两种车,装的都不多一次送不完,他们载重量和空载费用和不一样的。两问都是要你去安排车子如何调度效率最高。
拿到题,乐了,这玩意基本是去年校赛原题,学校有够懒的。而且J同学去年做过这个题第一问。但是仔细一看,数据变了。综合考虑,还是觉得重做吧。
第一天晚上拿的题,我看了一下,估计要蚁群,蚁群原理我是知道的,没写过,不敢写,怕花时间不讨好。除了蚁群还能用lingo做,毕竟是0-1整数规划问题,但是我不会lingo。第一天晚上肯定要把工具选好,要我选就在python和matlab当中选,我想了一下,要不用python吧。matlab用的人肯定多,把评委搞视觉疲劳了看到python说不定能加点分,再说python要啥库有啥库,搞不好找到个库算起来比lingo还方便。那就用python了,当天晚上我就把数据处理了一下,算了邻接矩阵,用pandas保存为csv,用matplotlib把散点图画了,去睡觉了。
第二天早上起来,和两个队友商量对策。第一问是一个TSP问题,用遗传或者蚁群做。其实最开始我还没放弃蚁群,去看了下别人的代码,有点不敢下手。当时在百度搜python解决TSP问题,也基本都是遗传或者蚁群。行吧,那就硬着头皮写吧,写不出来明年再去国赛呗。百度搜出来的全是CSDN,CSDN啥质量大家都懂,于是我就想去谷歌搜一篇英文的详解研究研究把代码整出来,输入两个关键词,python,TSP,一按回车,看到了一个奇怪的东西,点进去,我。。。链接
OHHHHHHHHHHHHHH!!!
就这样,就把第一问给干了。核心代码就三行,我都在想会不会评委认为没有技术力不给待见。写下来总的代码量还是有的,就这样吧,图出了思路写了下,就发给队友了。
翌日,要开始干第二问了,第二问是个CVRP问题,也就是有约束的车辆路径问题,网上可参考的代码不多,二话不说开始找论文看。这样,过了大半天,浪费了大半天,怎么搞都没想好。后来,我忘记时怎么阴差阳错地点进了谷歌开发者,发现了一个叫or-tools的东西。这是一个规划问题求解套件,感觉可以用上,就开始读它的文档。最开始我还只指望这玩意和Lingo差不多,后来我惊喜的发现,它既能像Lingo那样写模型求解,它甚至还针对常见问题进行封装,可以几乎直接输入数据求解,这些常见问题正包含了CVRP问题!
用or-tools求解CVRP问题(404别找我)
于是,求解方法就定了,当晚就把第一小问代码出了,虽然核心求解部分是有工具的,不过数据还是要手动重新处理的。这个题的距离都是曼哈顿距离,在路径最短的情况下可能有多种最短路径,还要考虑正向反向的问题,因为费用是按载重和距离计算的。代码写到12点,洗洗睡了。
早上起来,看代码,感觉很乱,那就封装一下吧。把求解过程用类封装起来,只要提供两种车的数量便直接输出包含可能解的Excel表(使用openyxl)以及路径图。不得不说。matplotlib出的图还是比matlab好看很多的。做了一定封装之后,第二问不同情况就可以一起求解了。
代码写完,路径表出来了,该写结论了。这个时候,子路径已经确定了,需要把路径分配到车上。这是个子序列和最大值最小的问题,之前没想到还会有这个步骤。DP求解,直接用C++写了,把所有情况筛一遍之后,用刚写的DP程序分析最有安排。于是,结论就出来了。
以上,问题求解就搞完了。
但是,这种搞法有个坏处,就是模型不好写。在考虑了一下后,决定模型就按0-1规划写吧,带着对模型和代码不一致的担忧,我把建模的任务。。。丢给了togotoo,自己写PHP项目去了。 togotoo大佬一直在研究AI和ML,可能不太会Latex,于是我就叫他把手写的给我,我录成Latex。Latex录好,转成pdf交给J同学,我就继续去搞PHP项目了。
到了交稿前,J同学论文写好了,于是我就拿来提出我的拙见,前文都是仔细看仔细修改的,过了一个小时,当我看到第二问模型时,空白!一看时间,只有一个小时就要交论文了,我人直接傻了。当初我是在Typora上把模型写好,md和pdf一个给了J同学,然后我说md里面有Latex,word里好像可以直接贴,J同学之间也告诉我她的Word直接贴Latex会有转义问题,我说我的蛮好啊。于是就造成了这种沟通失误,她应该把我Word没问题理解成了我可以搞,于是就交给我了,然而我当时是脱口而出的,现在看来我真是个铁five。
好在Latex还在,那就直接贴吧,这一贴,尴尬了,我这边也有转义错误!我认为没有只是因为我之前都是贴的简单公式没发现而已!我人又傻了,到交稿只有50分钟了,先变量说明写了吧,然后我尴尬的发现,我不会做要求样式的表格。。。我就是一个除了ppt以外office全不会的five,这得从我们学校只有计科院不用学大计基讲起。。。
这个变量说明表做了半个多小时,导出查资料,越做时间越不够,越焦虑,越慌,越出乱子,恶性循环。变量说明表做好了,离交稿只有20分钟,没办法,只能牺牲排版美观性直接从Typeora里面粘贴模型了,模型贴好了,后面的只能粗略地看看改改了,改完导出为pdf,距离交稿还有5分钟。pdf给队友们发一份,就直接交了。
到距离交稿只有三分钟时,J同学发现我排版出了大问题,两个问题的符号说明不在一起!我就开始极限运动,复制,粘贴,淦,怎么粘贴成了这种样子?我不会word啊。。。粘贴之后表格里面内容都有偏移了,我又啥都不会,没办法,只能用空格抵消偏移,一番操作,导出为pdf,距离交稿只有几十秒了。赶紧把邮件发过去了。发的时候,没到时间,投递完成的时候,时间已经过了。。。。
凡是在交稿截止时间之前交的论文都有自动回复,我第一次交的收到了回复,第二次没收到,第二次是无效的,搞不好因为第二次无效两次都无效,因为规定一个队只能交一份,更新要撤回。两次邮件我都不敢撤回,前面的撤回了后面的真不认怎么办?后面的撤了玩意认岂不是血亏?罢了,最坏打算,都无效,明年再来。洗洗睡。
前两天,放榜,居然是二等奖!
这波比赛让我明白的最大的道理是,网络永远取代不了线下交流。如果是线下打,绝对不会出现这种沟通失误。不过,有什么方法能避免这种事故再发生呢?我第一个想到的就是Git。不过,这玩意用来管理论文和代码到底行不行,好不好,还得再研究。还有一个沟通问题得怪我自己,其实我是闷声写代码的,我在写代码的时候togotoo也在研究代码问题,我们互相不知道,这也一定程度上浪费了时间造成了之后时间的紧张。
如果采用蚁群算法,结合togotoo的建模水平和J同学的论文水平,结果也许还能更好。没有用,是因为我不会,当初只是了解了一下,没有写过。这给我的学习敲了警钟,凡事都得要实践,不实践怎么知道行不行?
再者,或许我真该考虑学学office了。一直以来,我过度依赖Typora和Mardown语法,一定程度上造成了这次的翻车。
还没结束,明天开始就是国赛培训了,国赛培训的笔记我应该也会以博客的形式写出。吸取教训,认真学习,希望国赛有个好结果吧。
作者临时交论文发现公式排版出问题可太真实了
今年国赛,最后那晚提交pdf那会,我们也是因为更改整篇论文字体,发现最后公式有大有小(因为是两人组队没有用latex),最后那会简直了,极限修改公式操作,最后没改完,结果出来还有省一,唉,大学最后的比赛了……
?阿这 我怎么感觉你应该多学一下latex呢。。。。latex还是很有用的 尤其是写毕设文档之类的时候 代码和公式用word都太难顶了