-
論文:A new approach solve the multi-product multi-period inventory lot sizing with supplier selection problem
-
期刊:Computer & Operations Research
1. 模型建立:具有供應商選擇問題的多產品多週期庫存批次確定
1.1 問題定義
將具有供應商選擇問題的多產品多週期庫存批次問題正式定義如下:
-
假設計劃週期有限,市場需求已知且有多種產品,每種產品可以由一組供應商提供(比如:在某個計劃期內,一種產品可以在一個或多個供應商處採購)
-
在每個週期向供應商下訂單時,會產生供應商訂購成本(supplier ordering cost)
-
對於每個週期,若產品在一整個週期內都在倉庫中,則會產生庫存持有成本(product holding cost)
-
假設不允許缺貨,且庫存大小沒有限制
1.2 考慮供應商選擇問題的多產品多週期庫存批次的混合整數線性規劃模型
符號說明
下標
-
\(i=1,2,3,\dots,I\) 產品的索引
-
\(j=1,2,3,\dots,J\) 供應商的索引
-
\(t=1,2,3,\dots,T\) 計劃週期的索引
引數
-
\(D_{it}=\)產品\(i\)在週期\(t\)的需求
-
\(P_{ij}=\)產品\(i\)從供應商\(j\)處購買的採購價格
-
\(H_i=\)產品\(i\)在每個週期的持有成本
-
\(O_{j}=\)供應商\(j\)的訂貨成本
決策變數
-
\(X_{ijt}=\)在週期\(t\)產品\(i\)從供應商\(j\)處訂購的批次
-
\(Y_{jt}=\begin{cases}1&\text{if 在週期t向供應商j下訂單}\\0&\text{otherwise}\end{cases}\)
混合整數線性規劃模型(MILP)的建立
-
(1):目標函式為買方的總成本,即總採購成本+總訂貨成本+總庫存持有成本
-
(2):為防止缺貨發生,對於各個週期內的各個產品,在該週期前(包括該週期)的總訂購量必須大於或等於在該週期前(包括該週期)的總需求量
-
(3):對於每個週期,每個產品必須先向對應的供應商下單才能訂購,約束條件(3)確定了在不收取相應訂購成本的情況下下訂單是不可能的,即\(Y_{jt}=0\)時,該約束不成立。(我覺得這個設定很巧妙,因為當\(Y_{jt}=1\)時,對應週期和產品在供應商\(j\)處的訂購量不會超過後面週期中該產品的總需求量,也就是說這條約束還同時限制了\(D_{ik}\)的求解範圍)
-
(4)、(5):決策變數取值範圍約束
由於這個問題是一個NP難問題,當例項較大時問題會變得無法解決。該模型透過商業整數線性規劃求解器在非常小的例項大小下求解到最優性。對於現實世界中常見的大尺寸例項,該問題無法最優解決。
2.基於減少與最佳化方法(reduce and optimize approach, ROA)求解具有供應商選擇的多產品多週期庫存批次問題
本節提出了一種啟發式演算法,用於求解多產品多週期庫存批次與供應商選擇問題的混合整數線性規劃(MILP)。
加強數學公式的一種方法是在模型中新增有效的不等式。因此,透過包括以下有效不等式(6),進一步加強了上面剛剛提出的數學公式(1)~(5):
該不等式對週期\(t\)使用的供應商總數施加了邊界。儘管不等式(6)對上述模型來說是多餘的,但有助於幫助CPLEX建立一些新的cuts。
作者發現,式(6)對最佳化過程有積極影響,特別是在求解質量和時間上。
2.1 Reduce and optimize approach (ROA)
減少和最佳化方ROA的解釋如下。ROA是基於原始問題建立一個減小的可行域(ruduce feasible region) 並對其進行最佳化。儘管在大多數情況下,ROA不能確保最優性,但它可以在合理的時間內獲得接近最優的解。儘管如此,如果手頭問題的最優解對於減小問題是可行的,那麼ROA保證了最優解。從根本上講,ROA在以下宣告中列出:
-
\(B_C:\)整個數學模型中的二進位制變數集合(假設有\(n\)個二進位制變數\(y_1,y_2,\dots,y_n\))
-
\(B_O:\)在未知最優解中,二進位制變數等於1的集合
-
\(B_R:\)約簡集合(reduce set),包含了部分的二進位制變數
-
要求上述集合滿足條件:\(B_O\subseteq{B_R}\subseteq{B_C}\)
顯然,ROA的挑戰是獲得集合\(B_R\),使得\(B_R\)是集合\(B_C\)的子集,並且覆蓋集合\(B_O\)。然後ROA使用商業MIP求解器(如CPLEX)在減小的可行空間\(B_R\)上重複最佳化問題。換句話說,將不在集合\(B_R\)中的二進位制變數固定為等於0(即\(y_i=0\)當且僅當\(y_i\in{B_C-B_R}\))。
至關重要的是,在某些情況下,ROA找不到好的解決方案。這些情況是:
-
① 當集合\(B_R\)僅包含集合\(B_O\)的一部分時
-
② 當集合\(B_R\)和\(B_O\)不相交時。
-
此外,值得一提的是,具有最優解的集合\(B_O\)總是不確定的。
ROA基本上由四個階段組成:
-
第一階段構建了一個可行的變數約簡集(初始集\(B_R\))。
-
第二階段在約簡的變數集中最佳化數學模型。
-
第三階段選擇要包括在約簡的變數集中的新變數。
-
第四階段細化約簡的數學模型,然後進入第二階段。
這裡,有一些方法可以構造初始集合\(B_R\):
-
① 隨機建立初始集合\(B_R\)
-
② 在短時間內求解問題的完全模型,然後使用其現有解(即,在現有解決方案中等於1的變數形成集合\(B_R\))
-
③ 求解問題的一個LP鬆弛並使用其最優解(即,在最優LP鬆弛解中等於1的變數形成集合\(B_R\))
-
④ 用啟發式方法解決問題以構造初始集合\(B_R\)
-
⑤ 以上方式的組合
在本文中,ROA的第三階段是迭代地增強集合\(B_R\)。該任務可以透過從先前解決的約簡問題的解決方案中獲取資訊來執行。這裡,為了提高\(B_R\),建議獲得不在集合\(B_R\)中的變數的降低成本(reduce cost)。然後在\(B_R\)上重新最佳化問題,直到滿足停止條件,或者(在最小化問題中)沒有發現更多的負降低成本。
值得一提的是,二進位制變數的降低成本是無法確定的。然而,可以容易地求解LP鬆弛,然後獲得不在集合\(B_R\)中的變數的降低的成本。然後,具有負降低成本的變數需要包括在集合\(B_R\)中。為了防止集合\(B_R\)在每次改進迭代中持續增長時達到不可管理的大小,集合\(B_R\)中降低成本大於或等於零的變數從集合中刪除。此外,還建立了要新增到集合\(B_R\)的變數的最大數量。
值得一提的是,存在幾種流行的演算法,用於解決類似於多產品多週期庫存批次與供應商選擇問題的問題。其中一些是基於遺傳演算法(GA)、粒子群最佳化(PSO)、蟻群最佳化(ACO)、分散搜尋(SS)、差分進化(DE)等。這些演算法有一組候選解,並且它們迭代地改進解的集合。相反,減少和最佳化方法(ROA)總是考慮一個小的二進位制變數集,並在這個集上最佳化問題。這是其他流行演算法(GA、PSO、ACO、SS、DE)和ROA的主要區別。
2.2 一種基於ROA的啟發式演算法
在這一小節中,提出了一種啟發式演算法。啟發式演算法中使用了以下縮寫:RedMILP、RelaxMILP、max-nva、nvnrc、LBvar和UBvar。
-
RedMILP是MILP模型,但當最佳化問題在一組二進位制變數(\(Y_{jt}\))上求解時。
-
RelaxMILP是一個鬆弛的MILP模型,其中所有二進位制變數都是鬆弛的。
-
max-nva表示要新增到集合\(B_R\)中的最大變數數。
-
nvnrc表示成本為負的變數數。
-
\(LB_{var}\)和\(UB_{var}\)表示決策變數\(Y_{jt}\)的下界和上界。
-
\(Y^{WW}_{jt}\)表示Wagner–Whitin[23]演算法找到的解。上標WW對應Wagner–Whitin的首字母縮寫。
-
\(Y^S_{jt}\)中的上標\(S\)表示“解”。
-
\(Y^c_{jt}\)中上標\(C\)對應“連續”;這是當二進位制變數被放寬為取連續值時。
-
\(RCY_{jt}\)表示變數\(Y^c_{jt}\)的降低成本。
需要指出的是,公式模型總是包含約束(2)、(3)、(4)、(5)和所提出的有效不等式(6)。解決過程由以下演算法中顯示的虛擬碼描述:
上述啟發式演算法的工作原理如下。
-
Step 1. 初始集是應用Wagner–Whitin[23]演算法構建的。在這一步驟中,目標是從哪個供應商\(j\)和在哪個時間段\(t\)購買產品,不需要確定批次。換言之,Wagner–Whitin[23]演算法僅用於確定初始集\(B_R\)中必須包括哪些二進位制變數(即\(Y_{jt}\))。
-
Step 2. 從最佳化問題的初始可行集\(B_R\)開始,求解\(β\)時間單位的RedMILP模型。如果\(clock<\tau\),則轉到Step 3。否則,演算法停止並返回現有的解決方案。
-
Step 3. 一旦求解了RedMILP,則確定現有解的每個二進位制變數(\(Y^S_{jt}\))的值,並將在Step 4中使用該值。
-
Step 4. 利用所有二進位制變數的值,構建連續變數集,將下限和上限設定為Step 3中獲得的相應值
-
Step 5. 在這裡,一個稱為RelaxMILP的代理問題(surrogate problem)得到了解決。此操作是指用於確定Step 4中定義的每個變數的reduce cost的策略。
-
Step 6. 在該步驟中,如果沒有更多具有負降低成本(negative reduce costs)的變數新增到\(B_R\),則演算法停止並返回現有解決方案。否則,可以在Step 7中增強集合\(B_R\)。
-
Step 7. 現在,集合\(B_R\)改進如下:如果nvnrc<max-nva,則將nvnrc變數新增到集合\(B_R\)。否則,將具有最大負降低成本的max-nva變數新增到設定\(B_R\)。返回Step 2。
正如大多數啟發式演算法的典型情況一樣,必須定義一些引數。在該演算法中,需要確定初始集\(B_R\)和以下引數的值:\(β\)、\(τ\)和max-nva。用於\(β\)、\(τ\)和max-nva的值分別為8分鐘、30分鐘和400。很明顯,在非常大的情況下,negative reduce cost的變數數量也是一個很大的數字。因此,至關重要的是,考慮到具有10000個二進位制變數的最大例項的大小,建立變數的最大數量(max-nva)。max-nva的值設定為最大例項中二進位制變數總數的4%。