遗传算法求解立体仓库货位优化
货位优化是仓库布局研究的一个主要分支,随着现代计算机技术以及控制技术的不断发展,生产企业和物流仓储企业仓库管理呈现出控制最优化、运行智能化的发展趋势,对仓库的货位优化已成为物流技术发展的一个重要标志。国外对仓储货位优化研究相对较早。Hesket研究了货物存储所需要的存储空间以及货物的订单数量对仓储效率的影响。Goetschalckx等证明了N类货物分配下最低COI值的货物存储在最适宜的货位,订单拣选和存储时间得到了优化。Graves等分析了货物组合成更少的类别时,高周转率的货物可能会占据不理想的货位。Rosenwein提出了货位布局的分级存储策略。Larson等在Rosenwein研究基础上,使用启发式算法对分级存储策略进行探讨。Sooksaksun等基于分类存储策略对巷道的数量、长度、产品的分类存储建立数学模型,模型以最小化平均行走距离为目标。Zhan等研究了带邻接约束的多层次仓库布局问题,建立了描述同类产品的临近放置的整数规划模型,并采用禁忌搜索算法求解。
遗传算法在解决货位优化NP难问题方面具有有效性。本文只对后者进行研究,从提升仓库出人库效率,保证货架稳定性和货品分类摆放这三方面来进行货位优化。
立体仓库的货架示意图如下:
数学模型:
仓库有X排货架,每个货架有y列z层
货物坐标(x,y,z) 出入库台在(0,0,0)
货物周转效率为Pxyz 货物重量为mxyz
堆垛机沿X、Y、Z轴的移动速度分别为Vx,Vy,Vz
每个货架的长度为L,高度为H
货架单元格的长宽高均为L0
第一个公式使出入库时间最短
第二个公式保证货架的稳定性
第三个公式为了使货物分巷道存放,平衡工作量
F=w1*f1+w2*f2+w3*f3(w1=0.5;w2=0.3;w3=0.2)
部分程序
% Author: 怡宝2号 博士猿工作室
% Use: 基于遗传算法的三维三维货位优化
% 输入变量(可修改量): TurnOver:每个货物的周转率
% Weight:每个货物的重量
% MAXGEN:遗传算法的遗传代数,视具体情况改变
% NumGoods:货物的个数
%
% 输出: trace:每一代的最优个体
% bestpop:每代最优染色体
% Remark: 本人qq:778961303,如有疑问请咨询
clc
clearall
closeall
formatcompact
%参数初始化
[TurnOver,Weight,NIND,MAXGEN,GGAP,PC,PM,K,P ,Q ,...
TotalTray,NumGoods,L0,vx,vy,vz,w1,w2,w3] =initial();
bestpop= []; %每代最优的染色体
ex= importdata('初始货位.txt');
fori=1:size(ex,1)
plotcube(ex(i,:)+0.5,[1,1,1],[0,0,0],[1 1 11 1 1 1 1],1,1);
hold on
end
gridon
title('优化前的货位分配情况')
xlabel('排');
ylabel('列');
zlabel('层');
%所有空货位的集合
num=1;
fori=1:K
for j=1:P
for k=1:Q
CHROM(num,:)=[i j k;];
num = num+1;
end
end
end
%种群初始化
fori=1:NIND
temp = randperm(TotalTray);
chrom(i,:) = temp(1:NumGoods);
end
%计算目标函数和种群适应度
[Fone,Ftwo,Fthree,fitval,fitness]= Objfun(chrom,TurnOver,Weight,CHROM,L0,vx,vy,vz,K,w1,w2,w3);
%进化优化开始
gen= 1;
whilegen<MAXGEN
prob=fitness./sum(fitness); %进行归一化操作
prob=cumsum(prob); %累计求和
selch=chrom(1:NIND*GGAP,:); %子代
%选择操作
for i=1:2:NIND*GGAP %选择操作
%--------寻找父代---------
sita=rand();
for j=1:NIND
if sita<=prob(j)
father=chrom(j,:);
break;
end
end
%--------寻找母代---------
sita=rand();
for j=1:NIND
if sita<=prob(j)
mother=chrom(j,:);
break;
end
end
%----------交叉操作--------------%
if rand()<PC
cutpoint =ceil(rand(1,2)*(NumGoods-3)+2); %范围为[2,19];
spoint=min(cutpoint); %初始交叉点
epoint=max(cutpoint); %终点交叉点
%进行交叉
end
%----------变异操作--------------%
% 随机交换染色体上两个基因的位置
temp=[];temp=rand();
if temp<PM %变异操作
end
end
%计算子代的目标函数和适应度
[Fone,Ftwo,Fthree,selfitval,selfitness] =Objfun(selch,TurnOver,Weight,CHROM,L0,vx,vy,vz,K,w1,w2,w3);
% selfitness = selfitness/sum(selfitness);
%重插入操作,优秀保留政策
[chrom,fitval]=reins(chrom,selch,1,1,fitval,selfitval); %重插入,越小越容易被选择,
%记录
[minfitval index] = min(fitval); %最小值
trace(gen)=minfitval; %记录每一代最小的适应度值
bestpop(gen,:) = chrom(index,:); %最优的染色体
gen=gen+1;
fitness = 1./fitval; %函数值越小,适应度越大
end
% 绘制解得变化图
figure()
plot(trace)
gridon
xlabel('遗传代数')
ylabel('目标函数变化')
title('遗传寻优')
% Remark: 本人qq:778961303,如有疑问请咨询
结果: