2020中兴捧月算法精英挑战赛-迪杰斯特拉派初赛(未来城市物流系统)总结

疫情关系,导致科研一直没法开展,老板着急,自己也无所事事。在清明过后看到了中兴的算法精英挑战赛,然后就开始了算法之旅,这里自己做一点总结,为自己以后争取点教训吧。

数据分析的重要性

这次比赛真的让我体验到了前期工作的重要性,因为这次比赛是我第一次单人赛,像去年参加华为软挑时都是有队友的,很多前期题目解析、数据分析的工作都由他们完成了,我也主要是在他们的思路之上思考算法。所以这次比赛,我前期工作并没有做的很充足,拿着题目就开始写代码了。根据门派名字就知道,肯定是和迪杰斯特拉算法有关,而且和去年的软挑有一定的相关性,所以上手也很快。所以自己前期就找了个最简单的算法,那就是将每一条路径经过的每一个点,拣货员都减二(具体规则参考中兴算法大赛),如下面这样,Z0,Z5站点人数减一,Z1,Z2,Z4站点人数减二。

2020中兴捧月算法精英挑战赛-迪杰斯特拉派初赛(未来城市物流系统)总结_第1张图片

这样就根本不需要考虑站点路过货物的复杂情况。就这样后面修修改改,终于通过了,分数40分左右。分太低,后面开始调优,从拣货员开始分析了各种情况(这个后面会讲到),然后分数依然不高,直到后面中兴大佬讲了节题目的分析课。中间提到了对输入数据的处理,比如按重量大小排序、进行源宿站点货物合并等。听完之后简直是醍醐灌顶呀,这让我想到了去年的华为的比赛,那次比赛我们对输入数据的分析简直到达了“丧心病狂”的地步,这也让我们在武长赛区练习赛一度霸占前几名(可惜最后还是翻车了,这就叫夜郎自大吧?)。于是我捡起了熟练的数据分析方法——excel表。

通过将数据导入到excel表中,慢慢摸索数据的特点,发现同源同宿的站点都十分地多,有些更是达到20个以上。这时候才认识到直通场景(在货物经过某站点时,由于前后车厢号未发生变化,因此货物未发生变化,所以不需要拣货员)的重要性,意识到前半个月的工作基本白费。害,磨刀不误砍柴工,诚不欺我啊。没有气馁,开始处理数据改代码,前前后后、断断续续花了两天时间终于改完了,效果显著。

是的,数据分析真的很重要,我们要对输入的数据的特点做一个全面的分析,才能写出更合适的代码。 不会跑偏,浪费时间。具体需要什么要素就需要看看题目的要求了。

数据结构的重要性

数据结构确实重要,这也是我出现的问题之一,在最开始,我就用最简单的数据数据来保存数据,比较多的一维数组、二位数组,甚至三维数组,这里是方便了很多,也很快写出了代码。可是埋下了很大的隐患,导致后面出现内存不够(要求内存限制在1个G内),改了俩天简直改吐血啊。这时候我才意识到数据结构的重要性,后面就开始建立类对象来保存数据,使用STL库。也算是解决了内存出现的问题,这也算是比赛的一个收获。

此外在后续完善代码时,在轨道是否有货物、车厢有哪些货物等都需要再加标志位,这样面向对象编程的优势就真的显示出来了,我并不需要修改其他参数,只需要在类中加个参数就行,而且特别号管理,害,原来是这样啊。

算法

这次比赛算是了解了很多算法(虽然好多都没有实现...),像Ksp、启发式算法都是之前没了解过的。很可惜见识短了,前期了解了这个算法却没有去实现,直到后面发现只使用迪杰斯特拉算法求出路径确实有缺陷。后面时间不够了也就来不及更改算法了,有点可惜,鼠目寸光,我估计着复赛可能要凉凉。

这里面最复杂的就是拣货员的安排问题,估计着大概写了四百行的样子,判断加计算。所幸自己都搞出来了,这也算是很爽的地方,给我的感受就是不要急,慢慢来,把所有的情况都画出来,考虑周全。

总结

初赛排名不是很理想,有点可惜,本应该可以做到更好的,就先到这吧,不过确实学到了很多东西,前前后后改改写写估计着写了三四千行代码,而且是个人赛,算是极大的锻炼了自己,认识到了自己的不足,以后注意吧,希望自已以后加油,还有很多事等着我!

你可能感兴趣的:(数据结构与算法,C++相关,中兴,算法精英挑战赛)