Gurobi入門實踐(一)——以16屆華為杯F題為例

一、引言
本篇將介紹優(yōu)化類建模的一般分析方法,以及優(yōu)化求解器Gurobi+Python(Gurobipy)的使用。以2019年華為杯F題第一問為例,通過代碼實踐來提高解決問題的能力。

二、優(yōu)化建模的關(guān)鍵
對于實際的問題,設(shè)立恰當(dāng)?shù)臎Q策變量,將問題條件轉(zhuǎn)化為可編程表達的數(shù)學(xué)語言,往往是解決問題的第一步。
而這其中的關(guān)鍵往往在于,我們所設(shè)定決策變量的各種取值應(yīng)該無重復(fù)的代表實際的所有情況。因此,要培養(yǎng)優(yōu)化建模能力,體會各種決策變量的類型以及其在計算機中的數(shù)據(jù)結(jié)構(gòu)與實際問題的對應(yīng)關(guān)系,是學(xué)習(xí)過程中當(dāng)著重思考的。

三、問題分析
對于以下“多約束條件下智能飛行器航跡快速規(guī)劃”問題:



閱讀題目即可知,飛行器從A點到B點飛行,過程中會有水平、垂直兩個指標(biāo)的偏差。因此需要在途中經(jīng)過兩種類型的校正點,而對于途中所經(jīng)過的點,飛行器的偏差同樣需要滿足特定要求(如圖1)。

如果不考慮題目中所出現(xiàn)的各種約束,我們的目的就僅僅是讓飛行器從A飛到B就好,圖中可以可以飛過任意的點。因此可以發(fā)現(xiàn),此處強調(diào)的是點與點之間的連接關(guān)系,每個點之間要么相連,要么斷開。相連則為1,斷開則為0,因此,為了覆蓋所有的情況,我們可以建立0-1矩陣(方陣,邊長為所有點的數(shù)量)來描述這種關(guān)系。
然而,對于一個所有點的0-1矩陣,在不考慮題目約束情況下,其中矩陣“1”元素的分布也是有限制的,因為之少從A到B,是一條連貫的通路,如果還考慮“不能轉(zhuǎn)圈圈”,“不能重復(fù)經(jīng)過點”等,則“1”的分布更加受限制。
因此,我們通過0-1矩陣的二進制變量,作為我們的決策變量,其能夠無重復(fù)地反應(yīng)所有的連接可能,且能夠通過約束表達進一步限制。不過,這能否表達我們的目標(biāo)函數(shù)呢?
由題目可知,目標(biāo)函數(shù)是距離最短,經(jīng)過的點最少。經(jīng)過點的數(shù)量從0-1矩陣就可以獲得,距離最短則牽扯到點-點距離,因此我們還需要構(gòu)建所有點之間的距離矩陣。
最后觀察約束,約束中的共性是,偏移不超過某個值。而偏移是由每移動1m產(chǎn)生的偏差積累而來。這是,我們可以將“偏移不超過某個值”轉(zhuǎn)化為“移動距離不超過某個值”,從而減少參數(shù)的個數(shù)。具體約束的表達,后面將和代碼一并分析。

四、模型建立與Gurobipy
此處將著重分析校正點的約束分析,給出其數(shù)學(xué)表達方法,其余約束模型以代碼形式呈現(xiàn)。同時介紹Gurobipy的基本語法。
以上代碼中,讀取了數(shù)據(jù),建立了點-點距離矩陣,還對數(shù)據(jù)進行了刪減處理(預(yù)處理)。這是考慮到通過繪制題目所給數(shù)據(jù)點發(fā)現(xiàn),所有點幾乎均勻分布于一個較為廣大的空間中,且兩種校正點沒有特定的集中分布。因此,此處連接A、B兩點,以此為軸線,將15000距離以外的點都刪去,提高了程序的執(zhí)行效率。
Gurobipy基本語法,建立點×點范圍的0-1變量矩陣,結(jié)合距離矩陣一起表達約束和目標(biāo)函數(shù)。
以上為路徑形成約束,即在沒有校正點約束下,能夠生成從A到B路徑的約束。包括:從A出發(fā),不回到自己,單入單出,不重復(fù)經(jīng)過,路徑連續(xù)等約束。這些約束通過分析0-1矩陣本身的特性不難得出。
可以發(fā)現(xiàn),操作對象都是0-1決策變量。gp.quicksum()等都是Gurobipy的常見語法,需要結(jié)合Python生成器熟練運用。
以上是目標(biāo)函數(shù)的表達,以及軌跡的打印。接下來將詳細分析校正點的約束。
校正點約束即以下約束:

我們不妨列舉一些可能的情況,如下圖所示,從A出發(fā),到達點無非兩種,可以記為0和1,通過分析相同點(即下一個點仍然為同類型)以及相異點(下一個點為不同類型)之間的關(guān)系,便可以發(fā)現(xiàn)其中的數(shù)學(xué)規(guī)律。

數(shù)學(xué)表達式從前述代碼容易看出。
最后經(jīng)過4.32s迭代得到結(jié)果:
數(shù)據(jù)集一:

數(shù)據(jù)集二:

依據(jù)上述分析可設(shè)計程序,檢驗輸入的路徑是否滿足約束要求:(以下可實現(xiàn)檢驗路徑,計算路徑長度,繪制坐標(biāo)點功能)

五、總結(jié)
初始而言,對于日常優(yōu)化建模的練習(xí),應(yīng)當(dāng)著重分析決策變量的設(shè)立技巧,反思并積累經(jīng)驗,并將數(shù)學(xué)公式轉(zhuǎn)化成可用求解器求解的形式;
本篇應(yīng)用Gurobipy解決了一道較易的0-1優(yōu)化問題,第二問可在此基礎(chǔ)上進一步分析,重點則在于第一問校正點約束構(gòu)建的思考方式。

六、參考文獻
[1] 2019 年第十六屆中國研究生數(shù)學(xué)建模競賽 F 題.多約束條件下智能飛行器航跡快速規(guī)劃.