溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

發(fā)布時(shí)間:2021-10-11 17:09:42 來源:億速云 閱讀:248 作者:柒染 欄目:大數(shù)據(jù)

本篇文章給大家分享的是有關(guān)怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

問題描述

作業(yè)車間調(diào)度(Job shop scheduling problem, JSP) 是車間調(diào)度中最常見的調(diào)度類型,是最難的組合優(yōu)化問題之一,應(yīng)用領(lǐng)域極其廣泛,涉及航母調(diào)度,機(jī)場(chǎng)飛機(jī)調(diào)度,港口碼頭貨船調(diào)度,汽車加工流水線等,因此對(duì)其研究具有重大的現(xiàn)實(shí)意義??茖W(xué)有效的生產(chǎn)調(diào)度不但可以提高生產(chǎn)加工過程中工人、設(shè)備資源的高效利用,還可縮短生產(chǎn)周期,降低生產(chǎn)成本。


作業(yè)車間調(diào)度問題描述:


一個(gè)加工系統(tǒng)有M臺(tái)機(jī)器,要求加工N個(gè)作業(yè),其中,作業(yè)i包含工序數(shù)為L(zhǎng)_i。令,則L為任務(wù)集的總工序數(shù)。其中,各工序的加工時(shí)間已確定,并且每個(gè)作業(yè)必須按照工序的先后順序加工。調(diào)度的任務(wù)是安排所有作業(yè)的加工調(diào)度排序,約束條件被滿足的同時(shí),使性能指標(biāo)得到優(yōu)化。作業(yè)車間調(diào)度需要考慮如下約束:

1.每道工序在指定的機(jī)器上加工,且必須在前一道工序加工完成后才能開始加工。

2.某一時(shí)刻1臺(tái)機(jī)器只能加工1個(gè)作業(yè)。

3.每個(gè)作業(yè)只能在1臺(tái)機(jī)器上加工1次。

4.各作業(yè)的工序順序和加工時(shí)間已知,不隨加工排序的改變而改變。


問題的數(shù)學(xué)模型:


令(i,j)表示作業(yè)i的第j個(gè)工序。S_ij和T_ij分別表示(i,j)的加工起始時(shí)刻和加工時(shí)間。Z_ijk表示(i,j)是否在第k臺(tái)機(jī)器上加工:如果(i,j)在第k臺(tái)機(jī)器上加工,Z_ijk=1;否則,Z_ijk=0,C_k為第k臺(tái)機(jī)器的完工時(shí)間,則問題的數(shù)學(xué)模型如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

     公式(1)為目標(biāo)函數(shù),即優(yōu)化目標(biāo),系統(tǒng)中使用總加工時(shí)間最短為優(yōu)化目標(biāo)。公式(2)表示1個(gè)作業(yè)只能在加工完成前一道工序后才可以加工后一道工序。公式(3)表示1個(gè)作業(yè)的第1道工序的起始加工時(shí)刻大于或等于0。公式(4)表示在1臺(tái)機(jī)床上不會(huì)同時(shí)加工1個(gè)以上的作業(yè)。


遺傳算法


     

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


     

隨著遺傳算法(genetic algorithm (GA))在組合優(yōu)化問題的廣泛應(yīng)用,許多人開始對(duì)遺傳算法進(jìn)行深度研究。已有研究結(jié)果表明,遺傳算法對(duì)求解作業(yè)車間調(diào)度問題具有較好的效果,因此系統(tǒng)采用遺傳算法來解該問題,遺傳算法是計(jì)算數(shù)學(xué)中用于解決最優(yōu)化的搜索算法,是進(jìn)化算法的一種。進(jìn)化算法最初是借鑒了進(jìn)化生物學(xué)中的一些現(xiàn)象而發(fā)展起來的,這些現(xiàn)象包括遺傳、突變、自然選擇以及雜交等。系統(tǒng)通過模擬生物進(jìn)化,包括遺傳、突變、選擇等,來不斷地產(chǎn)生新個(gè)體,并在算法終止時(shí)求得最優(yōu)個(gè)體,即最優(yōu)解。


遺傳算法解決作業(yè)車間調(diào)度問題基本步驟:

1.初始化一定數(shù)量的種群(染色體編碼)

2.計(jì)算個(gè)體適應(yīng)度(染色體解碼)

3.采用錦標(biāo)賽法選擇染色體并交叉產(chǎn)生新個(gè)體

4.個(gè)體(染色體)變異

5.達(dá)到遺傳代數(shù)終止算法并從中選取適應(yīng)度最優(yōu)的個(gè)體作為作業(yè)車間調(diào)度問題的解


流程圖如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

遺傳算法所需參數(shù):


1.種群規(guī)模:種群中個(gè)體的數(shù)量,用populationNumber表示

2.染色體長(zhǎng)度:個(gè)體的染色體的長(zhǎng)度,用chromosomeSize表示

3.交叉概率:控制交叉算子的使用頻率,用crossProbability表示,并且值為0.95

4.變異概率:控制變異算子的使用頻率,用mutationProbability表示,并且值為0.05

5.遺傳代數(shù):種群的遺傳代數(shù),用于控制遺傳算法的終止,用times來表示


遺傳算法實(shí)現(xiàn)基本步驟及偽代碼:


1. 編碼及初始化種群

       采用工序?qū)崝?shù)編碼來表示染色體,即M臺(tái)機(jī)器,N個(gè)工件,每個(gè)工件的工序數(shù)為process_i,則染色體長(zhǎng)度為chromosome=process_1+process_2+...,對(duì)染色體編碼如下:

chromosome=...,w_i,w_j,w_k,...

其中w_i代表第i個(gè)工件編號(hào),而出現(xiàn)的次數(shù)代表該工件的第幾道工序。例如{0, 1, 2, 1, 2, 0, 0, 1, 2},中0,1,2表示工件的編號(hào),第幾次出現(xiàn)就代表第幾道工序。然后將每一次隨機(jī)生成的染色體個(gè)體加入到種群集合中。

算法偽代碼:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


2. 解碼及計(jì)算適應(yīng)度

       將優(yōu)化目標(biāo)定義為總加工時(shí)間最短,因此適應(yīng)度定義為最短加工時(shí)間的倒數(shù),設(shè)fitness為對(duì)應(yīng)個(gè)體的適應(yīng)度,fulfillTime為最短加工時(shí)間,因此                                                       

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

其中fulfillTime的計(jì)算方法如下:

首先定義如下變量

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

然后從左到右遍歷個(gè)體的染色體序列,其中表示第i個(gè)工件的編號(hào),則對(duì)應(yīng)的當(dāng)前工序?yàn)?設(shè)為p。當(dāng)前工件當(dāng)前工序所使用的機(jī)器編號(hào)為,設(shè)為m。當(dāng)前工件當(dāng)前工序?qū)?yīng)的加工時(shí)間為,設(shè)為t。則工件的第p道工序的最晚開始時(shí)間為          

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

而第m臺(tái)機(jī)器的加工時(shí)間為                                   

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

工件的第p道工序的結(jié)束時(shí)間為

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

最后加工完所有工件的最短加工時(shí)間fulfillTime為

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

從而計(jì)算出適應(yīng)度fitness。

PS.小編覺得解碼的過程類似動(dòng)態(tài)規(guī)劃


偽代碼如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


3. 個(gè)體選擇算子

個(gè)體的選擇使用錦標(biāo)賽法,其基本策略為從整個(gè)種群中隨機(jī)抽取n個(gè)個(gè)體讓它們競(jìng)爭(zhēng),選取其中最優(yōu)的個(gè)體。該算子的選擇過程如下

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

偽代碼如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


4. 染色體交叉算子

使用Order Crossover(OX)交叉算子,該算子的交叉步驟如下:

對(duì)于一對(duì)染色體g1, g2,首先隨機(jī)產(chǎn)生一個(gè)起始位置start和終止位置end,并由從g1的染色體序列從start到end的序列中產(chǎn)生一個(gè)子代原型

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

 將g2中不包含在child prototype的其余編碼加入到child prototype兩側(cè)

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

上述步驟將產(chǎn)生一個(gè)child,交換g1, g2即可產(chǎn)生另一個(gè)child


偽代碼如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


5. 染色體變異算子

變異的作用主要是使算法能跳出局部最優(yōu)解,因此不同的變異方式對(duì)算法能否求得全局最優(yōu)解有很大的影響。使用位置變異法作為變異算子,即從染色體中隨機(jī)產(chǎn)生兩個(gè)位置并交換這兩個(gè)位置的值

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)

偽代碼如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


6. 算法整體偽代碼如下:

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


代碼實(shí)現(xiàn)


   

怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)


     

原作者編寫了Java,Python,C++三個(gè)版本的代碼,小編仔細(xì)閱讀了Java代碼,在其中加入一些注釋并略作修改,分享給大家。

說明一下輸入部分,輸入的算例是寫死在代碼中的,算例如下:

  1. Jop0=[(0,3),(1,2),(2,2)]

  2. Jop1=[(0,2),(2,1),(1,4)]

  3. Jop2=[(1,4),(2,3)]

在這個(gè)例子中,作業(yè)jop0有3道工序:   它的第1道工序上標(biāo)注有(0,3),其表示第1道工序必須在第0臺(tái)機(jī)器上進(jìn)行加工,且需要3個(gè)單位的加工時(shí)間;   它的第2道工序上標(biāo)注有(1,2),其表示第2道工序必須在第1臺(tái)機(jī)器上進(jìn)行加工,且需要2個(gè)單位的加工時(shí)間;   余下的同理。   總的來說,這個(gè)實(shí)例中共有8道工序。  
怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn)  

圖中是其中一種可行解。

以上就是怎樣進(jìn)行作業(yè)車間調(diào)度JSP與遺傳算法GA及其Python/Java/C++實(shí)現(xiàn),小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI