2018华为软件精英挑战赛体会(附代码参考)
从2月末了解到这个比赛到4月15好初赛正式比赛已经过去了一个多月,期间穿插了几个面试,虽然最后比赛失利,略显遗憾,但这个比赛还是很有意思的,有兴趣的可以参加,这篇博文就大致谈一下参赛经历。
比赛介绍
18年华为软件精英挑战赛没有复活赛,从3月9号官方放题到4月13日晚10点为初赛训练赛,4月14到15日中午12点正式比赛。初赛安排大致就是这样。
再来说一下我们队员,一位matlab和建模大神(这哥们可以一个人用matlab把整套流程都实现),一位c/c++操作炫的飞起的负责代码框架搭建,剩下的就是我这个渣渣队长负责算法代码编写。
官方3月9号放出的题目,今年的题目是云虚拟机的预测和布置,毕竟华为正在云计算上发力,出这个题目也并不觉得奇怪,我之前就有使用阿里云的经历,理解起这个题目来倒不是很费劲,赛题大致分两部分,一部分是预测虚拟机的数量变化,一部分是在物理机上放置虚拟机。
第一版代码
开始阶段我们队效率还算比较快(还有个同赛区的队更彪悍,11号就开源了代码),建模大神先用matlab把整个思路流程跑了一遍(不得不说matlab的库函数是真好用,最后大神写出来的代码简洁而高效),另一个队友整个框架迅速搭建完了,算法方面我们使用二次指数平滑法进行预测,自己想了一个类似于贪心算法的放置算法,这个放置算法还是蛮靠谱的,利用率一直都是95%左右,有了matlab的检验和参考,核心算法我也很快写出来了,整个第一版的代码在一个星期内搭建完毕,怀着试一下的小激动,我们上传了代码,20分(小伙伴都傻眼了),不过不要紧,第一版代码主要目的还是测试整个流程(框架、开发、提交),经过我们的参数调整分数一下子上升到了70多分。
至此第一版代码就开发完成了,接下来就是换各种牛x的算法………
等着排名往下降
后来就是不断进行版本的迭代,提前找好指导老师,并不希望老师能太多的参与进来,老师的想法和思路很有借鉴意义,有个老师提出了用贝叶斯概率模型进行预测(原谅我听懂了你说的啥,但不会写呀),预测方面我们打算试一下LSTM,bp神经网络,RNN神经网络;放置策略上各种启发式算法解决背包问题,最后两两搭配、逐一调参(注意:这是理想情况),事实是,写这些算法都需要查阅大量的资料、论文,先看懂原理,再找到参考代码或者伪代码(ps:今年华为官方查重和代码抄袭挺严格的,不要抱着侥幸心理),然后自己写,这期间小伙伴们几乎每天都会盯着排行榜看,看着排名一点点往下降,到最后上榜都需要78分了。
然后,然后排行榜上就看不到我们了。
重回排行榜
当时武长赛区的竞争太过激烈,85分都排不上前20,队友都感到不能再这么下去了,是时候搞一波公关了,碰巧队友认识的一个研究生学长也在做这个比赛,于是我们去交流了一波,研究生学长他们也是70多分,我们相互
公开了思路,学长他们的去噪方法给了我们很大的启示。官方给出的数据集里面是有一些噪声点的,而我们此前并未进行数据处理,当采用了均值滤波的方式进行数据预处理之后,分数一下子往上升了7分,我们又重回排行榜了!
不来一点意外怎么行
比赛进行到3月下旬的时候,各大赛区的竞争都开始进入了拉锯战,最高分94左右,倒是最低分一直在刷新,打破这一局面的是京津冀东北赛区一大神,他直接上95分,当时写代码的时候我们队就开玩笑说,要是谁能上95,我们就去告发他提前掌握了答案,结果就打脸了。可能连官方都觉得这不科学,于是下午意外就发生了,官方发现判题系统出bug了,进行了修改,结果几乎所有人分数都降下来了,普遍降8分,官方也没有将所有的代码重新跑一遍更新排行榜,于是就出现了排行榜上新分和旧分共存的现象,大家都不知道自己的真实排名,场面一度混乱,几天后所有代码才重新判了分。anyway我们的分数又降回了77分。
高端算法一定好吗
到4月初的时候,LSTM, RNN神经网络,BP神经网络还有启发式的放置策略总算都写出来了,但不论怎么调参始终突破不了现有的分数,各大赛区的交流群里面也有人说神经网络比不上平均数预测,但也有的人用神经网络的方法取得比较好的结果,造成这种情况具体原因不是很清楚,总之我们这边智能算法算是彻底凉了。
4月初到正式比赛前,排行榜的底线也是不断刷新,到最后,6分的分差卡了64个人,分数分布太过密集,基本上就是1分干掉10人。
到了比赛前一天晚上,我们队三个人决定商量一下明天比赛的安排顺便优化一下代码(完善了放置策略,试了几个随机数),谁知道这一优化上到了81分,练习赛截至时到了29名。
这不科学
同组那个matlab大神晚上不睡蹲点,00:40的时候在交流群里面发消息,我们的高级用例蹦了2(第7和第8两个用例)。
我是第二天早上8点才知道这个消息的,当时各大赛区交流群里面出现最多的问题是用例3,6,9崩溃,我们这种情况还是独一份,也没谁可以交流参考(mmp,无fuck说),接下来开始各种随机盲调,负责搭建框架的伙伴以为是框架原因(框架确实存在一点瑕疵,但并不影响大局),一上午我们就用掉了3次提交的机会(正式比赛每天只有5次机会)。到了下午还是一点头绪都没有,我和matlab建模大神决定必须先在本地将错误复现出来,官方给的训练数据大概只有3000条,我们将数据扩充到9000多条,本地运行还是正常(整个debug过程一度陷入停滞),妈的,那时大家都没啥信心了,毕竟已经晚上7点了,硬着头皮往前搞,我把代码转移到ubuntu上,想完全模拟官方的判题环境。在复制训练数据的时候,一怒之下多复制了一把,数据量直接上12000了,巧的是,数据量一上万,程序运行就出错了,出错了,他娘的终于出错了,我找了一天的错误呀,segment fault,这个错误一般是由于数组越界,访问了不该访问的内存空间导致的,后面的工作就是定位错误、改正了,具体过程就不细说了,也是经历了一段波折,最后改了一波不知道是不是错误的错误(我们检查了一遍代码,并没有出现数组越界),大概晚上9点左右的时候9个用例都运行成功了,小伙伴心中斗志重燃。
一盆冷水
可能这套代码已经备受蹂躏,禁不起在折腾了,我们队一个多月练就的丰富的调参实战经验在这里完全不起作用,越调越低,直到第二天所有调试机会全部耗尽,分数定格在222分。
当无奈把代码提交上去的时候我们心里就已经没抱多大希望了。(毕竟即使所有用例都跑过了,还是不知道当时那个错误为什么会产生,不是数组越界问题,这才是整个过程中最令人感到无力的)。10个小时转瞬即逝,等着官方晚上10点公布最终排名吧(ps:今年的正式比赛是看不到排行榜和自己排名的)
尾终
华为临到终了还来了一个小插曲,15号晚上10点的时候官方发布公告称:由于存在较多代码重复和抄袭,专家正在连夜进行排查和相关同学求证,结果延期发布。what????专家难道不睡觉的吗,今天周日耶!!结果是第二天中午出的,大略的看一眼,入围分数228,之前练习赛排在很靠前的几个大佬也没进复赛(也有可能是改队名了)。
多么痛的领悟
这次比赛启示和教训还是挺多的,第一次参加codecraft,没什么经验可说的,还是说说感受吧!
- 队员之间一定要选择相同的开发环境,这次我们队就躺过坑,我是gcc4.8.1 建模大神gcc4.9.2另外负责框架那个的用的是vitural studio(不知道vs上的编译器是什么),练习赛期间就发生过vs和gcc编译结果不同的情况,正式比赛debug时gcc4.8.1和4.9.2也分道扬镳了。。。。。
- 引入版本控制,版本控制这东西之前就会,可是没怎么用过,这次比赛全去优化算法去了,也没用上,结果本地保存的代码就成这样子了。
版本控制虽然前期会显得比较麻烦,但后期决定可以帮助团队提高效率。 - 代码的鲁棒性,比赛当天很多队的代码出现3、6、9用例崩溃的情况就是读取数据时处理空格和\r\n方面不够健壮(这原因还是官方的专家提示的,因为实在太多队出现这种情况)
大三狗,第一次参加这个比赛,大学三年中实战性很强的比赛也很少参加,还是理论学的居多,希望我的经历能对后来者有所启示,最后感谢同组两位大神的配合,贴上我们的代码,凑合着看吧,大佬们轻打!!!