• 沒有找到結果。

本研究提出的方法,基於許巍懷與蔣宗哲提出的MOEA-EO [14],容許不合 法解的參與,並對不合法解進行限制處理。

3.1 解的表示法

一個VRPTW 的解,我們可以把它表示成許多路由的集合。若不考慮路由中 各個客戶的地理位置,我們可以將其想像為一堆客戶的參訪序列。在程式語言中 我們可以用現有的串列 (list) 資料結構來儲存,而其中各個節點儲存了客戶的編 號。如下圖6 所示:

6:程式語言中解的表示法。左圖為圖 1 已經舉過的範例。

3.2 初始族群 (initial population) 的產生

初始族群中的所有個體,使用了下列方式產生:

1 while ( 還有客戶尚未被排程 ){

2 隨機挑選出一位尚未被排程的客戶

3 if ( 把此客戶加進此路由最後面,不會違反任何限制 ){

4 把此客戶加進此路由最後面 5 }else{

6 開一條新的路由,並把此客戶加進去 7 }

8 }

總站

總站

3.3 親代的選擇 (parent selection)

每次使用2-tournament 從族群中選擇出兩個親代進行交配。原先 MOEA-EO 會對族群中的個體進行柏拉圖排序,再使用 2-tournament 以排序後被賦予的等級 做出選擇。但考量不合法解和合法解的凌越關係,很難定義出適當的準則。本方 法便捨棄柏拉圖排序,以下面的方式對任意兩個解進行比較:

1 if ( 兩個解一個合法一個不合法 ){

2 選擇合法的那個解

3 } else if ( 兩個解都是合法的 ){

4 if ( 兩個解使用的車輛數不同 ) 選擇 車輛數較少的解 5 else 選擇總移動距離較短的解

6 } else {

7 選擇 超時 (time-warp) 較少的那個解 8 }

上面的「超時」引用自Nagata 等人 [20] 的定義。為了更精確算出車輛在時 窗限制的違反量,假設車輛在每個客戶的遲到後,可以賦予一段時間回復到該客 戶的最晚抵達時間,然後再繼續服務之後的客戶。如下頁圖7 的範例。

由於偏好合法的解(第 2 行),希望演化過程中合法解的個數,不會過於衰 減。在演化過程中雖然容許不合法解參與,但仍以合法解作為演化的主力。當兩 個解均為合法時,則使用原本的階層式目標比較解的優劣(第 4~5 行),如此便 能偏好使用車輛數較少的解。因為這些解之中會有服務較多客戶的路由,以祈在 後面的交配可以刪除掉更多的客戶,提高產生空路由的機會,以減少車輛數。最 後因時窗限制比起容量限制較難達成,針對不合法的解,本方法會優先解決時窗 限制(第7 行)。

7:超時 (time-warp) 的範例。此圖引用自 [17]。

假設車輛依序服務v1, v2, v3, v4, v5五個客戶。在客戶v2因提早抵達該客戶位置,必須等待。

在客戶v4因超過該客戶的最晚抵達時間,車輛被賦予一段超時,回復到該客戶的最晚抵達時間,

以免影響其後v5的服務。

3.4 交配 (crossover)

3.4.1 交換路由

MOEA-EO 的交配方式為兩親代選擇出最好的路由做交換。最好的路由在該 文獻定義為「移動距離 ÷ 客戶數目」最小的。但少數客戶有時因地理或時窗關 係,真的必須單獨的物流車來服務。而且在許多較好的排程中,路由中的客戶數 目往往偏多。因此本方法試著改寫原定義,交換「客戶數目」最多的路由。如此 不僅比較直觀,交換後可以移除掉的客戶數目也可以最多。

另外考慮到可能使擁有一堆違反條件客戶的路由受惠,此定義便更趨嚴苛,

變成為:「是『合法的路由』且『客戶數目』最多的」。

3.4.2 減少路由

和MOEA-EO 的交配方式一樣,交換後的路由數目會多一個。但前述方法總 是挑選客戶數目較多的路由做交換,可以移除的客戶也最多,甚至有機會產生空 路由以減少車輛數目。

為了減少路由,MOEA-EO 會移除最差的路由並嘗試插入。為提高插入成功 的機率,本方法則改成移除客戶數目最少的路由,如此便和 [8] 減少路由的方式 相似。但這裡的插入僅純粹考慮縮短總移動距離,就算產生出不合法的路由也無 所謂,演化中每一代最後的突變機制會想辦法修好它。

每當要插入一個客戶,會隨機從所有的路由中挑選一個點插入,嘗試「題目 的客戶數目」次後,從中選擇總移動距離最小的,如此便完成一個客戶的插入。

目前僅依照被移除路由中的客戶參訪先後順序一一做插入。

3.5 突變 (mutation)

文獻 [14] 指出突變的影響客戶數量需夠多(至少要 20 個以上),才有機會 減少車輛數。因此本方法使用的突變運算如下:

1 while ( 已嘗試次數 < 題目的客戶數目 ){

2 隨機移除一個客戶後將其隨機插入

3 if ( 被影響的兩個路由中,合法的路由數和原本一樣或增加 ){

4 移動到影響後的結果 5 } else {

6 恢復成原本的解 7 }

8 }

這個突變運算可以視為一種區域搜尋 (local search) ,每次運算會嘗試移動

「題目的客戶數目」次。被影響的兩條路由(「被移除」的和「被插入」的),若 合法的路由數目可以不變或增加,就可以移動至影響後的結果。合法的路由數目 不變就移動,可視為一種擾動;合法的路由數目增加就移動,則可視為一種修復 (repair operator)。

有時移除該客戶後可以產生空路由,則此空路由仍會被視為合法路由。儘管

3.6 環境的選擇 (environmental selection)

首先把原始族群和產生的子代合併為一個大的族群,然後開始進行篩選,使 用 ( μ + λ ) 的策略,這裡的 μ = λ。

在篩選前,會先把族群中的所有個體依照合法性來分類,分成兩個子族群。

兩個子族群再分別使用不同的凌越關係進行柏拉圖排序,如下圖8 所示。合法的 子族群使用原本題目的兩個目標(最少車輛數、最短總移動距離)定義出凌越關 係;不合法的子族群則使用題目的兩個限制違反量(最少的總超重 (overload)、

最少的總超時 (time-warp) )定義出凌越關係。

8:族群的合併、分類和排序。

不合法的子族群使用限制違反量進行柏拉圖排序,如此就不必特別考慮兩個 限制的難易程度,直接讓子族群中個體的限制違反量自行決定。即使如此,因 VRPTW 時窗的限制較難修復,不合法的個體不太會違反容量限制,浪費了原本 使用「多目標」縮小限制違反量的美意。因此在不合法的凌越關係中,本方法會 額外考量車輛數的減少。

原本的族群 產生的子代們

合併後的族群

合法解 不合法解

R1 R2 R3 R1 R2

依合法性分類 合併

… …

依不同的凌越關係 做排序

最後使用交互 (interleaving) 的方式決定可以存活到下一代的個體:從合法的 Rank1 開始,再來是不合法的 Rank1,合法的 Rank2,不合法的 Rank2 ……依此 類推。最後若無法整個 Rank 一起存活的情況,則優先考慮合法的,再考慮不合 法的,從中隨機填進剩下的空缺。

之所以會從合法的 Rank1 開始是希望最後輸出非凌越解 (non-dominated solutions) 時,可以直接使用這裡的結果。而最後的空缺之所以會優先考慮合法的,

是希望不要讓太多的不合法解存活到下一代。

相關文件