欢迎光临散文网 会员登陆 & 注册

【车间调度】基于帝国企鹅算法求解考虑AVG分区多行车间调度问题附matlab代码

2022-06-02 23:10 作者:Matlab工程师  | 我要投稿

1 简介

基于帝国企鹅算法求解结合AGV分区车间多行布局问题。 

2 部分代码

function [fit,result,x0]=aimFcn_1(x,option,data)x0=x;%% 解码获得厂区布局x1=x(1:data.numUnit+data.maxS-1);x(1:data.numUnit+data.maxS-1)=[];X=x;map=zeros(data.mapSize./data.accuracy);[~,S]=sort(x1);recording{1}=[];len2=data.mapSize(2)+data.d(2);len1=data.mapSize(1);recording0.noUnit=S;recording1=[];jishu=0;for i=1:length(S)    no=S(i);    if S(i)<=data.numUnit        sizeUnit=data.Unit(no,1:2);        type=1;        jishu=jishu+1;    else        if jishu<data.minUnit            continue;        end        sizeUnit=[data.r*2,data.r*2];        type=2;        jishu=0;    end    if ismember(no,[8,9]) && len1~=data.mapSize(1)        len1=data.mapSize(1);        len2=len2-max(recording{end}(:,5))-data.d(2);        recording=[recording;{[]}];        recording{end}=[recording{end};no,len1,len2,sizeUnit,type];        recording1=[recording1;no,len1,len2,sizeUnit,type];        len1=len1-(sizeUnit(1)+data.d(1));        continue;    end    if ~isempty(recording1)        position=find(recording1(:,1)==1 | recording1(:,1)==2);        if ~isempty(position) && ismember(no,[1,2])            len0=recording1(position,2);            if len1<len0                len1=len0;                len2=len2-max(recording{end}(:,5))-data.d(2);                recording=[recording;{[]}];                recording{end}=[recording{end};no,len1,len2,sizeUnit,type];                recording1=[recording1;no,len1,len2,sizeUnit,type];                len1=len1-(sizeUnit(1)+data.d(1));            else                len1=len0;                recording{end}=[recording{end};no,len1,len2,sizeUnit,type];                recording1=[recording1;no,len1,len2,sizeUnit,type];                len1=len1-(sizeUnit(1)+data.d(1));            end            continue;        end    end    if len1-(sizeUnit(1)+data.d(1))>0        recording{end}=[recording{end};no,len1,len2,sizeUnit,type];        recording1=[recording1;no,len1,len2,sizeUnit,type];        len1=len1-(sizeUnit(1)+data.d(1));    else        len1=data.mapSize(1);        len2=len2-max(recording{end}(:,5))-data.d(2);        recording=[recording;{[]}];        recording1=[recording1;no,len1,len2,sizeUnit,type];        recording{end}=[recording{end};no,len1,len2,sizeUnit,type];        len1=len1-(sizeUnit(1)+data.d(1));    endend%% 将各单元中心对齐recording0.unit=[];jishu1=1;for i=1:length(recording)    if rem(i,2)==0        index=length(recording{i}(:,1)):-1:1;        recording{i}=recording{i}(index,:);    end    maxY=max(recording{i}(:,5));    meanY=mean(recording{i}(:,5));        for j=1:length(recording{i}(:,1))%         if recording{i}(j,1)<=data.numUnit%             no=recording{i}(j,1);%             unitType=recording{i}(j,6);%         else%             no=recording{i}(j,1)-data.numUnit;%             unitType=0;%         end        no=recording{i}(j,1);        unitType=recording{i}(j,6);        x=data.mapSize(1)-recording{i}(j,2);        y=recording{i}(j,3)-data.d(2);        unitX=recording{i}(j,4);        unitY=recording{i}(j,5);        recording{i}(j,7)=x;        recording{i}(j,8)=y-maxY/2+unitY/2;        y=recording{i}(j,8);        if no>data.numUnit            recording{i}(j,1)=jishu1;            recording{i}(j,6)=2;            jishu1=jishu1+1;        end    end    recording0.unit=[recording0.unit;[recording{i},ones(length(recording{i}(:,1)),1)*i]];endZone=[];index=1;jishu=1;  %单元指针jishu1=1; %区域编号for i=1:length(recording0.unit(:,1))    if recording0.unit(i,6)==2        temp={recording0.unit((index:i-1),1)};        if ~isempty(temp{1})            Zone=[Zone;jishu,jishu+length(temp{1})-1];            index1=temp{1};            Zone1(index1)=jishu1;            Zone2{jishu1}=index1;            jishu1=jishu1+1;            jishu=jishu+length(temp{1});        end        index=i+1;    endendtemp={recording0.unit(index:end,1)};if ~isempty(temp{1})    Zone=[Zone;jishu,jishu+length(temp{1})-1];    index1=temp{1};    Zone1(index1)=jishu1;    Zone2{jishu1}=index1;endposition1=find(recording0.unit(:,6)==2);if length(position1)>length(Zone(:,1))-1    recording0.unit(position1(length(Zone(:,1)):end),:)=[];endposition1=find(recording0.unit(:,6)==2);position2=find(recording0.unit(:,6)==1);recording0.unit=[recording0.unit(position2,:);recording0.unit(position1,:)];recording0.noUnit=recording0.unit(:,1);recording0.Zone=Zone;recording0.Zone1=Zone1; %每个节点的区域recording0.Zone2=Zone2; %每个区域的节点endif max(DQ)>data.maxDQ    punishiment=max(DQ)-data.maxDQ;else    punishiment=0;endposition=find(recording0.unit(:,8)-recording0.unit(:,5)<0);punishiment=punishiment+1000*length(position);if max(recording0.Zone1)==1    punishiment=punishiment+1000000;endfor i=1:max(recording0.Zone1)    position=find(recording0.Zone1==i);    if length( position)<data.minUnit        punishiment=punishiment+1000000;    endendnumAGV=max(recording0.Zone1);%%minX=min(recording0.unit(:,7));maxX=max(recording0.unit(:,7)+recording0.unit(:,4));maxY=max(recording0.unit(:,8));minY=min(recording0.unit(:,8)-recording0.unit(:,5));fit1=sum(sum(DQ))/sum(sum(DQmax));fit2=(maxX-minX)*(maxY-minY);fit3=numAGV;fit=sum(data.w.*[fit1,fit2/data.LWmax,fit3/data.maxAGV])+punishiment*10;if nargout>1    result.fit=fit;    result.recording0=recording0;    result.DQ=DQ;endend

3 仿真结果

4 参考文献

[1]马艳楠. 平均最优信息粒子群算法在车辆调度问题中的应用[D]. 桂林电子科技大学, 2013.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。



【车间调度】基于帝国企鹅算法求解考虑AVG分区多行车间调度问题附matlab代码的评论 (共 条)

分享到微博请遵守国家法律