大規模數學規劃模型廣泛用於商業決策,但其構建和求解往往耗時費力。來自倫敦大學學院(UCL)、華為諾亞方舟實驗室、復旦大學的研究人員提出並開發了一種新型超大規模數學規劃建模系統Grassland,可在數分鐘內構建與求解百萬變數規模的數學規劃模型,助力華為供應鏈快速決策。
以線性規劃為代表的數學規劃方法在製造、交通、物流、能源、金融等領域有著廣泛而深刻的應用,是現代工廠排產、物流排程等關鍵經濟活動的基石。數學規劃方法首先將問題建模並轉換為標準的數學規劃模型(如線性規劃、整數規劃等),然後使用對應的開源或商業求解器進行求解,從而輸出較優的產品生產量、貨物轉運量等關鍵決策資訊。這些決策資訊經過排產員或排程員的進一步最佳化、確認後,以生產任務令、排程指令的方式下發到各個工廠車間、倉庫、港口、集散中心等,從而以有限的資源儘可能多地完成客戶的各種訂單需求。可以說,數學規劃方法是製造、物流等行業的大腦中樞,以經濟、高效的方式指揮著產線、車輛等海量基礎設施的協同運轉。而完成整個數學規劃方法,將實際業務資料轉換為最優決策變數值的高層系統,我們稱之為“代數建模系統”(Algebraic Modeling System, AMS)。基於數學規劃方法進行商業決策的流程圖,虛線框內的部分即為代數建模系統
然而,隨著商業場景的日益複雜和產業規模的不斷擴大,其所對應的數學規劃模型也變得極其繁瑣和龐大。不僅數學模型的表示式非常複雜,決策變數和約束的規模也動輒以百萬計。這對實際執行數學規劃方法的代數建模系統提出了極高的要求:不僅要快速地將海量業務資料轉換為標準數學規劃模型,還要快速得到高質量的可行解,從而適應風雲變幻、實時性高的市場變化,在商業競爭中取得先機。華為的供應鏈場景便是這一挑戰的範例之一。一方面,華為供應鏈包含一百多家自有及外協工廠,以及數萬原材料、中介軟體和成品型別,共同支撐起華為橫跨智慧手機、物聯網、電信基礎設施等領域的龐大產品版圖。這些元器件之間的加工依賴、替代和轉運關係極其複雜,往往需要數以百萬甚至千萬計的決策變數和約束,才能較為精確地描述每天在每個工廠加工的各種元器件數量、工廠間元器件轉運量、原材料採購量等多類關鍵排產決策,單次建模及求解的複雜度巨大,往往需要數小時。另一方面,在美國禁運制裁(供應商不確定性陡增)、原材料成本及產能波動、訂單變化等多種動態因素影響下,華為供應鏈的供需情況瞬息萬變。華為的供應鏈計劃部門需要及時針對當前及未來預估情況,識別可能出現供應瓶頸的元器件,並對多種可能方案進行評估,從而最終做出採購、加工等決策,以最大程度滿足世界各地數以百萬計的訂單需求,而這些決策的關鍵依據正是上述數學規劃引擎給出的模擬排產結果。因此,數學規劃引擎需要針對各種可能出現的情況(如原材料不足,產能受限等)快速進行建模及求解,時間限制往往是分鐘級。另外,相對高效的數學規劃建模軟體和求解器(如 AMPL、Gurobi)作為美國商業軟體,同樣對華為禁售,這更使得華為的供應鏈決策雪上加霜。華為供應鏈供需模擬場景,需要透過供需模擬對瞬息萬變的供需情況及時做出分析和評估,從而輔助最終決策。這一過程需要對百萬變數的數學規劃模型進行分鐘級的快速建模和求解,對代數建模系統提出了極高要求在以上困難的情況下,來自倫敦大學學院(UCL)、華為諾亞方舟實驗室、復旦大學的研究人員提出並開發了新型的超大規模數學規劃建模系統 Grassland,為上述挑戰提供了一個端到端的高效解決方案。論文地址:https://arxiv.org/abs/2108.04586首先,Grassland 包含一套極為高效的代數建模語言及模型轉換演算法,充分挖掘真實建模資料的稀疏性和建模過程的可並行性,可以在數秒鐘內將海量原始業務資料轉換為百萬變數的標準最佳化模型,比當前最先進的商業方案快 6~10 倍。然後,Grassland 針對商業場景中常見的序列模型,給出了一套啟發式的有損分解方案,可以以較小的最優性損失換來數十倍的求解加速,同時嚴格保證解的可行性,足以滿足現實商業場景的最優性需求。Grassland 現已部署在華為的大規模實際生產計劃場景中,使得供應鏈計劃部門能夠快速完成供需模擬等關鍵任務,在器件供應受限、波動劇烈的特殊時期快速對供需情況進行建模與模擬,輔助華為供應鏈最終決策。相關論文現已被 CIKM 2021 全文接收。對於一組決策變數,一個完整的數學規劃模型由目標f(x)和約束兩部分組成,即. 在實際商業場景中,目標f(x)對應於希望達成的商業目標(例如,最大化訂單滿足率,最小化成本),而約束對應於需要遵守的商業規則和現實限制(例如,倉庫的出庫量與入庫量之差不能大於庫存量)。在大規模場景中,雖然目標往往只有一行表示式,但約束的數量卻可以數以百萬計,從而成為建模過程的主要瓶頸。我們接下來以經典的網路流模型為例介紹這一問題。如圖所示,可以將有向圖想象成水管網路,源點 1 和匯點 4 想象成水管網路的供水口和出水口,對於任意一條有向邊(i,j),有流量,代表從頂點 i 流到 j 的水流量。網路流問題需要滿足一個自然的約束,即對於所有中間頂點,其總流出量應當等於總流入量。而對於源點和匯點,其總流出量和總流入量應當等於一個定值,即網路的總流量(簡單起見令其為 1)。我們將其寫作按照公式的字面意義,我們可以對頂點集合中的所有頂點進行遍歷,從而輸出實際的約束如下:i=1 時,找到所有滿足和的元素,分別為 (1,2), (1,3) 和空集,因此有i=2 時,找到所有滿足和的元素,分別為 (2,4) 和(1,2), (3,2),因此有i=3 時,找到所有滿足和的元素,分別為 (3,2), (3,4) 和(1,3),因此有i=4 時,找到所有滿足和的元素,分別為空集和(2,4),(3,4),因此有然而容易看出,以上過程需要對頂點集合V中的每一個元素進行迭代,每次迭代時需要遍歷邊集E,本質是一個二重迴圈,時間複雜度是O(|V||E|) 的!如果我們有數以百萬計的頂點和邊,這種生成約束的方法就完全行不通了。雖然針對這裡的簡單例子可以有一些加速方案(例如對邊集E做預先索引),但通用性差,需要根據問題定製,難以根本性地解決複雜商業場景建模效率低下的問題。
那麼,是否存在既方便通用,又足夠高效的約束生成方法呢? 1.1 Grassland:約束生成的高效 “種草” 演算法答案是肯定的。為了說明這一點,我們將約束表示式和根據資料生成的四條約束整理如下:我們使用紅色和藍色分別標記出第一個求和表示式(總流出量)和第二個求和表示式(總流入量)在四個約束中所對應的變數項x。我們會發現,它們恰好都在四個約束中分別出現了 5 次,且完整對應於邊集資料E。這是一個巧合嗎?並非如此!以總流出量為例,求和符號的條件是,而作為約束的下標,會遍歷所有可能的取值。因此當 i 的遍歷完成後,E也會被不多不少恰好遍歷一次,使得四個約束裡一定會出現 5 個與E一一對應的變數項x。1. 將約束左側表示式中的所有約束下標標記出來(本例中為 i)2. 無視表示式後的約束下標,直接對第一個和第二個求和表示式中的分別進行遍歷,得到總計 10 個變數項。同時,每個變數項對應的約束下標值進行額外標記(這裡使用紅色標出)。3. 根據上一步對每個變數項額外標註的約束下標(紅色標記),對變數項進行歸類(可以使用雜湊表)以上步驟其實很類似於一個 “種草” 的過程。如果我們將線性約束的約束矩陣視作一片土地(Land),那麼我們其實是在第 1、2 步批次生成了所有要種在這片土地上的草苗(Grass),然後在第 3、4 步將這些草苗一棵棵地種在了約束矩陣A的適當位置。這也是本系統被命名為 “Grassland” 的由來。不難看出,如果我們將第三步雜湊表歸類的單次時間複雜度視為O(1),那麼整個約束建模過程的時間複雜度是的!也就是說,我們僅僅是將邊集資料E掃描了常數次,就完成了約束的建模過程。同時值得注意的是,這種方案的通用性極高。只要約束是線性的(絕大多數可大規模求解的模型都要求約束為線性),且求和表示式的條件都寫作 “下標∈資料” 的格式,就可以使用這一方法進行約束建模,在華為供應鏈不同場景下數十種超大規模複雜約束下均表現出色。論文中詳細討論了上述建模過程和直接按照公式建模的等價性。透過上述簡單高效的建模演算法,我們已經可以在大規模線性約束上獲得遠勝大多數開源建模工具,媲美商業建模軟體的效率。然而,面對近年來百萬甚至千萬規模大小的超大模型,即使是最出色的商業建模軟體也需要數十秒甚至數分鐘才能完成一次轉換,這對於很多需要不斷迭代或序列建模最佳化的場景而言依然是難以接受的。而 Grassland 真正的強大之處在於,如同矩陣計算的並行化加速一樣,它可以從框架層面實現完全的並行化建模,從而徹底突破大規模線性規劃建模的效率瓶頸。為例。假設我們有兩個 CPU 核,可以互不干擾地並行處理子任務,那麼是否有一種方法可以將建模任務平均分配到兩個 CPU 上呢?從公式的字面意義來看,這件事情並不難。我們只需將頂點集合平分為,並讓兩個 CPU 核分別處理,生成和,最後合併即可,我們將這個過程稱為“對約束空間的切分”。然而,正如我們前面的分析所示,大規模場景下按照公式字面意義進行建模是完全不實際的,即使能將任務平分到多個 CPU 上也不例外。而 Grassland 透過將對約束空間的切分轉換為對資料的切分解決了這一問題。可以透過以下步驟在兩個 CPU 上並行生成約束:
2. 注意到第一個求和表示式(總流出量)的條件中約束下標在第一位,第二個求和符號(總流入量)中約束下標在第二位,於是我們準備兩份的副本和,一個按資料首位排序,一個按資料第二位排序,即由於E_out和E_in除了順序外沒有任何區別,所以結果並不會改變。
3. 將排序後的資料按照對應的排序維度,在 2 和 3 之間進行切分(可以使用二分查詢找到切割點),並將切分後的資料分別分配給兩個 CPU 進行上一節所介紹的約束生成。即我們會發現,透過對資料進行切分所得到的結果,恰好相當於我們將四個約束按約束下標切成兩份。這並不是巧合!論文中詳細討論了約束空間切分和資料切分的等價性。有了上述基於資料切分的並行化建模方法,我們便宛如有了一臺大功率的 “聯合種草機”,可以充分利用大型伺服器的多核計算資源,在約束矩陣的“土地” 上,以數十個 CPU 核同時進行變數項 “草苗” 的生成和種植,數秒內生成上百萬變數的數學規劃模型絲毫不在話下。考慮到這樣規模的模型往往需要佔據數百兆的磁碟空間,Grassland 的模型輸出速率甚至超越了大多數機械硬碟的寫入速度。若要充分感受 Grassland 的效能,請務必為伺服器準備一塊固態硬碟或者 RamDisk。1.3 作為代數建模系統的 Grassland:Show me the code!為了讓一線的模型開發和研究人員迅速上手 Grassland 的建模方法,我們為 Grassland 設計了一套高層的建模 API。只要使用這套 API 的語法進行模型開發,就可以讓 Grassland 全程接管建模轉換過程,而無需擔心效率問題。這套 API 最大的特點,是無需建模人員顯式編寫任何的迴圈語句來生成約束。僅需將模型的目標及約束表示式以計算圖節點連線的形式表示,並向定義好的計算圖模型中送入實際業務資料,即可迅速進行建模轉換。這點與我們熟知的基於計算圖的開發框架——TensorFlow 十分類似。有 TensorFlow 基礎的開發者可以迅速上手。為了說明 Grassland 作為代數建模系統的使用特點,我們將其與 Coin-OR 推出的流行建模框架 PuLP(https://github.com/coin-or/pulp)進行對比。對於上述的網路流問題約束使用 PuLP 建模程式碼如下(為了方便起見,下標改為從 0 開始):import pulp
V = [0, 1, 2, 3]
E = [(0, 1), (0, 2), (1, 3), (2, 1), (2, 3)]
S = [1, 0, 0, -1]
prob = pulp.Lp
Problem()
x = pulp.LpVariable.dicts('x', (range(len(V)), range(len(V))))
for v in V:
flow_in = pulp.lpSum(x[i][j] for i, j in E if i == v)
flow_out = pulp.lpSum(x[i][j] for i, j in E if j == v)
prob += flow_in - flow_out == S[v]
print(prob)
可見,我們的建模過程和約束表示式的字面意義基本一致。透過外層迴圈(for v in V:)遍歷所有頂點,並在內層的列表生成式(x[i][j] for i, j in E if i == v)遍歷所有邊,構造總流入量 flow_in 和總流出量 flow_out 表示式後,得到單條約束表示式 flow_in - flow_out == S[v]並新增到模型。本質上是一個二重迴圈。雖然程式碼簡潔,然而O(|V||E|)的時間複雜度不盡如人意,當 V 和 E 規模較大時便無法勝任建模任務。import grassland as gl
max_V = 4
model = gl.Model()
x = gl.Variable(name='x', shape=(max_V, max_V))
i = gl.IndexPlaceholder(range=(0, max_V))
E_in = gl.Constant(shape=(max_V, max_V))
E_out = gl.Constant(shape=(max_V, max_V))
S_ = gl.Constant(shape=(max_V,))
flow_out = gl.cond_sum(index_placeholders(i, 'j'),cond=E_out,
expr=gl.Expression(x[i, 'j']))
flow_in = gl.cond_sum(index_placeholders=('j', i), cond=E_in,
expr=gl.Expression(x[i, 'j']))
model.add_constraint(
gl.constraint(expr=flow_in - flow_out, sense='=', rhs=S,
axes=[i], parallel_axes[i])
)
V = gl.COO([0, 1, 2, 3])
E = gl.COO([(0, 1), (0, 2), (1, 3), (2, 1), (2, 3)])
E_T = gl.COO([(1, 0), (1, 2), (2, 0), (3, 1), (3, 2)])
S = gl.COO([1, 0, 0, -1])
model.generate_lp(feed_dict={E_out: E, E_in: E_T, S_: S},
num_workers=2, filename='network_flow.lp')
這段程式碼首先定義計算圖中所需要的變數 x 和待定常數 E_in,E_out(很類似於 TensorFlow 1.X 中的 tf.get_variable()和 tf.placeholder()。同時,我們使用 i = gl.IndexPlaceholder()這一 Grassland 中的特殊型別來定義約束下標。接下來,構建總流入量 flow_in 和總流出量 flow_out 表示式,這一部分無需對約束下標 i 的所有可能取值進行迴圈遍歷,而是使用 Grassland 中的計算圖節點 gl.cond_sum 構造出表示式和。gl.cond_sum 包含三個引數:下標 index_placeholders、資料 cond 和表示式,即下標 index_placeholders:傳入一個 Python 元組,依次列出與資料對應的下標。其中,約束中出現的下標(例如前文中使用紅色標識的下標 i,在論文中稱為全域性下標,global index placeholder)使用 gl.IndexPlaceholder()定義,而其他在求和符號中區域性使用的下標(例如網路流約束中的下標 j,在論文中稱為區域性下標,local index placeholder)使用 python 字串定義。例如,可以傳入描述的下標部分(紅色標出)。資料 cond:傳入一個 gl.Constant 物件,作為計算圖的佔位符以供後續傳入實際資料。值得注意的是,Grassland 使用稀疏張量(Sparse Tensor)來表示資料。例如,E = [(0, 1), (0, 2), (1, 3), (2, 1), (2, 3)] 可以被視為一個 4×4 的布林型別二維張量(矩陣)的稀疏表示形式。特別值得注意的是,稀疏張量資料預設按照第一個維度進行排序,因此對於總流出量,我們將其改寫為,將資料的第二個維度和第一個維度交換,並按照交換後的第一個維度(原第二個維度)排序即可。表示式 expr:傳入一個 gl.Expression 物件,可以是經由其他計算節點處理後的表示式,也可以是一個葉子節點表示式,由變數和變數係數(預設為 1)表示。例如,可以傳入葉子結點表示式來描述的表示式部分(紅色標出)。然後,構建約束物件 gl.constraint 並使用 model.add_constraint 方法新增到模型。約束需要指定約束公式的左表示式 expr、符號 sense(,或=)和右邊的常數項 rhs。除此以外,還需指定約束下標 axes,列出所有在約束中使用的下標維度。例如,針對網路流約束的而指定 axes=[i]。在大規模排產模型中,約束往往至少有三維,即時刻 t - 工廠 p - 產品編號 i,此時需要指定 axes=[t, p, i]。為了進行並行化建模,還需指定用於進行資料切分的下標維度 parallel_axes,一般指定約束的第一個下標維度即可。至此,我們已經完成了模型計算圖的構建。我們可以在這一步匯出模型留作後續使用(類似於 TensorFlow 中的 SavedModel), 也可以直接進行模型轉換任務。當我們獲得了實際的業務資料時(例如網路流約束中的 V、E 和 S),我們首先將其轉換為 COO 格式(Coordinate List)的稀疏張量,然後執行模型的 generate_lp 方法並使用 feed_dict 引數傳入資料(一個字典,鍵為計算圖裡的佔位符,值為實際資料,非常類似於 TensorFlow 1.X 中 session.run 的 feed_dict 引數),指定並行執行緒數 num_workers 和輸出檔名 filename。Grassland 將模型計算圖和資料傳入 C++ 實現的高效後端,並行執行前文所介紹的 “種草” 快速建模演算法,即可得到標準的數學規劃模型檔案。儘管使用上相較 PuLP 稍顯繁瑣,然而其效率不可同日而語。即使資料規模達到百萬級別,Grassland 也能在頃刻之間完成建模轉換。在部分經典數學規劃模型上,使用百萬規模資料進行的效能測試。可見 Grassland 具備數量級的優勢。(PuLP 由於實在過於低效而不在此效能測試之列)2. 高效求解:如何提升大規模商業數學規劃模型的求解效率
當我們突破建模過程的效率瓶頸後,接下來的挑戰便是如何快速獲得較優的嚴格可行解。一個自然的想法是開發速度更快的數學規劃求解器,然而這一領域自上世紀 80 年代起已經過了數十年的發展,想要在通用場景下大幅超過 Gurobi、Cplex 等高度成熟的商業求解器方案並不現實。不過,雖然當前成熟的求解器求解上百萬規模的模型相當吃力(數十分鐘甚至數小時),但求解數萬至數十萬變數的中小規模模型卻是很輕鬆的(數十秒甚至數秒)。由此,我們考慮另一種思路,即分析大規模商業數學規劃模型的特點,將複雜的大模型分解成若干易於求解的中小模型,從而減輕求解器負擔,達到快速求解的目的。商業場景下的數學規劃模型之所以體量巨大,除去業務規模本身的因素以外,還有一個重要原因,是這類模型往往需要進行序列化的動態決策。例如,在供應鏈排產場景下,需要決策所有元器件在整個排產週期 T 內的生產量,週期內的每一個時刻 t 都需要有一個單獨的決策變數。也就是說,決策變數的數目和決策週期 T 成正比。或許單個時刻內的決策變數並不多(上萬或者數十萬),但當決策週期 T 較大時,數學規劃模型就會迅速膨脹,讓求解器不堪重負。那麼,我們是不是隻要對決策週期 T 進行簡單的切分就行呢?例如,對於 28 天的排產週期,我們將其分成 4 份,首先排產 1-7 天,然後排產 8-14 天,以此類推。這樣每次排產時求解器只需要求解原先 1/4 規模的模型,如果我們根據經驗性的求解時間複雜度(N為決策變數數量)推斷,分解後的求解時間會是直接求解的,不可謂不快。如果分解的塊數更多,速度提升甚至會更加顯著。我們將這種方式稱之為“滾動時域求解”(Rolling Horizon,RH)。然而,這樣做有一個致命的缺點,就是模型的決策將非常“短視”,每次決策都只關注於當前小的決策片段的區域性最優性,而無法顧及全域性。例如,若在排產週期的第 28 天對某物品有一個大的訂單需求,且生產該物品需要 10 天,那麼第 1-7、8-14、15-21 天的決策中都不會考慮這一需求,從而不進行足量的生產,而等到第 22-28 天開工生產已為時晚矣。分塊的數量越多,短視的現象就越嚴重,從而嚴重影響到模型決策的最優性。為了改善決策的全域性最優性,一個較為簡單的方式是在當前的決策片段中加入 “聚合” 後的未來資訊。例如,在求解第 1-7 天的排產模型時,我們將第 8-28 天的所有訂單需求和供應資訊進行聚合,作為 “虛擬” 的第 8 天加入到 1-7 天排產模型的末尾,形成一個 8 天的模型。在求解第 8-14 天的排產模型時也聚合第 15-28 天的資訊,以此類推。透過這種方式,當前決策片段的模型可以在一定程度上感知到未來資訊,從而提升全域性最優性。而在論文中,我們提出另一種改善全域性最優性的方式,即 “基於粗粒度引導的滾動時域求解”。這種方式首先將資料分段聚合,並求解一個粗粒度的數學規劃模型,然後使用粗粒度模型的解,對細粒度滾動時域求解的子問題進行“引導”,以讓細粒度子問題求解結果的聚合值與粗粒度模型的解儘可能一致。還是以 28 天的排產模型為例,我們首先將資料按周(7 天)進行聚合,形成一個以周為單位,決策週期為 4 的聚合資料,並以此建立一個 4 周的“粗粒度模型”。由於資料被聚合,這個粗粒度模型決策週期僅為 4,遠小於全規模模型。求解該模型後,我們得到了每個器件每一週應該進行的生產量。接下來,我們進行滾動時域求解,同時在求解第 1-7 天的排產模型時,加入額外的軟性約束(懲罰項),要求第 1 天到第 7 天的生產量之和與粗粒度模型求解得到的“第 1 周總生產量” 儘可能接近(將距離的絕對值罰到目標函式上),以此類推。透過這種方式,我們讓每個決策片段求解的時候同時考慮到粗粒度模型所包含的全域性資訊,從而提升全域性最優性。這兩種改善全域性最優性的方式在實際運用中各有千秋。然而細心的讀者可能注意到,這兩種方法並沒有任何衝突的地方,即使同時使用也沒有任何問題。正所謂,小孩子才做選擇,成年人:我都要。於是,我們將兩種方法進行聚合,從而得到了最終方案。值得一提的是,當我們使用上述方式求解完成並得到整個決策週期的一組可行解後,我們依然有方法進一步提升解的全域性最優性。注意到在整個決策週期中,我們更關注較為靠前時刻的決策變數取值,因為這部分決策往往需要業務部門及時響應執行。因此,我們也更希望提升這部分決策變數的全域性最優性。為了達成這一目的,我們可以 “釋放” 前若干個時刻的求解結果,而固定後面所有時刻的解,從而在全決策週期的層面對模型進行重解。雖然這裡需要求解全決策週期尺寸的模型,但由於其中大部分決策變數的值都已經固定,因此實際待求解的決策變數規模依然是可接受的。同時,由於原始解已經是問題的一組可行解,釋放部分變數並重新求解的結果一定不會差於原始解。我們將上述分解方案整合進 Grassland 建模系統,並在華為供應鏈 78 周的供需模擬場景(決策變數數約 600 萬,約束數約 350 萬)下對效能進行了端到端的測試,結果如下圖所示。可見 Grassland 建模演算法結合我們提出的分解方案(G-FRH),可以將建模 + 求解的端到端時間從原始的約 4000 秒縮減到 200 秒左右,而最優性的損失僅為千分之 3.6。若加入重解機制,損失還可以進一步壓低到千分之 3.3。考慮到商業建模場景中有著許多更為決定性的誤差來源(例如對未來的資料預測誤差,建模本身簡化問題帶來的誤差),在保證嚴格可行性的前提下,千分之三左右的最優性誤差幾乎可以忽略不計。而近 20 倍的速度提升意味著供應鏈部門能夠以近乎實時的速度獲取各種場景下的模擬排產結果,從而高效、快速地進行方案迭代和最終的生產、採購決策,從而在風雲變幻的市場變化和商業競爭中取得先機。Grassland 在華為 78 周供需模擬場景下的端到端效能測試結果。藍色部分為建模時間,紅色部分為求解時間。
以上分解演算法的核心是將大問題拆分成多個小問題進行建模與求解,而 Grassland 中的高效建模演算法能進一步加速上層分解演算法在實施中的效率,建模與求解模組相輔相成。主要建模語言都擁有自己的演算法庫,Grassland 的演算法庫後續也會持續結合具體的序列化問題進行不斷完善。當前 Grassland 開發團隊也在積極將此項工作作為軟體部署在華為公有云上,預計將於今年年底前釋出一個公開的版本,希望幫助廣大開發者解決實際的最佳化問題。本研究由來自倫敦大學學院(UCL)汪軍教授團隊、華為諾亞方舟實驗室企業智慧團隊、復旦大學的研究人員共同完成。主要作者包括:李錫涵,倫敦大學學院計算機系博士研究生,主要研究方向為學習最佳化,在 AAMAS、CIKM、COLING 發表學術論文。TensorFlow技術專家,開源技術手冊《簡明的 TensorFlow 2》(https://tf.wiki)作者。
韓雄威,研究生畢業於華中科技大學管理科學與工程專業,現任華為諾亞方舟實驗室高階研究員,供應鏈高階演算法科學家,主要研究方向為運籌學、學習最佳化等技術,致力將其運用於供應鏈領域的組合最佳化問題。
周之爍,本碩畢業於復旦大學大資料學院。碩士研究生期間師從江如俊副教授,研究方向為最最佳化演算法、非凸最佳化。
*注:公開發布的 Grassland 在部分 API 名稱,資料封裝方式等細節上可能與本文中展示的 Grassland 示例程式碼有所差異,請以最終釋出版本為準。