2019華為軟件精英挑戰(zhàn)賽初賽總結(jié)——思路及開源程序

剛參加完人生中第一個程序設(shè)計比賽,雖然沒有進(jìn)入復(fù)賽,但是還是感覺有所收獲的辩昆。在這里把成果分享一下,也算給自己一個圓滿的收尾旨袒。
初賽訓(xùn)練地圖的調(diào)度時間是2000以內(nèi)汁针;比賽地圖代碼提交慢了,不過調(diào)度時間也比較長砚尽,將近10000施无,沒有充足的時間來調(diào)試,所以輸?shù)眯姆诜毓隆2贿^怎么我們隊也是江大獨苗嘛猾骡,也進(jìn)過前20?(? ???ω??? ?)?,爭了口氣敷搪!
代碼貼在Git 2019HuaWei--JZE
這是一個車輛調(diào)度問題兴想,文件資料我也貼在Git上了,大家可以自行鉆研赡勘,這里就不解讀了嫂便。


首先實現(xiàn)將道路(Road)通過路口(Cross)信息連接起來,獲得地圖完整的道路狀況闸与,如某條道路起點在那個路口毙替,終點在哪個路口曼振,前后各能通向哪里等。
道路信息顯示

這里實現(xiàn)的邏輯如果從程序看上去蔚龙,是比較復(fù)雜的冰评,首先我們給出Road、Cross和Car的三個類定義:

class CROSS(object):
    def __init__(self,ID,road1,road2,road3,road4):
        self.ID = ID
        self.road1 = road1
        self.road2 = road2
        self.road3 = road3
        self.road4 = road4
   
class ROAD(object):
    left_road = None
    right_road = None
    stright_road = None
    back_left = None
    back_right = None
    back_stright = None
    all_right = 1
    def __init__(self,ID,length,speed_lim,channels,cross_begin,cross_end,isDuplex):
        self.ID = ID
        self.length = length
        self.speed_lim = speed_lim
        self.channels = channels
        self.cross_begin = cross_begin
        self.cross_end = cross_end
        self.isDuplex = isDuplex
        
class CAR(object):
    now_post = None
    def __init__(self,ID,start_loc,dest_loc,speed,start_time):
        self.ID = ID
        self.start_loc = start_loc
        self.dest_loc = dest_loc
        self.speed = speed
        self.start_time = start_time
        

然后讀取訓(xùn)練地圖的信息:

cars = pd.read_csv(r"C:\Users\Administrator\Desktop\JZE\1-map-training-1\car.txt",skipinitialspace = True)
roads = pd.read_csv(r"C:\Users\Administrator\Desktop\JZE\1-map-training-1\road.txt",skipinitialspace = True)
crosses = pd.read_csv(r"C:\Users\Administrator\Desktop\JZE\1-map-training-1\cross.txt",skipinitialspace = True)

然后創(chuàng)建三類對象鏈表木羹,其中甲雅,在初始化Cross對象時進(jìn)行Road道路信息寫入

car_dict = {}
for car_info in cars.iterrows():
    car_dict[car_info[1][0].replace("(","")] = CAR(car_info[1][0].replace("(",""),car_info[1][1],car_info[1][2],car_info[1][3],car_info[1][4].replace(")",""))

road_dict = {}
for road_info in roads.iterrows():
    road_dict[road_info[1][0].replace("(","")] = ROAD(road_info[1][0].replace("(",""),road_info[1][1],road_info[1][2],road_info[1][3],road_info[1][4],road_info[1][5],road_info[1][6].replace(")",""))

cross_dict = {}
for cross_info in crosses.iterrows():
    the_cross = cross_info[1][0].replace("(","")
    fir = str(int(cross_info[1][1]))
    sec = str(int(cross_info[1][2]))
    thi = str(int(cross_info[1][3]))
    fot = str(int(cross_info[1][4].replace(")","")))
    if fir != "-1":
        if cross_info[1][0].replace("(","") == str(road_dict[fir].cross_begin):
            if (road_dict[fir].isDuplex == "1"):
                road_dict[fir].back_left = road_dict[sec] if sec != "-1" and ((road_dict[sec].isDuplex == "1") or str(road_dict[sec].cross_begin) == the_cross) else None
                road_dict[fir].back_stright = road_dict[thi] if thi != "-1" and ((road_dict[thi].isDuplex == "1") or str(road_dict[thi].cross_begin) == the_cross) else None
                road_dict[fir].back_right = road_dict[fot] if fot != "-1" and ((road_dict[fot].isDuplex == "1") or str(road_dict[fot].cross_begin) == the_cross) else None
                    
            else:
                road_dict[fir].back_left = None
                road_dict[fir].back_stright = None
                road_dict[fir].back_right = None
        else:
            road_dict[fir].left_road = road_dict[sec] if sec != "-1" and ((road_dict[sec].isDuplex == "1") or str(road_dict[sec].cross_begin) == the_cross) else None
            road_dict[fir].stright_road = road_dict[thi] if thi != "-1" and ((road_dict[thi].isDuplex == "1") or str(road_dict[thi].cross_begin) == the_cross) else None                
            road_dict[fir].right_road = road_dict[fot] if fot != "-1"  and ((road_dict[fot].isDuplex == "1") or str(road_dict[fot].cross_begin) == the_cross) else None
   ...
   ...
   ...
            
    cross_dict[cross_info[1][0].replace("(","")] = CROSS(cross_info[1][0].replace("(",""),road_dict[fir] if fir in road_dict else None,road_dict[sec] if sec in road_dict else None,\
                                                    road_dict[thi] if thi in road_dict else None,road_dict[fot] if fot in road_dict else None)
for index,item in road_dict.items():    #以列表返回可遍歷的(鍵, 值) 元組數(shù)組
    print("當(dāng)前道路:",item.ID,"\t直行:",item.stright_road.ID if item.stright_road != None else None,"\t左轉(zhuǎn):",item.left_road.ID if item.left_road != None else None,"\t右轉(zhuǎn):",item.right_road.ID if item.right_road != None else None,\
         "\t反直:",item.back_stright.ID if item.back_stright != None else None,"\t反左:",item.back_left.ID if item.back_left != None else None,"\t反右:",item.back_right.ID if item.back_right != None else None)
 

這里為了方便理解,上面程序只貼出對于路口一的判斷來說明:
首先判斷cross中的road1的起點是否為該cross坑填。如果是抛人,那么判斷road1是否為雙向:如果為雙向,那么將該路口其他三條road分別作為road1的反向道路寫入脐瑰;如果是單向線妖枚,那么road1只能從起點通往終點,那么該路口的其他road就不能通過road1到達(dá)苍在,即road1的反向三個路口為None绝页。如果road1起點不是該cross(則該cross是road1終點),那么該cross的其他三條road邊肯定是road1的前向三路口寂恬,且能到達(dá)续誉。(大家好好琢磨一下賽制和規(guī)則,這里就好理解了)

我們畫圖來看一下:
Road信息圖解

實現(xiàn)道路后初肉,下面就是按照一個規(guī)則(算法)來實現(xiàn)道路分配酷鸦,這里提一下,聽說大佬們都用的退火做的牙咏,保持各賽區(qū)最低系統(tǒng)調(diào)度時間臼隔。我們這里就簡單了一下,所以時間比較高妄壶。摔握。。也不能說懶盯拱,就沒花時間去鉆研吧盒发,所以唉例嘱。狡逢。。追悔莫及有點過拼卵,多多少少還是有遺憾的奢浑。
這里我是按照當(dāng)前car所在cross和car終點兩個位置來作比較得到car的行駛路線的,這樣容易出現(xiàn)找不到終點一直徘徊的情況(因為不是越靠近終點的road就一定有條路通向終點腋腮,之后正式比賽更是如此)雀彼。所以如果出現(xiàn)這樣的情況壤蚜,我就讓徘徊不前的路暫時關(guān)閉,然后倒退重新搜索徊哑;如果本輪搜索不到終點袜刷,即road全部被關(guān)閉,那么重新選擇初始道路重新進(jìn)行一輪道路規(guī)劃(car的起點是cross莺丑,一個cross有多個road著蟹,所以car的起點也有多個)。
至于小車的出發(fā)時間梢莽,哈哈哈~我們就更偷懶了萧豆,抱著僥幸的心理我們是給了一個“像樣”的隨機策略來給小車安排出發(fā)時間的。
所以這兩部分的代碼昏名,我就不貼出來獻(xiàn)丑了涮雷,需要的畫直接去2019HuaWei--JZEclone吧(如果覺得還行的話,可否給個給個星星呢(*>.<))
說明一下轻局,Git上的代碼是根據(jù)比賽要求的SDK進(jìn)行編寫的洪鸭,如果你要本地跑的話,把讀取文件的地方改一下就好仑扑。


上面的是初賽訓(xùn)練地圖的程序卿嘲,比賽地圖的規(guī)模大了很多,而且cross信息也不像訓(xùn)練地圖那么簡單夫壁,所以程序也做了很大的修改拾枣,主要有如下兩點:

1.正式賽cross標(biāo)號不是越大越“遠(yuǎn)”,故需要將cross初始化的時候?qū)懮衔恢眯畔?div id="osidytc" class="image-package">
比賽地圖思路
2.根據(jù)新增的cross位置信息查找car最短路徑盒让,思路與訓(xùn)練賽相同梅肤。

決賽程序的調(diào)整和運行效率調(diào)整主要是我們隊長負(fù)責(zé)的,我理解的差不多就這樣啦邑茄,歡迎各位大佬交流討論姨蝴!
本篇屬于原創(chuàng),所以就不貼搬運工啦肺缕。


努力左医,奮斗

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市同木,隨后出現(xiàn)的幾起案子浮梢,更是在濱河造成了極大的恐慌,老刑警劉巖彤路,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕硝,死亡現(xiàn)場離奇詭異,居然都是意外死亡洲尊,警方通過查閱死者的電腦和手機远豺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門奈偏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人躯护,你說我怎么就攤上這事惊来。” “怎么了棺滞?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵唁盏,是天一觀的道長。 經(jīng)常有香客問我检眯,道長厘擂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任锰瘸,我火速辦了婚禮刽严,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘避凝。我一直安慰自己舞萄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布管削。 她就那樣靜靜地躺著倒脓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪含思。 梳的紋絲不亂的頭發(fā)上崎弃,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音含潘,去河邊找鬼饲做。 笑死,一個胖子當(dāng)著我的面吹牛遏弱,可吹牛的內(nèi)容都是我干的盆均。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼漱逸,長吁一口氣:“原來是場噩夢啊……” “哼泪姨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饰抒,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肮砾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后循集,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唇敞,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蔗草,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年咒彤,在試婚紗的時候發(fā)現(xiàn)自己被綠了疆柔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡镶柱,死狀恐怖旷档,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歇拆,我是刑警寧澤鞋屈,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站故觅,受9級特大地震影響厂庇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜输吏,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一权旷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧贯溅,春花似錦拄氯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姐霍,卻和暖如春鄙麦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背镊折。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工黔衡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腌乡。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓盟劫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親与纽。 傳聞我的和親對象是個殘疾皇子侣签,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Lesson 1 A private conversation 私人談話Last week I went to t...
    造物家英語閱讀 138,514評論 2 57
  • 乙二胺四乙酸(英語:Ethylenediaminetetraacetic acid),臣庇兀縮寫為EDTA影所,是一種有機...
    湘江北去飲水思源閱讀 8,280評論 0 0
  • 人說,如果屠宰場的外墻是玻璃做的僚碎,會增加更多的食素者猴娩。 你會看到動物們無力徒勞的掙扎,你會聽到它們?nèi)绾⑼愕目蘼暎?..
    閃亮的寫作者閱讀 583評論 0 0
  • 南方的天氣著了涼 大樹卻還裹著綠 在風(fēng)中飄揚 走過舊改的老街 聞著豆花彌漫的香味 舔了舔舌頭 咽了咽口水
    漫漫長夜看星空閱讀 226評論 0 0
  • 弟弟來了,一見面卷中,他就很自然地?fù)е业募绨蛎郧耙荒R粯樱€子長高了蟆豫,比我印象中的他更瘦了议忽,也黑了。我們...
    念伊念你閱讀 257評論 0 1