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