第三章 數學模式與求解演算法
3.3 變數產生法(Column Generation)
3.3.1 主問題(Master Problem)
由3.1節可知,本研究將有時間窗限制的收送貨問題建構為集合分割問題,使所有任
3.3.2 受限主問題(Restricted Master Problem)
由於主問題所包含之路徑組合(R)數量龐大,故在求解主問題前先產生一組包含起始 可行解之變數,僅包含起始可行解變數之主問題即稱為受限主問題(Restricted Master Problem)。本研究以同一訂單需求為一條路徑視為主問題之起始可行變數,即一條路徑
3.3.3 子問題(SubProblem)
由於將主問題建構為一線性規劃問題,故可利用簡捷法(Simplex Method)求解受限 主問題的最佳解,與其所對應的對偶變數值。並依據對偶理論(Dual Theory),定義受 限主問題之限制式(28)對應之對偶變數為𝜋𝑖,限制式(29)對應之對偶變數為𝜋0,受主問 題之對偶問題(Dual Problem)如(31)所示:
法(Branch and Bound)以求得整數解。由於一條路徑之旅行距離成本等於該路徑所有經 過之節線加總,故𝐶𝑟= (𝑖,𝑗 )𝜖𝐴𝑑𝑖𝑗𝑥𝑖𝑗𝑟,其中 A 為所有節線的集合,𝑑𝑖𝑗為節點 i 到節點到
(一) 路網結構
假設圖 G 為一路網,V 表示節點的集合,A 為節線的集合。因此,G 可以定義為 G = (V, A)。茲將其路網結構詳述如下:
1. 節點(node)
(1) 令 n 為訂單數,則節點集合 V 包含起點(0)、各訂單的收貨任務點𝑁+={1,2,…,n}
與各訂單的送貨任務點𝑁−={n+1,n+2,…,2n}與迄點(2n+1),訂單需求集合 𝑁 = {𝑁+∪ 𝑁−}。
(2) 每一訂單必有一收貨任務與一送貨任務,故每個收貨任務必有一相對應之送 貨任務與之配對(pairing constraint)。第 r 筆訂單之收貨任務即為節點集合 N 中之 r,送貨任務即為 n+r。
(3) 每個節點有數個屬性:節點編號 i、最早可開始執行之時間 ei、最晚需開始執 行之時間 li、需求載重量 qi、對偶變數值𝜋𝑖。若節點為收貨任務,則需求載 重量為正值;反之,若節點為送貨任務,則需求載重量為負值。
2. 節線(Arcs)
子問題路網中,每一任務皆以一節點表示,節線為兩不同節點相連所組成,
故 𝑖, 𝑗 ∈ 𝐴,其中𝑖, 𝑗 ∈ 𝑉且𝑖 ≠ 𝑗。節點分類包含收貨任務點、送貨任務點、起點 與迄點,各類節點間相互連接形成節線之條件如下所述:
(1) 起點(0)與所有收貨點相連接,迄點(2n+1)與所有送貨點相連。
(2) 任兩任務節點 i 與 j 間需符合𝑒𝑖 + 𝑡𝑖𝑗 ≤ 𝑙𝑗條件即可相連。其中 tij為任務節點 i 到任務節點 j 的旅行時間。
(3) 為 保 持 優 先 限 制 , 同 一 配 對 任 務 不 能 先 送 貨 再 收 貨 (n+i, i), (2n+1,0),(2n+1,i)(2n+1,n+i),i=1,…,n 等節線不可相連。
3. 節線成本(Cost)
由於變數產生法是依據簡捷法之對偶可行性(Dual Feasibility)判斷目前主問 題是否已找到最佳解,因此子問題即為在路網中產生最短路徑;路徑成本為經過 之節線成本加總,因此路網中節線成本加總頇滿足對偶可行性條件,即(32)所示。
但子問題路網中,對偶變數對應於節點上,因此定義節線成本時,需將對偶變數 轉移至節線上。
令節點 i 到節點 j 的節線成本定義為𝐶𝑖𝑗′ = 𝑑𝑖𝑗 − 𝜋𝑗,其中𝑑𝑖𝑗為節點 i 到節點 j 的旅行距離,𝜋𝑗為節點 j 所對應之對偶變數值。𝜋0於路網中則視為迄點之對偶變 數值。
因此,根據本研究所定義之節線成本,將子問題路網之節線成本修正為旅行
圖 5 起始可行變數示意圖
透過節點與節線之定義,可設定節點之間的連接情況,及各節線之對應成本。如 圖 6 所示,中括號為時間窗[ei,li],小括號為需求載重量(𝑞𝑖),以斜體字加底線書寫則 為本範例設定之起始解所求得之對偶變數值(𝜋𝑖與𝜋0)。假設旅行速度保持為 1m/s,則 各節點間之旅行時間等於旅行距離,已知各節點間之旅行時間(𝑡𝑖𝑗)等於旅行距離(𝑑𝑖𝑗),
即為圖 6 節線上之數字,則可藉由時間窗限制(𝑒𝑖 + 𝑡𝑖𝑗 ≤ 𝑙𝑗)、優先限制,與聯結限制 構建出一有向路網。而各節線所對應之成本則可藉由𝐶𝑖𝑗′ = 𝑑𝑖𝑗 − 𝜋𝑗求得。
圖 6 子問題路網建構圖
3.3.5 求解子問題演算法
由 3.3.3 節可知,子 問題為有限制之最短 路徑問題, 本研究應 用 Dijkstra’s Algorithm 求解最短路徑問題。Dijkstra’s Algorithm 於每次迭代(iteration)時,尋找標籤 尚未被固定且成本最小的節點,以此點更新其標籤尚未被固定的下游節點。若下游點 之成本標籤值比原成本還小時,則將其成本標籤與其前置點更新,並將該節點標籤固 定。
Dijkstra’s Algorithm 不 能 應 用 於 有 負 成 本 節 線 之 網 路 上 , 因 Dijkstra’s Algorithm 之觀念為每次選成本最小之節線,若節線成本有負,則所得到之最短路徑 並非真實之最短路徑。假設欲找一條從節點 S 到節點 D 之最短路徑,如圖 7 所示,迭 代 1 時,將固定節點 S,更新節點 1 的成本為 3 與節點 D 的成本為 2;迭代 2 時,固 定成本最小的節點 D,D 無其他可更新點;迭代 3,固定標籤尚為被固定且成本最小 的節點 1,從節點 1 至節點 D,因成本為負值,故到達節點 D 之成本為 1,比節點 D 已被固定之成本值還小。故 Dijkstra’s Algorithm 於負成本節線之網路不能找到最短路 徑。
圖 7 成本為負之 Dijkstra’s Algorithm
本研究之節線成本定義為節線距離減該點之對偶變數值,故節線可能有負成本之 情形,但本研究之子問題非單純之最短路徑,為有限制之最短路徑問題,除了需考量 成本外,尚有其他限制頇考量,如時間窗限制、優先限制、聯結限制與車容量限制等,
Dijkstra’s Algorithm 無法直接適用於本研究。有負成本節線之網路於有限制條件下仍 有機會求得真實之最短路徑,例如於圖 7 之迭代 3,從節點 1 至節點 D 雖比已被固定 之成本標籤小,但卻因為時間窗限制,無法到達節點 D,故從 S 到 D 點仍是最短路徑。
因此本研究應用多重標籤觀念[7],修正 Dijkstra’s Algorithm 求解子問題。
本研究提出修正後之 Dijkstra’s 演算法為考量多種收送貨因素下的最短路徑問題,
故除了考量傳統 Dijkstra’s 演算法之「成本 Ci」與「前置點 Pi」兩標籤外,尚包含用 來記錄收送貨問題限制情形的標籤,其包含有:「執行時間 Ti」、「累積載重 Li」,與「已 收未送的訂單集合 PickupSeti」等三個標籤,成為多重標籤 Dijkstra’s 演算法。其中「執
行時間 Ti」記錄車輛開始執行節點 i 之時間;「累積載重 Li」記錄執行完節點 i 後車輛 累積載重量;「已收未送的訂單集合 PickupSeti」記錄到執行完節點 i 後,已收取貨物 但尚未將其貨物送達送貨點之訂單(聯結限制)。
(一) 演算法 DECAP 之求解子問題演算法流程
本研究修正傳統Dijkstra’s更新節點之檢驗條件為演算法A,由於演算法A包含了許多 限制條件,故有迄點無上游點之缺點,因此本研究再提出改善之演算法B,演算法B包 含演算法B1與演算法B2,將演算法A與演算法B結合,即為本研究演算法DECAP求解子 問題之總演算法流程。如圖8所示。詳細步驟詳述如後。
演算法A 迄點是否有上游點
演算法B1
演算法B2
否
是
結束 開始
圖 8 求解子問題之總演算法流程圖 (二) 演算法 A
本研究修正傳統 Dijkstra’s 演算法更新節點之檢驗條件為演算法 A,修正方 式與演算步驟如下。
1. 修正傳統 Dijkstra’s 演算法更新節點之檢驗條件
演算法 A 在判斷是否更新每個節點之多重標籤前,除了與傳統 Dijkstra’s 演 算法相同需檢查成本外,亦需針對各節點做下列五種限制之判斷,使之能找到一 條滿足收送貨情形之最短路徑。若其一限制違反則停止檢查,不更新節點上之多 重標籤,並繼續檢查下一點。此五種限制如下:
(1). 優先限制:針對同一筆訂單,車輛需先執行訂單之收貨任務才可執行該訂單 之送貨任務。
(2). 聯結限制:每一訂單之收送貨任務均由同一輛車服務。
(3). 時間窗限制:若車輛在某節點 i 之最早可執行時間(ei)前到達,則車輛必頇等
候至最早時間(ei)才可開始執行任務;若車輛在某節點之最早可執行時間(ei) 與最晚可執行時間(li)之間到達,則車輛可直接執行任務;若車輛在某節點之 最晚可執行時間(li)後到達,則該車輛不可執行該節點。
(4). 車輛容量限制:若車輛於某一節點之累積載重超過車輛容量(Cap),則該車輛 不可執行該節點。
(5). 收送貨合理性:車輛之累積載重若不等於零,則車輛不允許回迄點。
2. 演算法 A 之執行步驟
演算法 A 步驟如下,流程圖如圖 9 所示。令 S 為標籤被固定住的節點集合。為分辨每 一節點於每一迭代是否已詴著更新,故將每一點分類為已嘗詴或未嘗詴。
步驟A-1. (多重標籤初始化)設定所有點的「前置點」為零、「累積載重」為零、起點 的「執行時間」為零,其他點的「執行時間」為無窮大,起點的「累積成 本」為零,其他點的「累積成本」為無窮大,所有點的「已收未送的訂單 集合」設為空集合。標籤被固定的節點集合設為空集合(S={∅});所有點設 為未嘗詴。
步驟A-2. (停止條件)若迄點已在 S 中,則演算法停止。反之,到步驟 A-3。
步驟A-3. 從標籤尚未被固定的點中,找成本最小的點,設為 u。並將 u 的標籤固定,
u 放入 S 中。
步驟A-4. 對所有與 u 相連的節點 j𝜖N,計算節線成本𝐶𝑢𝑗 = 𝑑𝑢𝑗 − 𝜋𝑗。
步驟A-5. 判斷節點 u 是否有與其相鄰(u 之下游點),且未嘗詴經過的點。若有,則設 該點為 v,到步驟 A-6;若無,則將所有點設為未嘗詴,到步驟 A-2。
步驟A-6. (優先限制)若節點 v 為收貨點,則滿足優先限制,到步驟 A-7。若節點 v 為 送貨點,則判斷節點 v 的收貨點是否在節點 u 的「已收未送的訂單集合」
中,若在,則滿足優先限制,到步驟 A-7;若不在,則違反優先限制,將 節點 v 設為已嘗詴,到步驟 A-5。
步驟A-7. (時間窗限制)若從節點 u 到達節點 v 的時間等於或早於節點 v 最晚可執行時 間(𝑇𝑢 + 𝑡𝑢𝑣 ≤ 𝑙𝑣),則滿足時間窗限制,到步驟 A-8;反之,若從節點 u 到 達節點 v 的時間大於節點 v 最晚可執行時間(𝑇𝑢 + 𝑡𝑢𝑣 > 𝑙𝑣),則違反時間窗 限制,將節點 v 設為已嘗詴,回到步驟 A-5。
步驟A-8. (車輛容量限制)若節點 v 為送貨點,則車上總載重減少,必滿足車輛容量限 制,到步驟 A-9;若節點 v 為收貨點,車上總載重將增加,故若節點 u 的累 積載重與節點 v 的需求載重量加總大於車輛容量(𝐿𝑢 + 𝑞𝑣 > 𝐶ap),則違反車 輛容量限制,將節點 v 設為已嘗詴,回到步驟 A-5;反之,若加總小於等於
車容量(𝐿𝑢 + 𝑞𝑣 ≤ 𝐶𝑎𝑝),則滿足車容量限制,到步驟 A-9。
步驟A-9. (成本限制)若節點 v 之成本比該點原本成本小 𝐶𝑢 + 𝐶𝑢𝑣 < 𝐶𝑣 ,則到步驟 A-10;否則,將節點 v 設為已嘗詴,回到步驟 A-5。
步驟A-10. (將節點 v 放入 S 中,並更新節點 v 的多重標籤)更新節點 v 的「前置點」為 Pv=u;節點 v 的「到達時間」為 Tv =Max(𝑇𝑢 + 𝑡𝑢𝑣, 𝑙𝑣);到節點 v 車輛的「累 積載重量」為𝐿𝑣 = 𝐿𝑢 + 𝑞𝑣;到 v 點「累積成本」為𝐶𝑣 = 𝐶𝑢 + 𝐶𝑢𝑣 = 𝐶𝑢 + 𝑑𝑢𝑣 − 𝜋𝑢;若節點 v 為收貨任務點則「已收未送的訂單集合」𝑃𝑖𝑐𝑘𝑢𝑝𝑆𝑒𝑡𝑣 = 𝑃𝑖𝑐𝑘𝑢𝑝𝑆𝑒𝑡𝑢 ∩ 𝑣,若節點 v 為送貨任務點則𝑃𝑖𝑐𝑘𝑢𝑝𝑆𝑒𝑡𝑣 = 𝑃𝑖𝑐𝑘𝑢𝑝𝑆𝑒𝑡𝑣\𝑣。
將節點 v 設為已嘗詴,到步驟 A-5。
A-1 多重標籤初始
(三) 演算法 B
演算法 A 為修正傳統 Dijkstra’s Algorithm 而得,但演算法 A 中隱含了無法求得一 條從起點至迄點的可行路徑之缺點。本小節將詳述演算法 A 之缺點、改善演算法A, 增加演算法 B 之方法與演算法 B 之演算流程。
1. 演算法 A 之缺點
1. 演算法 A 之缺點