【之前的文章】最後一千米極速配送 - 阿里雲算法大賽總結git
總結一下新的教訓github
1.因爲都是NP難題,得到最優解用常規的方法很是困難,對於不是算法科班出身的人來講,首先應該到網絡上尋找一下論文,是否有一些好的經驗。
2.保持日常心,這種比賽獲獎很困難,生活仍是要和往常同樣,只是將空餘的時間給作比賽
3.每個小功能,小函數,儘量作一些簡單的單元測試,這種題目每每代碼最後很是複雜,難以調試,不作單元測試,可能之後調試都很困難
4.熟悉使用語言的多線程工做方式,例如C#的多線程特色
5.尋找好的計算資源,儘可能在多核CPU上運行
6.加入官方羣,問題及時和官方討論
7.利用晚上進行大規模的迭代測試和參數實驗
8.中間結果保存,減小每次執行時間。
你們都是爲了獎金去的(TOP10都有獎金),TOP17的名次,和本身實力符合。算法
另外此次全程使用VS CODE 和 NET CORE 2.0 寫的代碼,在公司的PC和家裏的MAC上經過GIT無縫銜接,體驗不錯。
代碼:https://github.com/magicdict/AIForAirline
賽題:https://tianchi.aliyun.com/competition/information.htm?raceId=231609網絡
一我的作題目頗有趣,可是組隊也不錯,有人願意和我組隊參加第二賽季嗎?難度增長很多的。前三有獎金,固然若是沒有奇蹟,基本上拿不到獎金的。多線程
附上之前比賽經驗:
窮舉部分應該最後加入
通常來講,算法題目總歸缺乏不了排列組合的嘗試,可是若是過早的在算法中引入了排列組合的大規模計算,則每次代碼運行時間會很長,很是浪費時間。這裏能夠有兩個方案,第一,能夠作一個系統配置項,是否啓用排列組合的嘗試;第二,能夠將排列組合的強度也作成一個配置項。
所謂的排列組合的強度,就是算法的廣度和深度的限制。例如揹包問題,若是所有有10個元素,我進行全排列嘗試,20個元素,則進行簡單的貪婪算法。這裏的10就能夠認爲是一個閾值,超過閾值的時候,考慮到時間成本,使用通常的算法。函數
保證每次運行結果都是符合題目要求的
在複雜的場景下,你的算法多是很是優秀的,可是可能在一個很微小的點上,是不符合題目要求的。題目要求是最大的前提,若是違反題目要求,再好的算法都是不能被採納的。因此務必檢查每次的運行結果是否符合題目要求。工具
保證編碼正確
有時候,一個想法是正確的,可是每每可能出現編碼的錯誤,使得結果變壞。因此,必須保證你的代碼和你的想法是一致的。若是出現你的想法使得你的運行結果變差的時候,不要先急着推翻你的想法,而是應該先看一下是否是你的代碼有什麼錯誤,沒有真正反映出你的實際想法。單元測試
邏輯和閾值
在複雜的算法題目中,有時候咱們喜歡用閾值來運行出不一樣結果,而後選擇最優的結果。可是,若是可能的話,應該以統計等方式決定閾值。若是可能的話,應該有一個明確的邏輯,而不使用閾值。閾值沒有泛用性,而且有時候因爲不能測試每個閾值的效果,容易出現局部最優解,而不是全局最優解測試
版本管理
不是每個想法都會給結果帶來正面的效果,有些改動可能不但沒有效果,並且使得結果變壞,咱們須要一個版本管理的概念,將很差的結果及時回滾到原來的狀態。有時候,兩個想法可能被同事加入到代碼中,而且兩個想法獨立使用和一塊兒使用效果也不一樣,這個時候更加須要版本管理工具了。建議使用Git作版本管理工具,能夠自由的添加或者刪減不一樣的想法。優化
自動測試 和 電源管理
此次沒有準備自動測試的代碼,正確的作法是,白天進行編碼工做,晚上對於閾值,各類想法的排列組合的效果,進行自動測試。
在自動測試的時候,請注意電源管理的設定,須要看一下是否設定了休眠,若是設定了休眠狀態,基本上什麼都運行不了了。
對於每次自動測試的結果,都必須保留下來,做爲算法的評價依據。
中間指標 和 數據分析
在最終目標以外,還須要訂立一些其餘指標來判斷算法的好壞。
整個最終結果每每是由多種因素決定的,若是將這些因素的量化結果也打印出來,對於這些指標進行分析,每每能夠找到優化點。
有一些題目,在寫算法以前,能夠將題目中給定的數據集進行一些分析,總結出數據集的特徵,而後針對這些特徵選擇算法,也是一個很重要的步驟。
從答案中找問題 不少算法的最終結果多是一些調度計劃和分配方案。仔細觀察這些結果,找到一些明顯能夠優化的點,這也是提升算法結果的途徑。 從算法執行結果這個答案中尋找你的算法中存在的問題,是一條頗有用的途徑