2019华为软件精英挑战赛比赛经验分享(初赛,复赛,决赛)

比赛成果:

初赛(700+):西北赛区第3。

复赛(32):西北赛区第3。(华为手机v20,华为面试绿卡,西北赛区二等奖,小礼物若干)

决赛(32):全国16强,具体排名13。(没有奖金,纪念品若干,旅游三天)

主要的发车策略:

一秒N辆车上路

软赛经验:

初赛阶段:

初赛赛题公布在3月9号,我们在3月9号凌晨就分析了一波赛题,由于之前刷Leetcode的经验,很容易看出本次的主要算法是迪杰斯特拉单源最短路径算法,用这个算法可以容易地得到某辆车从起点到终点的最短路径,道路权重一开始设置为时间,于是利用迪杰斯特拉算法可以轻易得到单量小车的最短路径。

路网的建立,如果之前刷多了Leetcode的图相关算法的话,会很容易发现官方给的道路,结点相关的txt文件中的数据是非常友好的,直接存储在vector即可轻松构建地图,所以没有做到这一步的小伙伴们可以认为是Leetcode刷少了。

题目中有个非常重要的信息,循环等待(死锁)问题一旦出现则判负,因此避免死锁问题是很重要的。另外每辆小车有计划发车时间(planeTime)和实际发车时间(beginTime),且任务书上提到planTime<=beginTime,这就意味着,小车的发车时间可以推迟。这一点非常重要,这就意味着存在最low的能有成绩的算法,一辆一辆跑,每时刻地图上只有一辆车,这样一来就不可能死锁了。。。

当然,光靠一辆一辆跑,是不可能取得好成绩的,不过由于实现简单,可以验证一下提交的流程是否正确,比如SDK的打包,输入输出,DJ算法,图的构建是否有明显的错误,由于一开始不太习惯官方的打包,这个也弄了一个下午,最后官方系统才出成绩,然后我们才考虑下一步的优化。我们发现,所有车取最短时间的路径极易造成拥堵,因此我们的方案选择是让有一些车适当绕路,当然这一点不是人为设置,也是依赖于迪杰斯特拉算法的改动。之前只考虑时间最短的话这个时侯的路权w = t,如果把通过某一条路的代价w = t + a*num,其中num是已经使用这条道路的次数,这就类似与动态规划的问题,随着某一条道路使用次数越多,后面的车通过这条道路的代价越高,而此刻的迪杰斯特拉算法是为了求解最小代价这样的一个最短路径问题,这样一来就能实现自动绕路。

本次比赛主要的目的是让最后到达的小车时间尽可能小,我们实验室是学物理的,我们一开始也没有调度方面的经验,还想着给出N个小车的路径,在数学上求解到达时间t,这就是所谓的解析解吧,一开始认为存在第一能动车辆,所有车的运动都要因为第一能动车运动之后才能运动,然后问题就变成广度优先算法。很显然过了几天还是解不出,直到自己推翻了自己的想法,就是环流,环流中没有第一能动车辆。这个时候说实话有点慌了,因为这就意味着花了一个礼拜,没有任何效果,但是我们没有放弃。

随后仔细查看任务书,发现官方在给定小车路径的时候是有调度的交通规则的,我们一开始并没有认识到交规有什么用,开始看到群里很多人在讨论交规,都不太理解为什么,还是比赛经验太少所导致的。仔细看了任务书之后,发现求解N个小车已知路

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值