車間作業調度問題遺傳算法Matlab源碼程序
車間作業調度問題遺傳算法Matlab源碼程序:function [Zp,Y1p,Y2p,Y3p,Xp,LC1,LC2]=JSPGA(M,N,Pm,T,P)
%--------------------------------------------------------------------------
%? JSPGA.m
%? 車間作業調度問題遺傳算法
%--------------------------------------------------------------------------
%? 輸入參數列表
%? M?????? 遺傳進化迭代次數
%? N?????? 種群規模(取偶數)
%? Pm????? 變異概率
%? T?????? m×n的矩陣,存儲m個工件n個工序的加工時間
%? P?????? 1×n的向量,n個工序中,每一個工序所具有的機床數目
%? 輸出參數列表
%? Zp????? 最優的Makespan值
%? Y1p???? 最優方案中,各工件各工序的開始時刻,可根據它繪出甘特圖
%? Y2p???? 最優方案中,各工件各工序的結束時刻,可根據它繪出甘特圖
%? Y3p???? 最優方案中,各工件各工序使用的機器編號
%? Xp????? 最優決策變量的值,決策變量是一個實數編碼的m×n矩陣
%? LC1???? 收斂曲線1,各代最優個體適應值的記錄
%? LC2???? 收斂曲線2,各代群體平均適應值的記錄
%? 最后,程序還將繪出三副圖片:兩條收斂曲線圖和甘特圖(各工件的調度時序圖)
%第一步:變量初始化
[m,n]=size(T);%m是總工件數,n是總工序數
Xp=zeros(m,n);%最優決策變量
LC1=zeros(1,M);%收斂曲線1
LC2=zeros(1,N);%收斂曲線2
%第二步:隨機產生初始種群
farm=cell(1,N);%采用細胞結構存儲種群
for k=1:N
??? X=zeros(m,n);
??? for j=1:n
??????? for i=1:m
??????????? X(i,j)=1+(P(j)-eps)*rand;
??????? end
??? end
??? farm{k}=X;
end
counter=0;%設置迭代計數器
while counter
??
??? %第三步:交叉
??? newfarm=cell(1,N);%交叉產生的新種群存在其中
??? Ser=randperm(N);
??? for i=1:2:(N-1)
??????? A=farm{Ser(i)};%父代個體
??????? B=farm{Ser(i+1)};
??????? Manner=unidrnd(2);%隨機選擇交叉方式
??????? if Manner==1
??????????? cp=unidrnd(m-1);%隨機選擇交叉點
??????????? %雙親雙子單點交叉
??????????? a=[A(1:cp,:);B((cp+1):m,:)];%子代個體
??????????? b=[B(1:cp,:);A((cp+1):m,:)];
??????? else
??????????? cp=unidrnd(n-1);%隨機選擇交叉點
??????????? a=[A(:,1:cp),B(:,(cp+1):n)];%雙親雙子單點交叉
??????????? b=[B(:,1:cp),A(:,(cp+1):n)];
??????? end
??????? newfarm{i}=a;%交叉后的子代存入newfarm
??????? newfarm{i+1}=b;
??? end
??? %新舊種群合并
??? FARM=[farm,newfarm];
非常好我支持^.^
(3) 100%
不好我反對
(0) 0%