遺傳算法解決作業調用問題(classic job shop scheduling problem)

車間作業調度問題描述

JSP問題是一個包含n個工件和m臺機器的調度問題,其常用的數學描述如下:
Cmax ≥ tij + pij for all (i,j) ∈ N
tkj ≥ tij + pij for all (i,j)  (k,j) ∈ A
tij ≥ tik + pik for all (i,j) and (i,k) ∈ N
tik ≥ tij + pij for all (i,j) and (i,k) ∈ N
tij ≥ 0 for all (i,j) ∈ N
其中,Cmax表示完成所有工件加工後的最大完工時間,pij來表示工件j在機器i上的加工時間,tij表示工件j在機器i上的開始加工時間,N表示操作(i,j)的集合,A表示所有所有的工件j在機器k上加工前必須在機器i上加工操作依賴關係對(i,j)→(k,j)的集合。

遺傳算法簡介

遺傳算法是模擬、解決或優化問題的計算方法,它是受自然界中通過選擇、交叉和變異來實現生物進化的啓發而提出的。當遺傳算法被應用到調度問題中,一個有效的調度序列被稱作染色體或個體,每個個體都有自己的適應度值。遺傳算法以迭代的方式運行,每次迭代代表了種羣的一代。每一代種羣個體包括上一代的倖存者和新的經過交叉、變異和選擇後而新產生的比較優秀的個體。不同的染色體是否被選擇是由它們的適應度值來決定的,適應度越值大,被選中的概率越大。在實驗中這種選擇機制一直被重複,直至滿足給定的條件爲止。

遺傳算法解決車間調度問題

本文中將分以下幾個步驟來介紹遺傳算法。

問題建模

本文將用兩個二維數組machineNoMatrix[][]和timeMatrix[][]來分別表示第i個工件的第j道工序所使用機器的機器號和所耗費的時間,數組的行號和列號分別代表了工件的工件號和工序號,當第i個工件的第j道工序不存在的話,令mach-ineNoMatrix[i-1][j-1]=-1,timeMatrix[i-1][j-1]=0。

編碼

染色體序列的長度爲nm ,n表示工件的數量,m表示機器的數量,染色體序列的每一個元素是[1,n]之間的一個隨機數,該數字在序列中第幾次出現表示它所代表工件的第幾道工序,本文采用的是基於間接工序的編碼方法。例如,對於一個3個工件×4臺機器的作業調度問題,其染色體的大小爲12(34)。工件1可以用數字1來表示,它重複出現3次表示工件1有3道加工工序。

解碼

我們從左到右解碼一個染色體序列,下面以一個3個工件×4臺機器的車間調度問題爲例來說明解碼規則:
編碼規則
圖1 一個3×4車間調度問題的染色體實例
如圖1所示,染色體序列的第一個元素爲1,表示工件1,而工件1第一次出現表示是工件1的第一道工序。然後再以第六個元素1例,它表示工件1的第三道工序。我們可以從如圖1所示的染色體編碼序列中獲得當前執行到哪個工件的哪一道工序。

初始化種羣

首先隨機產生一個300條染色體大小的種羣,每條染色體代表一個個體,即一個可行的作業調度序列。

適應度值計算

本文的適應度值的取值爲各個工件完成所有加工操作的最大完工時間(Cmax)。根據帕累托最優原則,每個染色體的適應度值代表該染色體的優勢排名。
求解車間調度的最短的總調度時間的難點在於:一方面,各個工件不同的工序之間有嚴格的先後順序;另一方面,同一臺機器在某個時刻只可以加工一種工件。各個工件不同的工序之間有嚴格的先後順序這個問題已經在染色體編碼序列中已經被解決,因爲染色體序列中各個工件出現的順序就代表着各個工件的工序序列。而同一臺機器某個時刻只可以加工一種工件這個問題可以通過維護一個機器數目大小的一維數組來實現,數組存儲的值是該機器處理完當前工件後的空閒時間點。
車間調度執行的順序是按染色體編碼序列的順序從左向右執行,由調度問題的執行位置和染色體編碼序列可知要加工工件的工件號i,然後通過工件號在染色體序列的當前位置獲得該工件所在的工序號j,由工件號和工序號從二維數組machineNoMatrix[][]和timeMatrix[][]獲得第i個工件的第j道工序所使用的機器號和所耗費的時間,然後更新第i個工件第j道工序的開始時間爲第i個工件第(j-1)道工序的結束時間或該工序將要使用機器的最近空閒時間點的之中的較大者,更新第i個工件第j道工序的結束時間爲該工序的開始時間與加工時間之和,更新該工序所使用機器的最近空閒時間點爲第i個工件第j道工序的加工完成時間。如果該工序的完工時間大於當前的最大完工時間,更新最大完工時間的值,直至染色體序列中的所有工序至所有工序被加工完畢,最終可以獲得完成車間調度所需的最大完工時間,即適應度的值。

選擇

在每一個連續的父代子代中,父代的一部分被選擇來產生新的一代,然後基於適應度值來選擇新產生的個體,適應度越大的個體越有可能被選中,本文將輪盤賭策略和精英策略相結合的方式來選擇交叉和變異步驟所需的候選染色體。

交叉和變異

本文測試了三種交叉算子(順序交叉:OX,循環順序交叉:COX,混合順序交叉:MOX)和兩種變異算子(逆轉變異:OBM和互換的基因突變:SBM),在完成這六種可能的交叉、變異對的測試後,本文保留了順序交叉(概率P=0.95)和逆轉變異(P=0.02)操作符。下面就分別簡要介紹下本文所用到的交叉和變異算子:

逆轉變異算子

染色體中的兩個值交換它們的位置,如圖2所示。
逆轉變異算子
圖2 逆轉變異算子示例

順序交叉算子

對於一個n個工件×m臺機器的車間調度問題,首先產生範圍在[1,nm]的兩個隨機數且第一個隨機數小於第二個隨機數,nm是染色體編碼序列的長度,產生的兩個隨機樹代表父代染色體的要遺傳給子代染色體的染色體序列的起始和結束位置,在本例中的兩個隨機數分別爲3和5。父代染色體的部分編碼序列被子代繼承:Father 1的編碼序列(3 1 1)被Child 1繼承,Father 2的編碼序列(3 2 1)被Child 2繼承。
Child 1:[,,,3,1,1,,,],即:繼承的工序分別爲工件3的第二個工序和工件1的第一個和第二個工序。
Child 2:[,,,3,1,1,,,],即:即:繼承的工序分別爲工件3第一個工序,工件2第二個工序和工件1第三個工序。
爲了獲得Child 1染色體的其它工序項:
a) 首先我們以Father 2爲模板從第二個隨機數5所在的位置後面開始循環構造一個新的染色體序列:(2 3 3///2 1 1 3 2 1)。
b) 我們將已經從Father 1中繼承的工件序列從新產生的染色體序列中移除(即:工件3的第二個工序和工件1的第一個和第二個工序):由(2 3 X 2 X X 3 2 1)獲得(2 3 2 3 2 1)。
c) 填充Child 1剩餘部分 :首先從第二個隨機數所代表的位置後面開始填充得到[_, _ , _ , 3, 1, 1, 2, 3 , 2],然後循環填充得到最終序列[3, 2, 1, 3, 1, 1, 2, 3, 2]。
同理可求得Child 2的其它工序項。順序交叉算子的具體用法如圖3所示。
順序交叉算子

圖3 順序交叉算子示例

停止條件

遺傳算法運行到最短的總調度時間達到給定下限或者迭代次數達到1000次。
考慮到圖片中文字的可讀性,本文以小規模的作業調度問題mt06爲例將一個最佳調度以甘特圖的形式展示出來。mt06的具體調度信息如圖4所示,本文的甘特圖是用Matlab 2010b繪製的。
調度結果

圖4 mt06的一個最佳調度(最短的總調度時間爲55)
注:圖中p(i,j)表示工件j在機器i上的加工時間,i表示機器i,j表示工件j

甘特圖畫法: 如何使用matlab製作作業調度結果對應的甘特圖

參考文獻

https://www.eii.uva.es/elena/JSSP.htm

擅長遺傳算法、作業調度和路線規劃,掃碼進行技術諮詢


技術諮詢

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章