经过一个半月的比赛,终于在四月的尾巴结束了华为软挑,从结果上来讲是超过预期的,一开始没想到能苟进决赛圈,不过最终开玩笑深圳三日游真的就三日游了呀,还是有点小不甘心,不过技不如人,甘拜下风。写这个博客希望能对未来参赛的同学一点借鉴。
具体的代码就不放了,因为我今年在准备的时候也尝试着去看往年的题目和开源代码,老实说,除非你愿意花很长时间来准备,不然效果真的很有限。
今年比赛大致有这么几个难点:
1)万恶之源判题器:主要是在初复赛阶段,实现与官方完全一致的判题器,官方的规则是真的又细又长。
2)建模:一般来说都选用对道路加权之后利用路径搜索的逻辑,建模的核心就在于怎么赋权了,路长,限速,通道数,车辆数,考不考虑,怎么考虑(线性,指数,对数),优先车和预置车的权值和普通车一致吗?
3)死锁:怎么判定死锁(一般都是采用判断道路上车辆状态一次调度不变作为死锁标志),解不解死锁,解的话一般都是采用回溯改路径的方法,那么又涉及到怎么改路径(不能影响其他车的优先级),回溯几个时间片。
4)发车策略:理论上肯定是优先车先发,能发尽量发,但是发车也有很多种,按速度发,按路口发,伪随机发,还要考虑发多少量。
5)动态规划:已经上路的车要不要改变路径,什么时候变(死锁时还是每隔一定时间),发车数保持不变还是动态调整,依据什么调整(道路上总车数,路口通过车数)
以下是一些经验与教训:
一、语言
一般的招聘广告都是这么写的,“精通C++,JAVA,PYTHON中的一种”,那么到底选哪种,理论上肯定是哪种玩的最溜选哪种。但是,我强烈不建议PYTHON,为什么,真的太慢了。到决赛时,大家都是完全一致判题器,都是动态规划回溯解死锁,但是,同样的逻辑,python跑一遍时间大概是c++的5-8倍,这会出现什么问题呢?大赛的运行