Gointerface接口声明实现及作用详解
249
2022-11-05
【优化求解】基于matlab遗传算法求解立体仓库出入库路径优化问题【含Matlab源码 2028期】
一、遗传算法仓库货位简介(仅供参考)
1 问题描述 1.1 自动化立体仓库出入库路径优化问题描述 自动化立体仓库如图1所示,主要是由以下几个部分组成:
巷道堆垛机由计算机来控制,它按照计算机的指令来执行出库、入库等动作。当一批生产任务到达时,计算机将出入库的指令按照次序发送给巷道堆垛机,堆垛机按照指令顺序依次来执行出入库任务。由于出入库动作执行的顺序不一样,堆垛机的运行路径也不同,导致了执行任务所花费的时间也不一样。当生产任务较大时,合理的出入库作业路径,将极大地提高仓库的运行效率。
2 优化问题模型建立
一批生产任务中,通常包含若干个入库动作和出库动作,堆垛机出入库作业有单一作业(单一入库作业、单一出库作业)和复合作业两种;通过实践研究表明,复合作业相比单一作业更有效率[8,9],即通过将一个入库动作和出库动作配对执行来提高整体效率。如图2所示,O为堆垛机运行起始点,对M执行入库动作,对N执行出库动作,堆垛机所走的路径为O→M→N→O。
图2 堆垛机运行路径分析
为了方便计算,现假设堆垛机匀速运行,加速和制动时间忽略不计,不考虑货叉存取时间。如果货位位于i列j行,则标记为(i,j),O为(0,1)。设货架的长度和高度分别为l和h,入库作业货位位置为(a,b),出库作业货位位置为(c,d),则执行一次复合作业的时间为
式中:Tk为一次复合作业的时间,k为第k对复合作业;Vx为水平方向的平均速度;Vy为垂直方向的平均速度。在一批出入库作业中,出、入库作业的数目可能不一致,设有n1个入库作业,有n2个出库作业,取
则这批出入库作业由P2个复合作业和P2-P1个单一作业组成,总作业时间为
式中:Ts为单一作业的时间,设现有一个单一出库任务(e,f),则Ts表示为
完成一批出入库作业,应该合理安排复合作业和单一作业,从而使复合作业的时间和单一作业的时间之和最小,综上所述,自动化立体仓库出入库最优路径建立如下
二、部分源代码
clc;close all;clear all; %% 堆垛机路径优化%% vx=3;vy=1;et=1;%et为卸货/装货时间 l=1.5;h=1;%l为长,h为高 [goodin,goodout,gate]=tsp();%货物位置 n1=size(goodin,1);n2=size(goodout,1);n3=size(gate,1); %n1为入库数,n2为出库数,n3为台数 s=100;%样本数 pc=0.6;%交叉概率 pm=0.01;%变异概率 times=2000-1; %最大迭代次数 time=0; %实际迭代次数pop=zeros(s,n1+n2+1);%初始种群+适应度 pop_fit_aver=[];%总适应度 min_dis=[];%最短时间 pop_min=[];%最短时间的基因for i=1:s %初始化 pop(i,1:n1)=randperm(n1); pop(i,n1+1:n1+n2)=randperm(n2); end clf plot(goodin(:,1),goodin(:,2),‘ro’);%画入库点 for i=1:n1 test_t=num2str(i); text(goodin(i,1),goodin(i,2),test_t);%标号 end hold on,plot(goodout(:,1),goodout(:,2),‘bo’);%画出库点 for i=1:n2 test_t=num2str(i); text(goodout(i,1),goodout(i,2),test_t);%标号 endhold on,plot(gate(:,1),gate(:,2),‘ko’);%画门 text(gate(1,1),gate(1,2),‘a’);%标号 text(gate(2,1),gate(2,2),‘b’);%标号 title(‘分布图’); xlabel(‘x’); ylabel(‘h’); h1=legend(‘入库点’,‘出库点’,‘出入库台’) %图例说明 set(h1,‘Box’,‘off’);[goodin_time,goodout_time]=GoodToGateTime(goodin,goodout,gate,vx,vy);%货物到两个台的时间 [individual_fit,sumfit,min1,min_index]=GroupFit(goodin_time,goodout_time,pop,s,n1,n2,n3,goodin,goodout,gate,vx,vy,et);%适应度 sumP=sumfit; pop_fit_aver=[pop_fit_aver;sumfit/s]; min_dis=[min_dis;min1]; pop(:,n1+n2+1)=individual_fit; fitbest=pop(min_index,:); pop_min=[pop_min;pop(min_index,:)]; pop=ChooseParents(pop,n1,n2,s);%选择父代for i=1:times time=time+1; if i<1000 [CrossOverPop]=CrossOver(s,pop,pc,n1,n2,n3,0);%采用均匀交叉 else [CrossOverPop]=CrossOver(s,pop,pc,n1,n2,n3,1);%采用单点交叉 end if i<500 [MutationPop]=Mutation(CrossOverPop,pm,20,n1,n2,n3);%变异 elseif i<1500 [MutationPop]=Mutation(CrossOverPop,pm,10,n1,n2,n3);%变异 else [MutationPop]=Mutation(CrossOverPop,pm,1,n1,n2,n3);%变异 end pop=MutationPop;%更新 [individual_fit,sumfit,min1,min_index]=GroupFit(goodin_time,goodout_time,pop,s,n1,n2,n3,goodin,goodout,gate,vx,vy,et);%适应度 sumS=sumfit; pop_fit_aver=[pop_fit_aver;sumfit/s]; min_dis=[min_dis;min1]; pop(:,n1+n2+1)=individual_fit; pop_min=[pop_min;pop(min_index,:)];
if i>200 && sum(pop_fit_aver(end-199:end)==pop_fit_aver(end))==200 %退出条件 break;endpop=ChooseParents(pop,n1,n2,s);%选择父代
end [a,min_index]=min(min_dis); disp(‘最短时间’) a time1=1:time+1; figure%画平均适应度折线图 plot(time1,min_dis,‘k.’); grid on; title(‘每代最小值散点图’); xlabel(‘迭代次数’); ylabel(‘最短距离’); figure%画平均适应度折线图 plot(time1,pop_fit_aver); grid on; title(‘每代平均适应度折线图’); xlabel(‘迭代次数’); ylabel(‘每代总适应度’); disp(‘最优基因’) (pop_min(min_index,:)) DrawP(pop_min(min_index,:),goodin,goodout,goodin_time,goodout_time,gate,n1,n2,n3);
三、运行结果
四、matlab版本及参考文献
1 matlab版本 2014a
2 参考文献 [1]朱文真,唐敦兵,王雷.基于遗传禁忌搜索算法的自动化立体仓库出入库路径优化研究[J].机械科学与技术. 2011,30(07)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~