2019华为软件精英挑战赛 思路分析
队名:西北小靓仔
初赛成绩:西北21名
复赛成绩:西北24名
决赛无缘参加。。。
代码GitHub:https://github.com/qwqwqw110/2019CodeCraft
赛后总结:https://www.cnblogs.com/qiang-wei/p/10705479.html
求轻喷
初赛思路分析:
1.根据地图信息创建双向图。
道路权重 = 道路长度 / 道路车道数。 再将道路权重进行归一化,让基础权重在0和10之间。
2.对车进行预处理(排序),确定发车顺序。
现将所有车按照发车时间排序,再按照速度从大到小的顺序排序。先发快速车,再发慢速车,减小慢车对快车的影响。
3.根据双向图利用Dijstra或者Floyd确定车的路径。
初赛采用的Floyd算法求最短路径,时间复杂度较高O(n3), 正式赛中数据集增加了很多,导致我们的运行时间增加了上百倍,模型是基于调参的,七分钟左右的运行时间让我们顶不住,参数没有调到最优。复赛中换成了Dijstra算法,运行时间大大减小。
4.每一辆车经过一条道路则为此道路增加权重。
在代码中有一个道路容量的概念,道路容量 = 道路长度*车道数。当有一辆车经过一条路时,为此条路所增加的权重为:拥挤度权重 = Q / 道路容量。其中Q为我们定义的一个常量,需要根据地图信息进行调整。我们初赛和复赛都是用的Q = 200。
关于道路权重:
道路权重可以分为两个部分,其中一部分是我们在1中初始化的一部分权重称为基础权重,也就是和道路本身属性相关的,这部分权重与车经数量无关。另外一部分权重是车经过道路带给道路的影响,可以称之为拥挤度权重,其定义如上所示。最终权重为这两部分权重之和,根据总权重确定最短路径。
5.权重挥发。
即除了道路本身所具有的的权重,后来增加的权重都具有挥发性,让其以一定速率进行挥发。
第二部分权重 拥挤度权重 所带给道路的影响是有时间的,当车驶出这条道路时,这部分权重就需要减去,但是我们没有判题器,无法判断车什么时间走完这条路,所以定义了一个权重挥发的概念。在代码中我将其定义为常量Dec = 0.85;
时间片每增加一个,让这部分权重挥发一次:挥发后的总权重 = 基础权重 +(挥发前总权重 - 基础权重 )* Dec;
其中Dec需要根据不同的地图进行调整,也可以定义为变量,根据车经过路的时间长短改变Dec。
6.发车策略。
将车按照时间、速度排序之后,简单的按照时间片分批发车,每发出一辆车更新一次权重,每增加一个时间片挥发一次权重。
复赛思路分析:
复赛由于事情较多,耽误了一些时间,也没有想到好的解决方案,只能继续采用初赛的模型。
在初赛的基础上做了一些较小的改变,就去参加比赛了,惨败而归。。。
1.车先根据时间排序,在根据速度排序,最后根据优先级排序。保证先发优先级较高的车。
2.关于预置车,到预置车时间点就让它发车,之后再继续发非预置车。
花费的努力和所获得的回报是成正比的。
今年到此结束,明年再战!