日前,2024第十屆華為軟件精英挑戰(zhàn)賽-“普朗克計劃”全球總決賽及頒獎典禮圓滿落幕。大賽吸引了來自全球800多所高校、超5700支隊伍、近30000名大學(xué)生報名參賽,歷時兩個月的激烈角逐,經(jīng)過八大賽區(qū)區(qū)域初賽、區(qū)域復(fù)賽、全球總決賽等環(huán)節(jié)的層層考驗。最終,京津東北賽區(qū)來自哈爾濱工業(yè)大學(xué)的“元夢之星”隊獲得全球總決賽冠軍。作為連續(xù)兩屆華為軟挑大賽的獲獎選手,來自哈爾濱工業(yè)大學(xué)的優(yōu)秀選手陳月東撰文分享其賽隊參賽體驗,包括參賽初衷、解題思路及方案、比賽收獲等。
1.感想
比賽初衷
今年是第二年參加軟挑,在去年第一次參加軟挑見識到了SimpleDemo和冠軍隊的強大實力,很希望今年能和去年的冠軍隊再戰(zhàn)一回(去年跟冠軍隊還沒PK就被刷下來了),也希望能借這個比賽再次挑戰(zhàn)一下自己,因此報名開始沒幾天我就報名參加這個比賽了。
賽題介紹
智慧港口是各城市貿(mào)易港口的重點建設(shè)與發(fā)展方向。華為云可提供全方位智能算法技術(shù)平臺助力智慧港口建設(shè)。本次賽題方向和內(nèi)容選自于華為云智慧港口真實業(yè)務(wù)場景,邀請參賽選手為港口運輸公司提供貨物智能搬運、貨船智能泊靠等算法,以助力港口運輸公司最大化提升工作效率并降低裝卸成本。
初賽
初賽我們看到賽題的第一眼,感覺在不考慮輪船的情況下,跟去年的賽題非常類似。因此前幾天我們都在研究去年公布的SimpleDemo,以期望能借鑒一些思路。最后我們初賽代碼沿用了SimpleDemo的整體框架,只是特殊修改了機器人決策函數(shù)和避讓算法,輪船則單獨設(shè)計了一種針對初賽賽題的特殊決策,并配以相應(yīng)的參數(shù)。在初賽正式賽期間,通過調(diào)節(jié)參數(shù),我們順利地拿下了初賽全國第一名。
復(fù)賽
復(fù)賽主要新增兩個修改點,一個是船和機器人需要自己購買,另一個是船需要自己控制。我們最終在初賽代碼的基礎(chǔ)上對機器人的決策進行微調(diào)(最后關(guān)頭盡量和船配合,以期望獲得最高分),修改了輪船決策函數(shù),增加了輪船的尋路和避讓策略,且增加了動態(tài)購買機器人和輪船的決策函數(shù),并配上相應(yīng)的參數(shù)。
在復(fù)賽正式賽期間,賽題新增了一種機器人,雖然載貨量是2倍,但是價格是普通機器人價格的2倍還多1000,我們直接不考慮這種機器人,直接通過調(diào)節(jié)參數(shù),我們依然保持住了全國第一名。
決賽
決賽引入了大模型問答和多隊同場景對抗,并加大了地圖長寬。在練習(xí)賽初期,我們一直都在嘗試優(yōu)化大模型問答能力,期望獲得最佳響應(yīng)速度。在大模型問答模塊基本確定之后,我們才開始著手修改代碼。決賽過程中遇到的一個很嚴(yán)重的問題是由于地圖擴大,我們復(fù)賽的代碼初始化和船的尋路會直接超時,在對抗的場景下,掉幀對機器人和船損失都是特別大的,我們很大一部分時間在優(yōu)化尋路算法。最后我們最終的代碼是在復(fù)賽的基礎(chǔ)上優(yōu)化了尋路算法,加速了機器人的決策函數(shù)運行速度(通過一些剪枝手段),并增加了機器人和輪船避讓其他人的策略,微調(diào)了機器人和輪船購買策略,并增加了一些參數(shù)用來調(diào)節(jié)機器人和輪船的避讓博弈。
在決賽正式賽期間,賽題新增了一種輪船,價格只有普通輪船的2倍左右,但是載貨量是4倍,在看到賽題的第一時間,我們認(rèn)為,如果大家一起合作,那么購買這種輪船,整體賺取的總資金應(yīng)該是更高的,因此我們還是嘗試修改代碼采用這種輪船。修改完提交上去,看回放才知道,盡管我們想跟其他隊伍合作,但是其他隊伍不配合,所以我們其實也只能選擇原來的船去爭搶泊位,在修改回原來的輪船之后,通過不斷增大機器人和輪船的購買數(shù)量(通過調(diào)節(jié)購買因子),我們就一直保持第一名的排名不動,最后也很幸運的在最后一次PK中獲得了總冠軍。
2.整體方案
此處我們先介紹我們的整體流程,和一些我們的定義,然后按照初賽、復(fù)賽、決賽的代碼修改點來詳細介紹具體的思路(因為每一次改賽題,修改點都比較多),如果是沒介紹的部分,就是沿用了初賽或者復(fù)賽的思路。
(1)整體流程和一些定義
我們的程序每一幀都做以下幾件事:
1.機器人行動
1.1.機器人決策
1.2.機器人尋路和避讓
2.輪船行動
2.1.輪船決策
2.2.輪船尋路和避讓
3.機器人和輪船購買決策
初賽只需要考慮1(包含1.1、1.2)和2.1,復(fù)賽和決賽需要考慮1、2、3。
接下來給出一些我們自己的特殊的定義:
1.工作臺(Workbench):指物品
2.機器人買(決策):機器人選擇去某個物品處取(揀)貨
3.機器人賣(決策):機器人選擇去某個泊位卸貨
4.輪船買(決策):輪船選擇去某個泊位裝貨
5.輪船賣(決策):輪船選擇去某個交貨點出售貨物
6.機器人和輪船購買:指購買機器人和輪船
(2)初賽思路
初賽由于只需要考慮機器人的控制和輪船的決策,所以優(yōu)化機器人和輪船決策是得分的關(guān)鍵。
機器人決策
我們的機器人決策函數(shù)分為以下兩部分:
1.對所有滿貨物的機器人分配一個賣決策
2.對所有機器人分配一個買決策
分配賣決策較為簡單,我們直接選擇最近的且有較大可能性賣出去(指輪船能拿到貨物且能賣出去,此處判斷較為簡單,我們不展開講)的泊位作為我們機器人的售賣泊位。
分配買決策是機器人決策的核心,我們?yōu)槊恳粋€機器人指定一個買家和一個賣家,具體地,我們在使用性價比=物品價值/買賣時間作為我們的估價函數(shù)的同時,也考慮了如下要素:
1.為了防止物品消失導(dǎo)致的價值損失,我們把物品消失時間當(dāng)作一定的價值,讓機器人盡量先找快消失的物品先去拿。
2.因為可能存在賣了之后離物品更近的機器人,我們給所有的機器人都分配了一個買決策。
3.因為中途切換目標(biāo)可能帶來損失,我們希望中途盡量不切換目標(biāo),因此我們增加了相同目標(biāo)收益因子。
4.如果最后關(guān)頭物品已經(jīng)沒法賣出去了(指輪船無法攜帶這個貨物賣出去),我們直接設(shè)置為負(fù)收益,讓機器人先找能賣出去的。
為了體現(xiàn)以上這些考慮,我們實現(xiàn)了以下代碼所示的機器人決策購買函數(shù):
機器人尋路和避讓
機器人有兩種狀態(tài),買(指去某個物品取貨)和賣(指去某個泊位卸貨)狀態(tài),這兩種狀態(tài)我們尋路和避讓算法一致,只是目標(biāo)點的不同。
機器人尋路算法較為簡單,我們在初始化泊位和物品生成的時候,使用迪杰斯特拉算法計算保存起來任意點到泊位或者物品的回溯數(shù)組,尋路則直接回溯獲得路徑即可。
在機器人避讓方面,先對機器人按照重要程度排序,如果檢測到碰撞,我們最開始先嘗試搜一條不撞的且距離等于最小距離的路徑,如果能搜到,則直接切換路徑。如果搜不到我們就繼續(xù)正常走,直到下一幀撞了,才啟動避讓,具體策略是選擇四個方向的下一個點和機器人本身所在位置作為候選點,選擇最優(yōu)的能避讓對面的點作為下一個目標(biāo),具體做法是先計算點到目標(biāo)距離,如果這個點在別的機器人路徑上,則距離加2,選擇距離最小的點作為最優(yōu)點,如果沒一個點能避讓對面,則提高優(yōu)先級,重新排序,并重新啟動避讓。
初賽輪船決策
我們的輪船決策函數(shù)也分為以下兩部分:
1.對所有滿貨物或者剩余時間只夠勉強賣貨的輪船分配一個賣決策
2.對所有輪船分配一個買決策
分配賣決策較為簡單,我們直接選擇最近交貨點作為我們輪船的貨物出售點。
分配買決策是輪船決策的核心,我們?yōu)槊恳粋€輪船指定一個買家和一個賣家,由于初賽輪船沒到泊位中途切換目標(biāo)會重新計算時間,所以中途切換目標(biāo)損失會很高,所以初賽我們的輪船決策保證中途一定不能切換目標(biāo)。在決策之前,我們先初始化泊位貨物數(shù)量數(shù)組,初始化等于泊位上的貨物數(shù)量,當(dāng)我們決策完一次時(一次只決策一艘輪船,與機器人一樣),我們直接把泊位上的貨物數(shù)量減去目前決策的船需要的貨物數(shù)量,再進行下一次的決策。
我們的做法是按照把輪船進行分類,分別決策,具體如下:
1.途中的(前往交貨點或者前往泊位途中的),先給予他們決策,選擇保持原來目標(biāo)不動。
2.沒有買目標(biāo)的(只有在交貨點才會沒有買目標(biāo)),第二個給予決策,我們直接選擇泊位剩余貨物最多的泊位作為目標(biāo)。
3.在泊位上的,細分為兩種,第一種泊位上還存在貨物,我們直接保持目標(biāo)不變,如果不存在貨物,我們預(yù)測等待裝滿需要時間,或者切換其他泊位裝滿需要時間,選擇一個最快裝滿的泊位切換過去。
(3)復(fù)賽思路
復(fù)賽增加了機器人和輪船的購買機制,以及需要自己控制輪船的尋路和避讓。此時得分的一個關(guān)鍵因素就成了如何高效地購買機器人和輪船。我們主要修改了輪船的決策,增加了輪船尋路和避讓,增加了機器人和船的購買決策函數(shù)。
復(fù)賽輪船決策
由于復(fù)賽輪船沒到目標(biāo)不會重新計算時間,因此我們可以接受中途輪船切換目標(biāo),因此復(fù)賽的輪船買決策需要做一些改動。在泊位上的輪船且泊位上還有貨物我們優(yōu)先保持決策不變。對其他輪船,我們與機器人決策一樣,直接用性價比作為我們的估價函數(shù)(泊位上的數(shù)量/輪船買賣時間),也增加一個相同目標(biāo)收益因子。
輪船尋路和避讓
輪船也有兩種狀態(tài),買(指去某個泊位取貨)和賣(指去某個交貨點出售)狀態(tài),這兩種狀態(tài)我們尋路和避讓算法一致,只是目標(biāo)點的不同。
輪船尋路算法也較為簡單,我們在初始化泊位和交貨點的時候,使用迪杰斯特拉算法計算保存起來任意點到泊位或者交貨點的回溯數(shù)組,尋路則直接回溯獲得路徑即可。有個需要注意的地方是如果某個泊位上有船了,我們會直接讓輪船直接移動到泊位核心點處等待(通過廣度優(yōu)先搜索尋路),而不是搜到最近的靠泊區(qū)點就直接發(fā)送berth指令(因為一定發(fā)送失?。?。
輪船避讓方面,如果檢測到碰撞,我們也先進行嘗試搜一條不撞且等于最小距離的路徑,搜得到,我們切換路徑。如果我們搜不到,保持原來的路徑,直到達到我們的檢測閾值(10幀之內(nèi)撞了),則啟動局部避讓算法,讓低優(yōu)先級船直接選擇不在另外的船的預(yù)測路徑上(每一艘只預(yù)測10幀)的且離目前船最近的25個點作為候選點,選擇一個最優(yōu)的點去移動過去進行避讓,具體做法是目前移動距離+移動后的點到目標(biāo)距離/2,選擇最小的。為了防止極端情況,我們考慮了如果移動實在讓不開,我們會發(fā)送dept指令讓低優(yōu)先級船去直接避讓。
避讓效果
機器人和輪船購買決策
在機器人和輪船購買方面,我們直接選擇靜態(tài)購買和動態(tài)購買相結(jié)合的方式。
1.設(shè)立最小機器人和輪船個數(shù)參數(shù),用來靜態(tài)購買。具體做法是只要機器人和輪船沒到購買個數(shù),我們一直購買,先買夠機器人,再買夠輪船。
2.設(shè)立購買機器人和輪船因子,用來動態(tài)購買。具體做法是從當(dāng)前機器人獲得的價值預(yù)估未來機器人能獲得的價值,如果獲得的價值大于購買機器人因子乘以機器人價格,則買一個機器人,輪船就預(yù)測目前泊位上的貨和機器人未來卸的貨能否被全部裝走,如果不能裝走,則看剩余的價值能否大于購買輪船因子乘以輪船價格,如果大于,則購買一艘輪船。
最后,在選擇具體購買點方面,我們直接把購買點當(dāng)作一次機器人或者輪船決策(機器人或者輪船位置在購買點的決策)。
為體現(xiàn)以上這些考慮,我們實現(xiàn)了以下代碼所示的購買函數(shù):
(4)決賽思路
決賽修改點主要是地圖擴大,增加了大模型輔助問答和多隊對抗機制。其中很重要的考察點其實是算法的性能,因為場上生成的貨物非常多,很容易導(dǎo)致算法超內(nèi)存或者超時。我們此時主要優(yōu)化了機器人的決策函數(shù)、輪船的尋路函數(shù),增加了避讓其他選手的機器人和輪船的避讓函數(shù),并增加了大模型調(diào)用模塊。
機器人決策函數(shù)優(yōu)化
決賽整體采用初復(fù)賽的機器人決策,在復(fù)賽的基礎(chǔ)上,我們增加了如下考慮:
1.剪枝策略,由于場上貨物太多,我們先對貨物價值排序,如果此時決策時間超過4ms,則我們只看前1/4的貨物去決策,如果某些貨物的最大收益已經(jīng)小于當(dāng)前最優(yōu)收益了,我們直接停止,跳出循環(huán)。
2.答題狀態(tài)特殊處理,因為決賽多了個答題狀態(tài),所以對初復(fù)賽的決策函數(shù)做了微調(diào),答題狀態(tài)的先決策。
3.取消了物品消失價值(因為低價值物品太多,拿不完,消失了也沒事),降低了相同目標(biāo)因子為0.5(初復(fù)賽一般為2,因為決賽中途切換能盡早搶到高價值貨物)。
此外我們不考慮只把貨物賣給有自己船的泊位,因為我們認(rèn)為,大家合作才能賺取整體的更高利潤。
實現(xiàn)以上這些考慮的具體代碼如下:
輪船的尋路函數(shù)優(yōu)化
因為復(fù)賽我們采用的輪船尋路是廣度優(yōu)先搜索,到了決賽地圖擴大尋路會比較耗時,我們采用有序字典(map)加棧(stack)來優(yōu)化輪船的廣度優(yōu)先搜索尋路,具體做法是有序字典用最小深度作為鍵,用棧作為值。
優(yōu)化完畢的整體代碼如下,注:DIR長度為8,只有前4個有用。
避讓其他選手的機器人和船
避讓其實是一種博弈,我們樂觀地認(rèn)為碰到會動的機器人和船都會避讓我們(如果對面不避讓,我們保證對面至少吃虧1幀),所以我們考慮如果我們撞到的機器人或者船能動,我們暫時不避讓,如果他不能動,我們撞到之前直接讓開他。
我們的具體做法如下:
1.如果我們的機器人2幀之內(nèi)不動(或者下一個位置有超過5幀不動的機器人),則鎖死下一個位置,重新搜一條不撞的路徑。
2.如果我們的輪船3幀之內(nèi)不動(或者下一個位置有超過6幀不動的輪船),則鎖死下一個位置,也搜一條不撞的路徑。
機器人遇到移動機器人的避讓
大模型問答模塊
大模型方面我們能做的只有以下兩件事:
1.設(shè)置大模型解碼參數(shù)
2.設(shè)置提示詞
在解碼參數(shù)設(shè)置方面,我們只追求大模型的最快響應(yīng)速度,因為我們認(rèn)為就算我們答錯,其他隊伍大概率也答錯,我們也不虧,因此我們的大模型解碼策略應(yīng)該為貪心,所以設(shè)置top_k:1參數(shù)。
在提示詞設(shè)置方面,我們增加了個后綴英文提示詞用來減少大模型輸出單詞數(shù)量,在正式賽時可以看出我們的大模型響應(yīng)速度還是排名比較靠前的(這個也是一個比較遺憾的地方,我們沒有獲得最快響應(yīng)速度,比最快隊伍的響應(yīng)速度慢了大約1/2)。
我們這個模塊的整體策略是開一個后臺線程,不斷讀取問題,發(fā)送問題,如果沒有問題,我們就讓線程休眠1ms,放棄CPU,有問題就不斷發(fā)送問題,獲得回答,需要注意的一個點是我們因為建立連接大約需要0.5s,第一次獲得響應(yīng)會比較耗時,因此我們在初始化的時候直接發(fā)送了個問題給大模型以此建立連接,后面復(fù)用這個連接,響應(yīng)速度就正常了。
實現(xiàn)大模型問答模塊的關(guān)鍵代碼如下:
其他
決賽對物品的迪杰斯特拉算法也做了個搜索深度的限制,貴重物品搜索300深度,低價值物品只搜索100深度(因為搜索是在主線程,為了防止超時),對機器人和輪船購買策略做了細微的改動,機器人只關(guān)心自己能拿的價值,場上其他選手的機器人拿的價值不在考慮范圍內(nèi),輪船只關(guān)注自己的機器人能拿的貨,只買夠自己機器人運貨的船,整體目標(biāo)是不希望跟別人搶,一起獲取更高的利潤。
3.總結(jié)
此次軟挑,我們隊并非一帆風(fēng)順,在比賽過程中,我們面對了各種困難和挑戰(zhàn),但我們堅持不懈地尋找解決方案,在比賽中,我深入研究了各種算法和數(shù)據(jù)結(jié)構(gòu),學(xué)會了如何選擇適當(dāng)?shù)乃惴ê蛿?shù)據(jù)結(jié)構(gòu),以提高代碼的效率和性能。這個過程同時也鍛煉了我的毅力和決心,讓我學(xué)會了在壓力下保持冷靜和專注。同時,通過與其他優(yōu)秀的參賽隊伍接觸和交流,我深刻地認(rèn)識到自己的不足之處,也看到了其他人的優(yōu)秀之處。這激勵著我要不斷學(xué)習(xí)和提升自己,保持對知識的渴望和探索精神。
最后,我要衷心感謝我的母校為我提供的優(yōu)質(zhì)的教育環(huán)境,以及家人、朋友以及師兄師姐們給予我的鼓勵和關(guān)心。感謝華為提供的這個寶貴的機會和平臺,讓我能夠參與這個比賽,并且有幸能夠與一些專家和行業(yè)大佬進行交流,這對我的職業(yè)發(fā)展產(chǎn)生了深遠的影響。
(免責(zé)聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對有關(guān)資料所引致的錯誤、不確或遺漏,概不負(fù)任何法律責(zé)任。
任何單位或個人認(rèn)為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權(quán)或存在不實內(nèi)容時,應(yīng)及時向本網(wǎng)站提出書面權(quán)利通知或不實情況說明,并提供身份證明、權(quán)屬證明及詳細侵權(quán)或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關(guān)文章源頭核實,溝通刪除相關(guān)內(nèi)容或斷開相關(guān)鏈接。 )