遺傳算法的進一步探究—多層編碼_數學建模matlab算法(八)

多層編碼遺傳算法把個體編碼分成多層,每層編碼均表示不同的含義,多層編碼共同完整表達了問題的解。
多層編碼遺傳算法擴展了遺傳算法的使用領域,使得遺傳算法可以方便用於複雜問題的求解。
我們以車間調度問題爲例,瞭解和使用多層編碼的遺傳算法。
車間調度問題是指 根據產品的製造需求,分配加工車間順序。要考慮的因素有:機器集、零件集、工序序列集、可選機器集、使用機器加工零件的時間矩陣、費用矩陣。
具體問題如下:
共有6個工件、在10臺機器上加工,每個工件都要經過6道加工工序,每個工序可選擇機器序號如表1,每道工序的加工時間如表2。
表
在本題中,我們將染色體的前半部分表示所有工件在機器上的加工順序,後半部分表示工件每道工序的加工機器序號。如個體[2 4 3 1 1 2 3 4 2 1 3 3 2 2 1 3],該個體表示4個加工工序都是2次的工件在3臺機器上的加工順序,其中前8位表示工件的加工順序爲:2->4->3->1->1->2->3->4,9到16位表示加工機器,依次爲:2->1->3->3->2->2->1->3
在交叉和變異時,需要在傳統的遺傳算法上有所改變,才能適應這種多層編碼。
求解結果如圖:
結果
結果
參考文獻:
[1]金志勇.基於遺傳算法的車間調度系統研究[D].武漢:武漢理工大學,2006.
[2]蔣麗雯.基於遺傳算法的車間作業調度問題研究[D].上海:上海交通大學,2006.
[3]嚴坤.基於遺傳算法的模糊目標柔性車間調度問題[J].機械科學與技術,2006,25(10):318-322.
[4]孫志峻,朱劍英.具有柔性加工路徑的生產車間智能優化調度[J].機械科學與技術,2001,20(6):255-259.

matlab代碼:

%% 清空環境
clc;clear

%% 下載數據
load scheduleData Jm T JmNumber
%工序 時間

%% 基本參數
NIND=40;        %個體數目
MAXGEN=100;      %最大遺傳代數
GGAP=0.9;       %代溝
XOVR=0.8;       %交叉率
MUTR=0.6;       %變異率
gen=0;          %代計數器
%PNumber 工件個數 MNumber  工序個數
[PNumber MNumber]=size(Jm);  
trace=zeros(2, MAXGEN);      %尋優結果的初始值
WNumber=PNumber*MNumber;     %工序總個數

%% 初始化
Number=zeros(1,PNumber);     % PNumber 工件個數
for i=1:PNumber
    Number(i)=MNumber;         %MNumber工序個數
end

% 代碼2層,第一層工序,第二層機器
Chrom=zeros(NIND,2*WNumber);
for j=1:NIND
    WPNumberTemp=Number;
    for i=1:WNumber
        
        %隨機產成工序
        val=unidrnd(PNumber);
        while WPNumberTemp(val)==0
            val=unidrnd(PNumber);
        end
        
        %第一層代碼表示工序
        Chrom(j,i)= val;
        WPNumberTemp(val)=WPNumberTemp(val)-1;
        
        %2層代碼表示機器
        Temp=Jm{val,MNumber-WPNumberTemp(val)};
        SizeTemp=length(Temp);
        %隨機產成工序機器
        Chrom(j,i+WNumber)= unidrnd(SizeTemp);
        
    end
end
 
%計算目標函數值
[PVal ObjV P S]=cal(Chrom,JmNumber,T,Jm);  

%% 循環尋找
while gen<MAXGEN
    
    %分配適應度值
    FitnV=ranking(ObjV);  
    %選擇操作
    SelCh=select('rws', Chrom, FitnV, GGAP);       
    %交叉操作
    SelCh=across(SelCh,XOVR,Jm,T);          
    %變異操作
    SelCh=aberranceJm(SelCh,MUTR,Jm,T);            
    
    %計算目標適應度值
    [PVal ObjVSel P S]=cal(SelCh,JmNumber,T,Jm);   
    %重新插入新種羣
    [Chrom ObjV] =reins(Chrom, SelCh,1, 1, ObjV, ObjVSel);       
    %代計數器增加
    gen=gen+1;       
    
    %保存最優值
    trace(1, gen)=min(ObjV);       
    trace(2, gen)=mean(ObjV);  
    
    % 記錄最佳值
    if gen==1
        Val1=PVal;
        Val2=P;
        MinVal=min(ObjV);%最小時間
        STemp=S;
    end
    %記錄 最小的工序
    if MinVal> trace(1,gen)
        Val1=PVal;
        Val2=P;
        MinVal=trace(1,gen);
        STemp=S;
    end
    
end

% 當前最佳值
PVal=Val1; %工序時間
P=Val2;  %工序 
S=STemp; %調度基因含機器基因

%% 描繪解的變化
figure(1)
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('解的變化','種羣均值的變化');
xlabel('迭代次數');
ylabel('適應度值(s)');
title('算法搜索過程');

%% 顯示最優解
figure(2);
MP=S(1,PNumber*MNumber+1:PNumber*MNumber*2);
for i=1:WNumber  
    val= P(1,i);
    a=(mod(val,100)); %工序
    b=((val-a)/100); %工件
    Temp=Jm{b,a};
    mText=Temp(MP(1,i));
    
    x1=PVal(1,i);
    x2=PVal(2,i);
    
    y1=mText-1;
    y2=mText;
    plotRec(x1,x2,mText);
    
    plotRec(PVal(1,i),PVal(2,i),mText);
    hold on;
    
    fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/PNumber]);
    text((x1+x2)/2,mText-0.25,num2str(P(i)));
    xlabel('時間(s)');
    ylabel('加工機器');
    title('甘特圖');
End

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