气象数据领航无人飞行器线路优化大赛解决方案(3rd place)
1 隊(duì)伍介紹
隊(duì)伍名稱:酒后寫詩
隊(duì)伍成員:陳權(quán)、林望黎、黃章煒
隊(duì)伍名次:3 / 1646
2 問題簡介
這個問題說起來其實(shí)挺簡單(但實(shí)現(xiàn)起來困難重重),就是提供了氣象局得到的10個模型的預(yù)測數(shù)據(jù)(準(zhǔn)確率為90%~95%之間),然后讓我們用這些預(yù)測數(shù)據(jù)去預(yù)測每個坐標(biāo)在每個時刻的天氣狀況,并以該天氣狀況為依據(jù),給無人機(jī)規(guī)劃飛行路徑。若無人機(jī)所處位置的即時風(fēng)速大于等于15或者降雨量大于等于4,則認(rèn)為無人機(jī)墜毀。
天池官方原文介紹在這里。
英文報(bào)告在這里。
順便推廣一下我正在建設(shè)當(dāng)中的個人博客網(wǎng)站,此篇的原文地址~
解決方案的源代碼地址
3 解決方案
這個問題主要可以概括為兩個方面——預(yù)測和路徑規(guī)劃。
3.1 預(yù)測
預(yù)測方面可以有兩種做法——分類和回歸。那么用哪種呢?
分類的話對之后的路徑規(guī)劃會造成兩點(diǎn)麻煩:
無法得到安全系數(shù)。比如風(fēng)速是14.9的和風(fēng)速是8.0的情況都會被認(rèn)為是安全區(qū)域,每個坐標(biāo)在每個時刻的安全系數(shù)無法確定。這會導(dǎo)致無人機(jī)在有安全系數(shù)很高的路徑可以選擇的情況下,選擇了危險系數(shù)高的路徑。
樣本不均勻。訓(xùn)練集中某幾天的絕大多數(shù)區(qū)域都是風(fēng)速大于15的,這會導(dǎo)致負(fù)樣本遠(yuǎn)遠(yuǎn)大于正樣本,造成樣本量不均勻的問題。
相對而言,回歸可以較好地解決這兩個問題。
因此,我們選擇了回歸作為預(yù)測的方案。
3.2 路徑規(guī)劃
這是一個發(fā)揮想象力的地方,沒有固定的章法。我們查找過相關(guān)的文獻(xiàn),無果。詢問過可能知道這方面知識的人,無果。所以,我們干脆就靠自己想來實(shí)現(xiàn)這個算法了~
這里路徑規(guī)劃的難點(diǎn)在于這是一幅隨時間變化而變化的動態(tài)地圖,動態(tài)地圖很難處理,有的可能說在z方向加一個維度來實(shí)現(xiàn),做一幅三維的立體圖,在三維的方向上這個圖就是靜態(tài)的了。也有的說可以用強(qiáng)化學(xué)習(xí),這方便我們不太了解,但是個人覺得會非常耗時,耗資源,效率也不一定高,能用固定算法就用固定算法吧~
不同于以上兩者,我們選擇了一個更為簡單的方案,直接在二維圖上構(gòu)造局部靜態(tài)圖,并在每次移動到指定位置后更新地圖,以此來應(yīng)變地圖的動態(tài)變化。以靜制動~相對于三維圖來說,直接在二維圖上找路徑更便于可視化,相對于強(qiáng)化學(xué)習(xí)來說,我們的方法更為直觀、快捷。后文中將細(xì)說。
不管是什么方法,能找到路徑的就是好方法~
3.3 難點(diǎn)
預(yù)測難嗎?不難,說實(shí)話,直接用求平均的方法都能找到許多路徑。
找路徑難嗎?不算難,只要前期稍微花些功夫,我相信這對絕大多數(shù)的隊(duì)伍來說都不是難題。
那么,這個問題難在哪里?難在預(yù)測和路徑規(guī)劃相結(jié)合!這么說吧,在這個問題這里,預(yù)測的準(zhǔn)確率高不一定是好事(當(dāng)然預(yù)測的準(zhǔn)確率低一定是壞事)。如果一個實(shí)際值為15.1的即時風(fēng)速,一種方案預(yù)測成了14.9,另一種方案預(yù)測成了16.0。哪種好?16.0的好。我們希望采取寧大勿小的原則。寧可錯殺一千,不能放過一個!一條路徑上,只要有一個點(diǎn)超出閾值了,無人機(jī)就直接墜毀了。花費(fèi)時間相同的路徑多的是,這種接近閾值的地方,我們寧可當(dāng)成危險區(qū)域。
當(dāng)然,錯殺的也不能太多,不然路徑就找都找不到了~
因此,我們認(rèn)為題目中的“優(yōu)化”二字,更多的是指安全系數(shù)的優(yōu)化,其次才是消耗時間的優(yōu)化。
我們用了stacking時取max的方法來解決這個問題,關(guān)于這點(diǎn)會在下面再詳細(xì)地說。
4 預(yù)測模型
預(yù)測,最終要的就是特征要好。有句話說,“特征找不好,調(diào)參調(diào)到老”,我認(rèn)為后面還應(yīng)該加一句“調(diào)到老也調(diào)不好”。
本題所給的原始數(shù)據(jù)已經(jīng)是比較好的特征了,直接拿來用Lightgbm或者Xgboost來訓(xùn)練一下做預(yù)測就可以得到一個比較好的結(jié)果了。像復(fù)賽時間那么緊張,我們是先拿原始數(shù)據(jù)特征來訓(xùn)練模型,得到一幅初步的地圖的。
然后,由于風(fēng)速和降雨量即是空間上的矢量,有是時間上的矢量,我們便把周圍的天氣情況和前后時間的天氣情況都利用了起來。
最后,我們認(rèn)為不同的模型可能在不同時間段的準(zhǔn)確率是不一樣的,于是就把時間作為啞變量加到了特征當(dāng)中。
總之,我們用到的特征有:
- 原始數(shù)據(jù)特征
- 周圍天氣特征(上下左右)
- 前后時間天氣特征(前一個小時和后一個小時)
- 時間特征(離散特征)
由于數(shù)據(jù)量比較大,把這些特征都加進(jìn)去,我們自己的這種低配筆記本基本是跑不動了。沒關(guān)系,sampling就可以了,經(jīng)實(shí)驗(yàn),準(zhǔn)確率并不會下降多少。
在訓(xùn)練之前,我們還用類似箱線圖的方法,將異常值做了替換。
在訓(xùn)練模型的方法上,我們又分為了全部數(shù)據(jù)訓(xùn)練和交叉融合訓(xùn)練。
所謂全部數(shù)據(jù)訓(xùn)練就是把5天的數(shù)據(jù)揉在一起,做shuffle,然后分70%的訓(xùn)練集和30%的驗(yàn)證集訓(xùn)練。
所謂交叉融合訓(xùn)練,有點(diǎn)像交叉驗(yàn)證,但又不是交叉驗(yàn)證,我給幅圖大家就明白了。
這5個模型的參數(shù)是可以不一樣的,訓(xùn)練出5個模型之后,再做了stacking,這里我們遵循寧大勿小的原則,取了所有結(jié)果中的最大值。
用全部數(shù)據(jù)訓(xùn)練的地圖噪點(diǎn)會比較多,而用交叉融合的地圖會相對干凈一些。原因是我們利用的是樹模型,前者樹的葉子多,后者樹的葉子少。實(shí)踐證明,后者更符合我們的需求。
在復(fù)賽中我們訓(xùn)練了如下幾種模型
表1 模型訓(xùn)練結(jié)果表其中,temporal features為前一個小時和后一個小時的天氣特征。
總而言之,就是要訓(xùn)練出多幅地圖,然后再不同地圖上找安全路徑,如果有某條路徑在各種地圖上都是安全的,那么這條路徑能通過的概率就很高了。
在用來訓(xùn)練的算法上,在此題中我們認(rèn)為Lightgbm要優(yōu)于Xgboost。Lightgbm采用了直方圖的計(jì)算方式,雖然準(zhǔn)確度上沒有Xgboost高,但速度真的快,比Xgboost至少快出5倍以上。而且本題并不是比誰預(yù)測的準(zhǔn),相反我們希望預(yù)測值比真實(shí)值稍微大一些,因此,Lightgbm是最佳選擇。
5 路徑規(guī)劃模型
根據(jù)預(yù)測模型,我們可以得到一個 (548, 421, 18) 的地圖,這樣的地圖比較難處理。我們把它轉(zhuǎn)化一下。
給定了一個起始點(diǎn)和出發(fā)時間,由于無人機(jī)只能向上下左右四個方向移動,我們可以根據(jù)所得到的 (548, 421, 18) 的地圖利用bfs畫出一幅 (548, 421)的地圖。
圖中,顏色代表了到達(dá)從綠點(diǎn)出發(fā),用最短的時間到達(dá)某點(diǎn)時的安全系數(shù),藍(lán)色為危險區(qū),紅色為安全區(qū),顏色越深越安全。這幅圖嚴(yán)格保證了無人機(jī)從綠點(diǎn)出發(fā),走到圖上紅色區(qū)域任意一個位置的時間間隔為 2 * (abs(x - start_x) + abs(y - start_y)),也就是我們平常所說的曼哈頓距離的兩倍。
這樣一來,任意指定一個目標(biāo)點(diǎn),我們就可以構(gòu)造一幅從起始點(diǎn)到目標(biāo)點(diǎn)的有向有權(quán)圖,每兩點(diǎn)之間的權(quán)值即是安全系數(shù)值(由風(fēng)速和降雨量決定),這樣一幅局部的靜態(tài)圖就可以用Dijkstra算法秒算最安全的路徑,對真的是秒算。在計(jì)算的過程中,可以適當(dāng)?shù)慕档烷撝?#xff0c;使得路徑不經(jīng)過一些較危險的點(diǎn)。
如果我們所希望到達(dá)的目標(biāo)點(diǎn)不在紅色區(qū)域內(nèi),那么我們就要往周圍繞一下,即找一個引導(dǎo)點(diǎn),再把引導(dǎo)點(diǎn)當(dāng)成起始點(diǎn)繼續(xù)搜索。引導(dǎo)點(diǎn)一般在起始點(diǎn)和目標(biāo)點(diǎn)所組成的黃色區(qū)域之外,在黃色區(qū)域內(nèi)找了也白找,這個大家可以體會一下。
我們設(shè)計(jì)了一個專門用來尋找引導(dǎo)點(diǎn)的程序,一個設(shè)置一些參數(shù)之后可以自動找,是一個dfs內(nèi)嵌套了bfs的程序。另一個是利用django設(shè)計(jì)的一個網(wǎng)頁,可手動點(diǎn)擊地圖查找。
比如圖2中的藍(lán)點(diǎn)是在藍(lán)色區(qū)域的,無法直接到達(dá),那么我們就找了一個引導(dǎo)點(diǎn)。得到了下圖3所示的地圖。
深綠點(diǎn)即為引導(dǎo)點(diǎn),從圖中可見,綠點(diǎn)經(jīng)過一個引導(dǎo)點(diǎn)的引導(dǎo)即可到達(dá)藍(lán)點(diǎn)。
接下來把兩段路徑組合起來即可。
我們的算法不僅可以正向?qū)ふ衣窂?#xff0c;還可以逆向?qū)ふ衣窂?#xff0c;原理類似,不再贅述。
尋找引導(dǎo)點(diǎn)是本算法最為繁瑣的步驟,可以限定時間,以路徑中的最大安全系數(shù)最小作為優(yōu)化目標(biāo)進(jìn)行優(yōu)化尋找。后期仍有許多可以改進(jìn)的地方。
我們有一個更為大膽的想法,就是使得路徑由胖瘦之分,尋找最胖的一條,并以中心線為最終路徑。這個以后有時間再來實(shí)踐一下,相信是件非常有趣的事情。
總之,我們在尋找路徑時,我們在保證路徑安全系數(shù)較高的情況下,再去優(yōu)化消耗時間的問題。這些都可以通過我們模型中的各個超參數(shù)做調(diào)整。
6 其它的比賽經(jīng)驗(yàn)
相信參加了復(fù)賽的選手都有體會,復(fù)賽中最難的地方就在于如何設(shè)計(jì)提交路徑的策略。如果一下子交一大堆路徑上去,其中有個幾條沒過,線下的可能性組合是多的可怕的~也就是說胡亂提交的話,根本不知道哪條路徑過了,哪條路徑?jīng)]過。
我們隊(duì)在賽前的確考慮過這一點(diǎn),但在比賽中發(fā)現(xiàn)形勢比想象的嚴(yán)峻的多。即使提交的每條路徑時間長短都不一樣,仍舊會有多種組合。于是,我們就寫了一個輸入為線上得分,輸出為線下可能的路徑組合的小程序,在線下模擬幾條可能墜毀的線路墜毀的情況,盡可能保證各種情況下都能區(qū)分出墜毀的路徑。
那么如何修改耗時?我們的超參數(shù)中有一個是可以設(shè)置停留時間的。假設(shè)達(dá)到目的地時為12:30,由于天氣情況在一個小時內(nèi)時不會發(fā)生變化的,于是我們就可以將倒數(shù)第2個點(diǎn)停留0~28分鐘。
當(dāng)然,也有失手的時候,有些提交的確是沒法區(qū)分。這個時候,我們可以在下一次提交時,保留這次絕大多數(shù)的路徑,然后將兩次提交結(jié)果做對比(甚至是三次結(jié)果做對比),這樣也是可以推導(dǎo)出墜毀的路徑的。
總之,這是一次非常規(guī)套路的算法比賽,這讓我們這些只有低配硬件的算法愛好者也有一展身手的機(jī)會,希望天池多辦些可以發(fā)揮創(chuàng)造力的比賽~
如果有任何問題,可以聯(lián)系我~
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的气象数据领航无人飞行器线路优化大赛解决方案(3rd place)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1790. 仅执行一次
- 下一篇: LeetCode 1973. Count