Skip to content

StormrageZ/Huawei-CodeCraft-2019

 
 

Repository files navigation

判题器

  • 完整运行一次用时在1s以内
  • 支持单时间片运行
  • 记录了一些路况信息,如道路在某时刻的车辆数,路上车辆的平均速度以及车辆通过道路的平均时差 (时差定义为真实用时与预估用时的差)

调度器

  • 主要思想是按照时间片枚举,对于非预置车辆,二分当前时刻发车数量,用判题器检测是否可以发车。通过限制单时间片的最大发车数量以及二分次数减少计算时间
  • 每个时间片的候选车辆按照规则排序,优先发送:1. 优先车辆; 2. 预计发车后可能导致te增大的车辆; 3. 车速慢的车辆; 4. 预计用时长的车辆
  • 判题器对象ahead维护未来路况,用于规划路径
  • 判题器对象current维护当前路况,用于在发车失败时快速回到未发车状态,无需每次都从0时刻跑判题器
  • 规划路径采用Dijkstra算法(伪最短路,因为边的权重是动态的)
  • 路权计算比较玄学,建议直接看代码。主要思想是预估车辆驶入到某条道路上的时刻,用ahead查询前后的路况信息(如路上车辆数),结合车辆自身车速,道路和路口属性等因素计算出道路和路口的cost,再和预计通过道路所用的时间进行加权得到最终权重

关于需求更改

  • 为了防止写出新bug,只做了一些简单的处理。修改预置车辆时间均直接改为计划出发时间,修改路径均改为最短路。
  • 对每一辆预置车辆,比较其预置路径预计用时+计划出发时间与实际出发时间+最短路预计用时,选择预计最终到达时间较小的方案
  • 有两种排序方案: 1. 优先修改修改后预计到达时间减少最多的; 2. 优先修改未修改前到达时间最晚的
  • 排序后,二分修改的预置车辆数,如果不会出现死锁,就尽可能地修改更多预置车辆
  • 两种排序方案取使得只跑预置车辆的te较小的

关于优先车辆

非优先车辆发车太多可能会把优先车辆堵在路上,导致最终成绩很差。因此我们引入了唯一的一个可调参数margin,用于限制优先车辆的tpri,保证其与预计tpri的下界的差不会超过margin。第一次运行不设限制,确保有answer生成,然后对margin二分,期望找到更好的answer

关于车牌识别

我们的方法非常简单,就是用pytorch自带的resnet-34模型训练一个端到端的网络。准确度大概在98%左右,希望和99%的大佬交流一下

其他

  • 在规划路径时,路况只考虑预置车辆以及在本时刻之前已发车的非预置车辆,没有考虑到本时刻及之后发车的非预置车辆
  • 设想过在预计车辆通过道路的时间时用机器学习模型,不过因为我们是C++不太方便,所以没有尝试过
  • 欢迎大佬们开issue讨论,或者留下自己repo的链接

About

2019华为软件精英挑战赛,杭夏赛区-咕咕咕,决赛冠军

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C++ 68.5%
  • Jupyter Notebook 16.7%
  • Python 14.8%