装配生产线任务平衡优化遗传算法通用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 % 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 %% ----------------------变异退火算子------------------------------
for i=1:N
if rand>Pm&&i~=BestPos
%如果随机数大于变异概率门限值,并且不属于保护个体,就对其实施变异
I=farm(i,:);%取出该个体
k=1;
while 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 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