?? 遺傳算法優化裝配生產線任務,matlab源碼.txt
字號:
裝配生產線任務平衡優化遺傳算法通用MATLAB源碼
下面的源碼實現了裝配生產線任務平衡優化問題(ALB問題)的遺傳算法
function [BestX,BestY,BestZ,AllFarm,LC1,LC2,LC3,LC4,LC5]=GSAALB(M,N,Pm,Pd,K,t0,alpha,TaskP,TaskT,TaskV,RT,RV)
%% 裝配生產線任務平衡優化的遺傳算法
%% 輸入參數列表
% M------------遺傳算法進化代數
% N------------種群規模,取偶數
% Pm-----------變異概率調節參數
% Pd-----------變異程度調節參數,0<Pd<1,越大,變異的基因位越多
% K------------同一溫度下狀態跳轉次數
% T0-----------初始溫度
% Alpha--------降溫系數
% Beta---------濃度均衡系數
% TaskP--------任務優先矩陣,n×n矩陣,Pij=1表示任務i需在j之前完成,Pij=0時任務i和j沒有優先關系
% TaskT--------任務時間屬性,n×1向量
% TaskV--------任務體積屬性,n×1向量
% RT-----------時間節拍約束
% RV-----------工位體積約束
%% 輸出參數列表
% BestX--------最好個體的編碼
% BestY--------最好個體對應的裝配方案
% BestZ--------最好個體的目標函數值
% LC1----------最優個體適應值的收斂曲線,M×1
% LC2----------種群平均適應值的收斂曲線,M×1
% LC3----------工位個數收斂曲線,M×1
% LC4----------時間利用率及平衡度綜合度量參數收斂曲線,M×1
% LC5----------空間利用率及平衡度綜合度量參數收斂曲線,M×1
% AllFarm------各代種群的集合,M×1的細胞結構
%% -----------------------初始化----------------------------------
n=size(TaskP,1);
[AA,BB]=QJHJ(TaskP);%調用子函數,建立每一個任務的前任務集和后任務集
farm=Initialization(N,TaskP,AA,BB);%調用子函數,種群初始化
%輸出參數初始化
BestX=zeros(1,n);
BestY=zeros(1,n);
BestZ=0;
LC1=zeros(M,1);
LC2=zeros(M,1);
LC3=zeros(M,1);
LC4=zeros(M,1);
LC5=zeros(M,1);
AllFarm=cell(M,1);
%控制參數初始化
m=1;%迭代計數器
t=t0;%溫度指示器
BestPos=1;%初始時任意指定被保護個體
%% -----------------------迭代過程---------------------------------
while m<=M%設置停止條件
%% ----------------------變異退火算子------------------------------
for i=1:N
if rand>Pm&&i~=BestPos
%如果隨機數大于變異概率門限值,并且不屬于保護個體,就對其實施變異
I=farm(i,:);%取出該個體
k=1;
while k<=K%每一個溫度下的狀態轉移次數
%調用變異子函數
J=Mutation(I,Pd,AA,BB);
%調用計算適應值子函數
[YI,ZI,FI,TGWI,VGWI,f1I,f2I]=Fitness(I,TaskT,TaskV,RT,RV);
[YJ,ZJ,FJ,TGWJ,VGWJ,f1J,f2J]=Fitness(J,TaskT,TaskV,RT,RV);
if FJ>FI
farm(i,:)=J;
elseif rand<exp((FJ-FI)/(FI*t))
farm(i,:)=J;
else
farm(i,:)=I;
end
k=k+1;
end
end
end
%% -----------------------交叉算子---------------------------------
newfarm=zeros(size(farm));
Ser=randperm(N);%用這個函數保證隨機配對
for i=1:2:(N-1)
FA=farm(Ser(i),:);
FB=farm(Ser(i+1),:);
[SA,SB]=CrossOver(FA,FB);
newfarm(i,:)=SA;
newfarm(i+1,:)=SB;
end
%新舊種群合并
FARM=[farm;newfarm];
%% -----------------------選擇復制---------------------------------
FIT_Y=zeros(2*N,n);
FIT_Z=zeros(2*N,1);
FIT_F=zeros(2*N,1);
FIT_f1=zeros(2*N,1);
FIT_f2=zeros(2*N,1);
fit_Y=zeros(N,n);
fit_Z=zeros(N,1);
fit_F=zeros(N,1);
fit_f1=zeros(N,1);
fit_f2=zeros(N,1);
for i=1:(2*N)
XX=FARM(i,:);
[Y,Z,F,TGW,VGW,f1,f2]=Fitness(XX,TaskT,TaskV,RT,RV);
FIT_Y(i,:)=Y;
FIT_Z(i)=Z;
FIT_F(i)=F;
FIT_f1(i)=f1;
FIT_f2(i)=f2;
end
Ser=randperm(2*N);
for i=1:N
ff1=FIT_F(Ser(2*i-1));
ff2=FIT_F(Ser(2*i));
if ff1>=ff2
farm(i,:)=FARM(Ser(2*i-1),:);
fit_Y(i,:)=FIT_Y(Ser(2*i-1),:);
fit_Z(i)=FIT_Z(Ser(2*i-1));
fit_F(i)=FIT_F(Ser(2*i-1));
fit_f1(i)=FIT_f1(Ser(2*i-1));
fit_f2(i)=FIT_f2(Ser(2*i-1));
else
farm(i,:)=FARM(Ser(2*i),:);
fit_Y(i,:)=FIT_Y(Ser(2*i),:);
fit_Z(i)=FIT_Z(Ser(2*i));
fit_F(i)=FIT_F(Ser(2*i));
fit_f1(i)=FIT_f1(Ser(2*i));
fit_f2(i)=FIT_f2(Ser(2*i));
end
end
%% -----------------------記錄與更新-------------------------------
maxF=max(fit_F);
meanF=mean(fit_F);
LC1(m)=maxF;
LC2(m)=meanF;
pos=find(fit_F==maxF);
BestPos=pos(1);
BestX=farm(BestPos,:);
BestY=fit_Y(BestPos,:);
BestZ=fit_Z(BestPos);
LC3(m)=fit_Z(BestPos);
LC4(m)=fit_f1(BestPos);
LC5(m)=fit_f2(BestPos);
AllFarm{m}=farm;
disp(m);
m=m+1;
t=t*alpha;
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -