本發(fā)明專(zhuān)利用于制訂多目標(biāo)柔性作業(yè)車(chē)間調(diào)度的生產(chǎn)調(diào)度計(jì)劃。
背景技術(shù):
柔性作業(yè)車(chē)間調(diào)度問(wèn)題是傳統(tǒng)作業(yè)車(chē)間調(diào)度問(wèn)題的一般化,由于該情境下每個(gè)工序能夠在多臺(tái)機(jī)器上加工,因此問(wèn)題的復(fù)雜性大大增加?,F(xiàn)實(shí)生產(chǎn)中,生產(chǎn)調(diào)度又往往要同時(shí)優(yōu)化多個(gè)目標(biāo),這無(wú)疑使問(wèn)題的復(fù)雜性進(jìn)一步加大。經(jīng)典的遺傳局部搜索算法被廣泛應(yīng)用于對(duì)于多目標(biāo)柔性作業(yè)車(chē)間調(diào)度問(wèn)題的求解,取得了不錯(cuò)的效果。然而,這種算法仍不夠簡(jiǎn)潔高效,包括以析取圖表示調(diào)度方案的方式。
技術(shù)實(shí)現(xiàn)要素:
本算法針對(duì)多目標(biāo)柔性作業(yè)車(chē)間調(diào)度的遺傳局部搜索算法,通過(guò)對(duì)編碼的改進(jìn)使算法更加簡(jiǎn)潔高效。本算法對(duì)傳統(tǒng)遺傳局部搜索算法的改進(jìn)主要包括以下方面:第一,多目標(biāo)柔性作業(yè)車(chē)間調(diào)度方案的編碼方式的復(fù)雜性;第二,可行的解(調(diào)度方案)在經(jīng)過(guò)交叉、變異操作后可能產(chǎn)生不可行的解(調(diào)度方案);第三,局部搜索可能作用于局部最優(yōu)解,會(huì)產(chǎn)生無(wú)意義的搜索過(guò)程;第四,搜索過(guò)的解可能被重復(fù)搜索;第五,以加權(quán)法解決多目標(biāo)問(wèn)題時(shí)各目標(biāo)函數(shù)的加權(quán)值不易確定;第六,一個(gè)解的鄰域解數(shù)量非常多,占用計(jì)算時(shí)間過(guò)多;第七,已經(jīng)產(chǎn)生的優(yōu)良解(調(diào)度方案)可能在之后的迭代過(guò)程中被遺失。
本發(fā)明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是:第一,采用一種新的編碼方式;第二,采用一種專(zhuān)門(mén)用于本編碼方式的交叉算子和突變算子;第三,將局部最優(yōu)解記錄于禁忌表中,再次出現(xiàn)時(shí)直接進(jìn)行遺傳搜索;第四,將搜索過(guò)的鄰域解加入禁忌表,再次出現(xiàn)時(shí)直接進(jìn)行遺傳搜索;第五,采用隨機(jī)加權(quán)法為各目標(biāo)函數(shù)賦加權(quán)值;第六,在局部搜索中,只隨機(jī)選取每個(gè)當(dāng)前解的部分鄰域解進(jìn)行檢測(cè);第七,設(shè)置精英組保存搜索過(guò)程中發(fā)現(xiàn)的非支配解。
本發(fā)明的有益效果:第一,簡(jiǎn)化了編碼過(guò)程;第二,避免了可行的解(調(diào)度方案)經(jīng)交叉和突變后出現(xiàn)不可行的解(調(diào)度方案);第三,避免了對(duì)局部最優(yōu)解進(jìn)行無(wú)意義的局部搜索;第四,避免了對(duì)搜索過(guò)的鄰域解進(jìn)行重復(fù)的局部搜索;第五,確定各目標(biāo)函數(shù)加權(quán)值的過(guò)程變得十分簡(jiǎn)便;第六,避免了局部搜索占用過(guò)多的計(jì)算時(shí)間;第七,避免了非支配解的遺失。
附圖說(shuō)明
下面結(jié)合附圖和實(shí)施例對(duì)本發(fā)明型進(jìn)一步說(shuō)明。
圖1是柔性作業(yè)車(chē)間調(diào)度的示例圖。
圖2是編碼結(jié)構(gòu)的示意圖。
圖3是機(jī)器選擇部分編碼方式的示例圖。
圖4是工序序列部分編碼方式的示例圖。
圖5是解碼過(guò)程的示例圖。
圖6是非支配解的示意圖。
圖7是遺傳搜索和局部搜索與本算法的比較圖。
圖8是兩點(diǎn)交叉算子示意圖。
圖9是基于工序編碼交叉算子的示例圖。
圖10是機(jī)器選擇部分編碼的突變算子的示例圖。
圖11是工序序列部分編碼的突變算子的示例圖。
圖12是含禁忌表的遺傳與局部搜索算法的流程的示意圖
圖13是算法詳細(xì)流程的示意圖。
具體實(shí)施方式
一、柔性作業(yè)車(chē)間調(diào)度問(wèn)題
在傳統(tǒng)的作業(yè)車(chē)間調(diào)度問(wèn)題中,每個(gè)工序只能在唯一一臺(tái)機(jī)器上加工。而對(duì)于柔性作業(yè)車(chē)間調(diào)度問(wèn)題而言,每個(gè)工序能夠在多臺(tái)機(jī)器上加工,這從圖1的示例中可以看出(圖1中的“-”表示該機(jī)器無(wú)法加工此工序)。這種改變使問(wèn)題模型更加符合實(shí)際的生產(chǎn)情境,但同時(shí)也加大了問(wèn)題的復(fù)雜性。
二、生產(chǎn)信息的表示
1.n個(gè)工件:J1,J2,…,Jn。
2.m臺(tái)機(jī)器:M1,M2,…,Mm。
3.工件Ji的第j道工序:Oij。
4.工序集W:將J1-Jn上的工序依次排列,
W={w1,w2,…},
(1)
“w”的下標(biāo)為工序集中每個(gè)工序的編號(hào),從1開(kāi)始依次編號(hào)。
5.工件集中工序wi在第j臺(tái)機(jī)器的加工時(shí)間:tij。
6.工序的機(jī)器集Mij:可加工工序Oij的機(jī)器的集合
Mij={m1,m2,…},
(2)
“m”的下標(biāo)為機(jī)器集中每臺(tái)機(jī)器的編號(hào),從1開(kāi)始依次編號(hào)。
7.全部工件的全部加工時(shí)間T:
每一行依次表示工序集(式(1))中的工序,每一列以此表示機(jī)器集(式(2))中的機(jī)器。如果工序i無(wú)法在機(jī)器j上加工,則tij=-1。
三、編碼方式
如圖2所示的編碼結(jié)構(gòu),本編碼方式對(duì)每個(gè)解的編碼分為兩個(gè)部分,分別為機(jī)器選擇部分和工序序列部分。
1.機(jī)器選擇部分的編碼
如圖3所示的編碼示例(生產(chǎn)信息對(duì)應(yīng)圖1),編碼的每一位依次對(duì)應(yīng)工序集(式(1))上的工序,編碼的每一位的值為加工該工序的機(jī)器在機(jī)器集(式(2))中的編號(hào)。
2.工序序列部分的編碼
如圖4所示的編碼示例(生產(chǎn)信息對(duì)應(yīng)圖1),每個(gè)工件的每個(gè)工序都用此工件的編號(hào)表示,以同一編碼值出現(xiàn)的順序依次表示每個(gè)工件的各工序,編碼的順序表示各工序的加工順序。
3.解碼過(guò)程
如圖5所示的解碼示例(生產(chǎn)信息對(duì)應(yīng)圖1),首先將工序序列部分的工序依次在機(jī)器選組部分找到加工機(jī)器,然后將這些工序依次加入對(duì)應(yīng) 機(jī)器,即可得到生產(chǎn)調(diào)度方案。
四、非支配解
對(duì)于最大化n個(gè)目標(biāo)函數(shù)f1(x),f2(x),…,fn(x),當(dāng)兩個(gè)解x、y滿足:
則稱(chēng)解y支配解x。
如果一個(gè)解不被多目標(biāo)優(yōu)化問(wèn)題的任何其他解支配,那么這個(gè)解被稱(chēng)為一個(gè)非支配解。
對(duì)于兩目標(biāo)優(yōu)化問(wèn)題(最大化目標(biāo)函數(shù))的非支配解可以被圖6形象地描述出來(lái)。
五、精英組
通過(guò)將每一代中的非支配解加入精英組,并在每一代更新精英組(即刪掉加入新的解后精英組中不再是非支配解的解)。
六、隨機(jī)加權(quán)法
對(duì)于多目標(biāo)問(wèn)題,我們采用隨機(jī)加權(quán)法為每個(gè)目標(biāo)函數(shù)賦予加權(quán)值,從而將多目標(biāo)問(wèn)題轉(zhuǎn)化為單目標(biāo)問(wèn)題。對(duì)于每個(gè)解,隨機(jī)加權(quán)法的加權(quán)值確定方式如下:
randomi為隨機(jī)產(chǎn)生的數(shù),wi滿足:
則每個(gè)解適應(yīng)度函數(shù)為:
七、禁忌表
禁忌表在禁忌搜索算法中被用于記錄局部搜索中已搜索過(guò)的解,以避免重復(fù)搜索,同時(shí)禁忌表會(huì)在局部搜索的每一次迭代后更新。本算法引入禁忌表,用它記錄局部搜索過(guò)程中搜索到的局部最優(yōu)解和搜索過(guò)的鄰域解。當(dāng)禁忌表中記錄的解再次出現(xiàn)在種群中時(shí),直接進(jìn)行遺傳搜索而不再進(jìn)行局部搜索。
八、遺傳組
本算法中設(shè)置遺傳組,用于暫時(shí)儲(chǔ)存將要進(jìn)行遺傳搜索的解。
九、遺傳算法和局部搜索與本算法的比較
如圖7,以最大化目標(biāo)函數(shù)為例。
1.局部搜索
如圖7-(a),局部搜索僅僅能夠搜索每個(gè)解周?chē)慕?,?duì)于處于“山頂”的點(diǎn)則無(wú)法繼續(xù)搜索更優(yōu)的點(diǎn),即陷入局部最優(yōu)。
2.遺傳算法
如圖7-(b),遺傳算法雖然能夠在全局進(jìn)行搜索,但是也可能無(wú)法快速抵達(dá)“山頂”。
3.本算法
如圖7-(c),本算法將局部搜索得到的局部最優(yōu)解加入禁忌表,再次出現(xiàn)時(shí)直接進(jìn)行遺傳搜索(本算法中禁忌表還被用于記錄局部搜索過(guò)程中搜索過(guò)的鄰域解,以避免重復(fù)搜索)。
十、只檢測(cè)部分鄰域解的局部搜索算法
預(yù)先指定鄰域解檢測(cè)個(gè)數(shù)k。
那么,對(duì)于當(dāng)前解的局部搜索過(guò)程如下:
1.隨機(jī)選擇當(dāng)前解的一個(gè)鄰域解。
2.如果此鄰域解比當(dāng)前解更優(yōu),則鄰域解作為新的當(dāng)前解替換原來(lái)的當(dāng)前解,并返回本步驟1;否則執(zhí)行下一步。
3.如果已經(jīng)檢測(cè)了當(dāng)前解的k個(gè)鄰域解,即當(dāng)前解被檢測(cè)的k個(gè)鄰域解中沒(méi)有更優(yōu)的解,則程序結(jié)束;否則返回本步驟1。
此外,由于本算法對(duì)每個(gè)解的各目標(biāo)函數(shù)隨機(jī)加權(quán),因此每個(gè)當(dāng)前解都有自己獨(dú)特的局部搜索方向,從而使局部搜索方向多樣化。
十一、錦標(biāo)賽選擇法
預(yù)先指定錦標(biāo)賽選擇法每次選擇的個(gè)體數(shù)量n(n≤Npop)。
錦標(biāo)賽選擇法的步驟如下:
1.從種群中隨機(jī)選擇n個(gè)個(gè)體。
2.從選擇出的n個(gè)個(gè)體中選擇最優(yōu)的一個(gè)個(gè)體。
3.重復(fù)步驟1、步驟2,直至選擇到相應(yīng)個(gè)數(shù)的個(gè)體。
十二、兩點(diǎn)交叉算子
在本算法中,兩點(diǎn)交叉算子被用于編碼機(jī)器選擇部分的交叉。
如圖8所示,兩點(diǎn)交叉算子的步驟為:
1.隨機(jī)選擇編碼中兩個(gè)不同的位置。
2.交換兩個(gè)位置點(diǎn)之間的部分。
十三、基于工序編碼交叉算子
在本算法中,基于工序編碼交叉算子被用于編碼的工序序列部分的交叉。
如圖9的示例所示,基于工序編碼交叉算子的步驟為:
1.隨機(jī)地從工件中產(chǎn)生兩個(gè)子工件集Js1和Js2。
2.把父代1中屬于Js1的元素復(fù)制入子代1中的相同位置,把父代2中屬于Js2的元素復(fù)制入子代2中的相同位置。
3.把父代2中除Js2所含元素以外的其他元素按順序填入子代1的空位置,把父代1中除Js1所含元素以外的其他元素按順序填入子代2的空位置。
十四、機(jī)器選擇部分的突變算子
如圖10的示例所示,機(jī)器選擇部分的突變算子為:
1.在機(jī)器選擇部分隨機(jī)選擇一個(gè)位置。
2.從該位置對(duì)應(yīng)工序的機(jī)器集中隨機(jī)選擇一臺(tái)機(jī)器(的編號(hào))替換當(dāng)前機(jī)器(的編號(hào))。
十五、工序序列部分的突變算子
如圖11的示例所示,工序序列部分的突變算子為:
1.在工序序列部分隨機(jī)選擇兩個(gè)位置。
2.交換這兩個(gè)位置對(duì)應(yīng)的值(工序)。
十六、含禁忌表的遺傳與局部搜索算法
如圖12,含禁忌表的遺傳與局部搜索算法的執(zhí)行步驟為:
1.將局部搜索過(guò)程中搜索到的局部最優(yōu)解和搜索過(guò)的鄰域解加入禁忌表。
2.在對(duì)每一代進(jìn)行搜索的過(guò)程中,對(duì)于禁忌表中出現(xiàn)的解直接加入遺傳組,不再進(jìn)行局部搜索。
3.對(duì)沒(méi)有在禁忌表中出現(xiàn)的解進(jìn)行局部搜索,將搜索到的局部最優(yōu)解加入遺傳組,同時(shí)將此局部最優(yōu)解和搜索過(guò)的鄰域解加入禁忌表(更新禁忌表)。
4.對(duì)遺傳組中的解進(jìn)行遺傳搜索。
5.如果滿足終止條件,即已經(jīng)檢測(cè)了指定個(gè)數(shù)的解,則算法結(jié)束;否則返回步驟1。
十七、算法詳細(xì)流程如下
如圖13。
設(shè)種群規(guī)模為Npop;交叉概率為Pc;突變概率為Pm;局部搜索中對(duì)每個(gè)當(dāng)前解檢測(cè)k個(gè)鄰域解;對(duì)遺傳組的選擇采用錦標(biāo)賽選擇法,錦標(biāo)賽選擇法每一輪選擇的解的數(shù)目為n,n<Npop;算法迭代的終止條件為已經(jīng)檢測(cè)了num個(gè)解。
步驟一—初始化種群
1.根據(jù)生產(chǎn)信息分別產(chǎn)生全部工件的工序集W(式(1))和全部工序的機(jī)器集Mij(式(2))。
2.按照工序集中工序的順序,依次從相應(yīng)工序的機(jī)器集中隨機(jī)選擇一臺(tái)機(jī)器,以機(jī)器集中的編號(hào)組成機(jī)器選擇部分的編碼。
3.根據(jù)每個(gè)工件的工序數(shù)產(chǎn)生相應(yīng)個(gè)數(shù)的數(shù)值為工件編號(hào)的數(shù),并將這些數(shù)隨機(jī)排列組成工序序列部分的編碼。
4.機(jī)器選擇部分的編碼在前,工序序列部分的編碼在后,將它們組合。
5.返回本步驟2,直至已經(jīng)產(chǎn)生Npop個(gè)解。
步驟二—計(jì)算目標(biāo)函數(shù)值
1.計(jì)算每個(gè)解的目標(biāo)函數(shù)值。
步驟三—更新精英組
1.將當(dāng)前種群中的非支配解復(fù)制入精英組。
2.檢測(cè)精英組中的解,將被其他解所支配的解從精英組中刪除。
步驟四—計(jì)算適應(yīng)度函數(shù)值(對(duì)每個(gè)解)
1.通過(guò)式(6)確定各目標(biāo)函數(shù)的加權(quán)值。
2.通過(guò)式(9)計(jì)算每個(gè)解的適應(yīng)度函數(shù)值。
步驟五—更新禁忌表
1.將當(dāng)前種群中在禁忌表出現(xiàn)的解加入遺傳組。
步驟六—局部搜索(對(duì)每個(gè)解)
1.隨機(jī)選擇當(dāng)前解的一個(gè)鄰域解,鄰域解通過(guò)遺傳搜索中的突變算子產(chǎn)生。
2.將此鄰域解復(fù)制入禁忌表。
3.如果鄰域解優(yōu)于當(dāng)前解,則以鄰域解作為當(dāng)前解替換原當(dāng)前解,返回本步驟1;否則,執(zhí)行下一步。
4.如果已經(jīng)檢測(cè)了當(dāng)前解的k個(gè)鄰域解,則執(zhí)行下一步;否則,返回本步驟1.
5.將檢測(cè)到的局部最優(yōu)解加入遺傳組。
步驟七—(對(duì)遺傳組)選擇
1.從遺傳組中隨機(jī)選擇n個(gè)個(gè)體。
2.根據(jù)適應(yīng)度函數(shù)值,從被選擇的n個(gè)個(gè)體中選擇最優(yōu)的一個(gè)個(gè)體。
3.返回本步驟1,直至選擇到目標(biāo)個(gè)數(shù)的個(gè)體。
步驟八—(對(duì)遺傳組)交叉
1.根據(jù)交叉概率Pc計(jì)算進(jìn)行交叉的解的數(shù)目,并隨機(jī)選出相應(yīng)數(shù)目的解。
2.隨機(jī)將被選擇的解兩兩一組作為一對(duì)父代解。
3.對(duì)每個(gè)解的機(jī)器選擇部分使用如圖8所示的兩點(diǎn)交叉算子進(jìn)行交叉,對(duì)每個(gè)解的工序序列部分采用如圖9所示的基于工序編碼交叉算子進(jìn)行交叉。
步驟九—(對(duì)遺傳組)突變
1.根據(jù)突變概率Pm計(jì)算進(jìn)行交叉的解的數(shù)目,并隨機(jī)選出相應(yīng)數(shù)目的解。
2.對(duì)每個(gè)解的機(jī)器選擇部分和工序序列部分分別采用如圖10所示的突變算子和如圖11所示的突變算子進(jìn)行突變。
步驟十—迭代
1.如果算法已經(jīng)檢測(cè)了num個(gè)解,則執(zhí)行下一步驟(更新精英組);否則,返回步驟二(計(jì)算目標(biāo)函數(shù)值)。
步驟十一—更新精英組
1.將當(dāng)前種群中的非支配解復(fù)制入精英組。
檢測(cè)精英組中的解,將被其他解所支配的解從精英組中刪除。