2019华为软件精英挑战赛赛后总结

先摆上最后成绩:西北赛区复赛18名 队名:心有多大路就有多宽

现在离比赛结束已经快一个月过去了,成绩不佳,老师那边也有活要忙,赛后总结就耽搁下来了。最近闲下来,所以写一写总结,当作是个留念吧。

队伍名字我觉得很棒,很符合题意,也很有哲学气息。我想出来的,哈哈,先自我吹捧一下。缘由是一开始小心翼翼发车怕堵车,可是真正发车的时候才发现随机发很多车都能不堵车,有感而发一句心有多大路就有多宽,名字也就由此而来。

本次华为的比赛,我总结一下大致过程就是:阅读理解大赛->逆向工程大赛->随缘发车大赛+调参大赛
当然这后面两项是对于我们这种菜鸡队伍来说 ,我想真正好的算法思路是不会主要依靠靠调参和随缘来提高自身成绩的。据说冠军队伍咕咕咕,复赛就调了两次,就是最终成绩了,吊打任何人。

这次比赛的题目的复杂程度对于我这种语文渣渣来说简直是灾难,还好有个爹是语文老师的队友,题目才得以完那掌握意思。

这次比赛,我被复现判题器搞趴了,初赛肝了一周搞出来一个判题器还不能完那和官方一致,醉了。好歹最后苟进复赛。
复赛官方给了详细流程图,肝了几天终于肝出一个和官方一致的判题器,结果最后比赛的时候版本搞错了,导致差点没成绩。具体我就不说了,我队友万字长文总结,待会附上链接。

这次比赛我们队伍所有判题器和程序框架编写都是我完成的,主要提高了自己的c++编程能力,不过也看到了和大佬们的差距(大佬的判题器的代码效率是我们的几十倍,也是导致我们从来都不考虑利用判题器做反馈做回溯类的算法的原因),总之,好好学习天天向上吧。

废话这么多,下面还是简要的说一下我们的方案吧
未加预置车辆可修改路径的施行方案
第一步:对全图用迪杰斯特拉求最短路径,并由此得到非预置车辆的最短路径。

第二步:对全图所有非预置车的路径进行分析:
1)得到过载路口:统计出通过每个路口的车数量,取前10%的路口作为过载路口;
2)得到需要调整的车辆:对过载路口的车辆(路径包含该路口的),分别统计其经过的过载路口数量,并降序排列,取前1/3的车辆进行修改路径。

第三步:路径修改:去除过载路口重新生成图,用迪杰斯特拉算法重新生成最优路径。对需要修改路径的车进行可行性判断,即判断出发点和目标点是否在被剔除的路口内,以及重新生成的路径长度是否无穷远(即走不通),如果未在剔除路口之列且新路径能走通则修改该路径,否则对该车不做任何修改。

第四步:
安排装车:对所有的车按照其出发路口,分别放置到对应的路口,然后分别按照车辆优先级>速度>路径花费时间的主次顺序排序(优先级大的在前,速度快的在前,花费时间短的在前)。
安排发车:按照路口顺序,在装好车(排好序)的车库里,依次取首个车(这样让发车分布更均匀一些),放到发车数组中。
发车:大体是按照一定调度时间间隔发一批车的思维发车,在发每一辆车的时候判断当前是否处于预置车辆稠密发车时间区间,如果是的话,则发车时尽量改变路径(去除预置车辆的过载路口重新生成最优路径),如果不是的话则正常发车(不改路径)。

关于预置车辆稠密分析的函数:统计预置车辆在哪些时间片上发车,并统计该时间片发车的数量。然后设一个发车数量的阈值(超过该预置判断为稠密时间点),接着判断相邻稠密时间点的间隔,如果其小于某个阈值则判断两个时间点之间的时间片都为稠密时间区间,否则两个时间点之间不为稠密时间区间。这样做的好处是可以自动适应不同数据,因为预置车辆很难和后面没有预置车辆一样发很多车。

关于预置车辆过载点分析函数:同第二步的1)

关于DJ的路权函数:len_weight =length*50/((speedlim+15)rwidth);长度50/(道路限速+15)*路宽;
同时我们对单行道的路权值额乘以15,以确保车辆尽量少走单行道(不知道为什么,就是对提分很有帮助,可能我们的方案的单行道的地方容易堵吧)

加预置车辆可修改方案
该方案由于比赛时间限制,未实践,但感觉思路可行。
具体:对预置车辆统计其过载路口,然后对于每辆预置车辆统计其路径和过载路口的重合数目,对预置车辆按照路径长度 >重合路口数目>优先级>速度的主次顺序排序(可改变其中的顺序试试),取10%的车用DJ算法重新生成最优路径。 该思路是主要是考虑到预置车辆的车可能路径故意绕远,这样挑选车来修改路径。

2019华为软件精英挑战赛赛后总结_第1张图片
方案如上,github:https://github.com/TimeChi/CodeCraft2019
具体比赛过程,我队友写的很详细,有意可以看看他的文章:
队友万字长文:https://zhuanlan.zhihu.com/p/64015069

你可能感兴趣的:(比赛经历)