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

题目介绍

赛题链接 https://codecraft.huawei.com/GeneralIntro

赛题的意思就是对车辆的调度,对于达到的每一辆车,规划它的出发时间和经过道路。使得总调度时间最小(最后一辆车的到达时间减去第一辆车的出发时间)。题目对自己的交通规则描述的非常复杂,其实在前期可以先不管这些交通规则。

题目还提到由于车辆过多,会陷入一个车辆的死锁状态,也就是常见的堵塞,选手需要能够检测到死锁并打破这个死锁,避免拥塞。

项目思路

经过上面的分析,可以得出,选手的工作主要是这些:规划车辆的出发时间和行驶路径,同时需要避免道路堵塞或者道路堵塞后能够疏通。在后面的比赛中,发现㘝需要检测并打破堵塞的话需要根据官方的交通规则来实现一个虚拟的道路模拟器,这太难了!所以全程我们都在考虑拥塞避免的方法。我们的方法及思路如下:

1 最短路径

给每一辆车计算出它的最短路径(使用dijstra),出发时间就是当前时间,当然这样肯定会使得道路发生堵塞。于是我们使用了一个非常简单的方法,给每辆车的到达时间加上一定的延时作为出发时间。最开始设定的是0到3000内的随机延时,后面不断调小可以达到缩短到1200内的随机延时 。这种方法在可以达到1400的成绩。

2 高速路和低速路分开    

由于题目中的道路有限速,限速为4,6,8。而车辆的最高速度分别有2,4,6,8.如果高速车到了低速路会极大的影响自己的到达时间。如果低速车到了高速路则会影响到后面的高速车辆,从而有可能引发拥堵。所以我们把6,8的道路划分成高速路,4,6划分成低速路;2,4的车辆划分为低速车,6,8的划分成高速车;高速车只跑高速路,低速车只跑低速路。有人会担心车辆分布不平衡或者道路分布不平衡的问题,比如低速车辆很多,高速车辆很少,这样的话道路利用不平衡。实际发现,不同限速的车辆和不同速度的道路分布都是随机的。

这样的话会导致另外一个问题。某个节点周围只有高速路,没有低速路,这样的话低速的车辆将不能到达这个节点。这种情况是由于图不全连通造成的,也就是说高速道路的网络连通分量不唯一,任意2个节点不能互相到达。我的解决方法是这样的:计算出高速网络和四度网络的连通分量,以及每个连通分量中随机的一个节点,如果连通分量不为1,则开放连通分量中某个节点的所有边。

结果发现这种方法效果一般,只能达到2200左右成绩,说明这种方法存不太好。

3 道路限行

道路限行的方法很简单,来源于实际生活。意思就是某个时刻道路最大只能容下N个车辆。实现的方法如下。

1、找出所有车辆的最短路径

2、设定一个优先队列,设定固定的容量。对车辆的出发时间排序,计算出车辆的用时

3、加入当前是t时刻,对到达时间为t的车辆出队。入队按到达时间排序的车辆,并计算出他们的出队时间t+use

4、依次往复,直到没有车辆。

实际效果一般,和随机延时的差不多。

4 列举出所有最短路径

由于所有的车辆选择的都是最短路径,很容易造成道路的堵塞。列举出所有的最短路径,然后随机选择一条路径,能够一定程度上的避免拥塞。寻找最短路径只需要在dijstra的判断最优路径里面加上判断准则即可,如下所示。

            for v in range(self.node_num):
                du = d[u] + self.map[map_idx][u][v][self.time_idx]
                if (vis[v]==0 and self.map[map_idx][u][v][self.time_idx]!=self.max_num):
                    if du < d[v]:
                        d[v] = du
                        pre[v] = []
                        pre[v].append(u)
                    elif du <= (d[v]+3):
                        pre[v].append(u)

我的代码

代码写的可能不够规范,有问题的地方欢迎交流。

https://github.com/dayL-W/2019-Huawei-Codecraft

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值