1. 什么是車間調度(JobShop)問題
- Job,在車間調度中被稱為工件。一個工件又由若干道工序組成。
- resource, 資源。在車間調度中一般指的是機器,每道工序需要在某個機器上加工。
- Constraint, 約束。在車間調度中約束主要有以下兩種:
- 同一個工件包含的每道工序有先后順序。
- 每個機器不能並行同時處理兩道工序。
- Objective目標。車間調度問題的一個常見目標是使所有工件完成的總時間最小。
- 一個車間調度問題可以用一個已知條件表格來刻畫,例如下面的已知條件表格:
第一個工件的第一道工序 | 第一個工件的第二道工序 | 第二個工件的第一道工序 | 第二個工件的第二道工序 | |
機器號 | 1 | 2 | 2 | 1 |
加工時間 | 3 | 2 | 5 | 1 |
以上面的問題為例,我們的目標是為每個工件的每道工序指定一個開始時間,工人師傅按照這個時間在相應機器上開始操作該道工序。上面這個車間調度問題可以用一個帶權有向無環圖來表示:
上面已知條件表格對應的加權有向無環圖
這個加權有向無環圖就代表上面的表格,我們可以看到每個工序作為圖中的一個節點出現,權重就是這個節點對應的加工時間。此外,我們增加兩個虛擬節點,一個是開始節點,結束節點。約束條件用箭頭表示,在這里需要注意的是:同一個工件下面的工序有先后順序,所以有的節點之間會增加藍色箭頭。在同一台機器上加工的工序也必須有先有后,所以也要有箭頭, 因此每一對紅綠箭頭必須去掉其中一個,保留其中一個,這就會對應了四種可能的可行解的圖。
可行解1的圖
可行解2的圖
可行解3的圖
可行解4的圖
上面的四種方案都可行,每個可行解都有一個總完成時間,即所有從開始節點到結束節點的路徑中權值之和最大的那條路徑對應的權值之和。我們的目標是從四個可行的解中找到一個最優解,最優解是總完成時間最短的那個解,例如:可行解1需要11個單位總完成時間,可行解2需要11個單位總完成時間,可行解3需要11個單位總完成時間,可行解4需要7個單位總完成時間。顯然,最優解就是可行解4,在可行解4中工件1的工序1的開始時間是0,工件2的工序1的開始時間是0,工件1的工序2的開始時間是5,工件2的工序2的開始時間是5。總完成時間是7。
編碼
我們利用工件號的排列來對可行解進行編碼,例如:1212這個編碼中第一個1代表第1個工件的第1道工序,第二個1代表第1個工件的第2道工序,第1個2代表第2個工件的第1道工序,第2個2代表第2個工件的第2道工序。在這個編碼中潛藏着:工件1的第1道工序要在工件2的第2道工序之前,工件2的第1道工序要在工件1的第2道工序之前。這個編碼對應的是可行解4。需要說明的是一個可行解的有向無環圖可能對應多個編碼方式,例如,1212,2121,1221,2112都對應上面的可行解4的有向無環圖。
解碼
一個最簡單的求最優解的思路就是:把所有可能的編碼都列出來(即兩個1與兩個2能組成的所有排列),然后利用已知條件表格把每個編碼對應的可行解圖都還原出來,利用該可行解圖計算出該可行解對應的總完成時間,從所有可行解中找到總完成時間最短的。上文中已經說明了總完成時間就是可行解圖之中從開始節點到結束節點間所有路徑中權值之和最大的那條路徑的權值和。如何在帶權無環有向圖中找到權值和最大的那條從起點到終點的關鍵路徑(critical path),可以參考簡書中的文章:https://www.jianshu.com/p/cef14f70ec92。