隊名:西北小靚仔
初賽成績:西北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.關於預置車,到預置車時間點就讓它發車,之后再繼續發非預置車。
花費的努力和所獲得的回報是成正比的。
今年到此結束,明年再戰!