2019年华为软件精英挑战赛,京津东北赛区初赛第13,复赛第18,呦车还没我跑的快。
历时一个多月的华为软件精英大赛落下帷幕,很遗憾的止步了三十二强,从初赛到复赛更改了大大小小的版本将近50多个,通过改进调度算法、发车策略、路权系数、架构等几方面对自己的算法进行了无数次的改进。终于抽出时间把自己的算法整理一下:
算法大致流程图:
调度算法:
调度算法的选择是我们刚开始遇到最大的难题,最开始我们使用时Dijkstra
算法进行车辆路径的规划,算法复杂度为O(N^2),调度的过程中对每个时间片未出发车辆的路径根据实时的路况进行重新的调度。所以该算法的复杂度对我们而说在15分钟的时间内是不能完成比赛的,解决的办法是:采用SPFA
算法,该算法是对拓扑路径的改进,算法复杂度为O(N+E)。通过改进前后对比,一万车辆的数据从半个小时降低到2分钟左右。(注意是每个时间片重新规划一次,所以时间还是比较长)
其中路权系数的设计:
![](https://i-blog.csdnimg.cn/blog_migrate/dfc01966c5a222aeeb0acafa7da092a3.png)
其中channel
为当前道路的车道数,length
为当前车道的长度,v_slow
为当前道路上速度最小的车辆,n
为当前道路上的总车辆数,β
为可调节参数。
发车策略:
- 将车辆分为优先级车辆和普通车辆,将两种车辆集合分别进行排序,首先将车辆按计划出发时间排序,计划出发时间相同的车辆按照起点均匀分布排序,以保证地图各道路负载均衡。
- 每个时间片T控制发车的数量为:
![](https://i-blog.csdnimg.cn/blog_migrate/a4ae68fa1e8ce442248d5f3c121264d7.png)
其中a
为自适应系数,代表未出发车辆的比例,S
为总车辆,同时对每个路口进行循环发车。
回溯解锁:
死锁状态判定:
当前时间片等待状态的车辆在两个循环内保持不变,即认为死锁。
死锁解锁策略:
因为实时更换路径当存在死锁便将所有的状态恢复到上一时刻的状态,并且判断是否可以成功解锁,如果可以就继续,否则找到死锁车辆修改路径信息并且锁死,回溯到0时间片重新调度。
`
总结:
这次比赛整体上来说,体验还是很不错的,在这里感谢两位队友,各种嗨皮各种玩儿。为什么会取得一个不让自己满意的成绩呢?我总结了以下三点:
- 动态实时规划路径,跑一个时间片规划一次,首先时间成本上去了,相对的调整代码的时间就少了。
- 动态实时规划路径时,调度算法嵌入到了判题器里面,对判题器作出了大量修改来满足实时调度的要求,增加了出错的概率,其实我们最后死就死在这的,找不到嵌入判题器的bug。
- 虽然这次比赛感觉不是很难,但还是对自己的脑逻辑提出了很大的挑战哈哈,讲道理就是费脑子,整体逻辑太繁琐。
我们的实时调度算法也有很大的优点,一是肯定能跑出结果,二是在嵌入判题器不出bug的条件下,结果就一定是正确的,在复赛我们用我们的算法在练习的时候就跑到了4000+的成绩,奈何一个bug误终身,还是卡在了复赛现场,遗憾呐!!!!!!抛开这些,比赛给我的技术和思维带来了很大的提高,增涨了很多的见识,认识了很多参赛以及华为的大佬,还结识了华为一位非常nice的学长!!!!
十分珍惜这段时间,期待还有下次,然而马上要毕业了!后悔这么晚才认识这个比赛,早干嘛去了!!!!