多agv系统调度的MATLAB仿真
? ? ? ? 從起點出發(fā),到貨物點領(lǐng)取貨物最后到卸貨點,以完成任務(wù)總時間最短為目標(biāo)進行單目標(biāo)優(yōu)化,約束條件為,任務(wù)不沖突,路徑不沖突,要能實現(xiàn)路徑規(guī)避 ,4-6臺agv一起工作。左右貨架間隔可通過1個agv,上下貨架間隔可通過兩個agv,通道為雙向行駛通道。一臺agv只能帶一個貨物,優(yōu)化目標(biāo)為完成任務(wù)總的時間最短,agv的速度是勻速,轉(zhuǎn)彎也不會減速,取貨物時間為固定值。上面的圖里面?貨物看為正方形?跟agv一樣的長度大小,agv試做是跟貨物一樣大小的正方形agv的速度是每秒1個車身。多臺agv一起完成指定任務(wù)的時間最短,比如你可以設(shè)置三臺agv一起取十個左右的貨物到終點,使得這個時間最短。那就設(shè)置3臺agv一起工作?取十個貨物到終點?任務(wù)不沖突?路徑不沖突?這樣可以么,十個貨物你可以在圖片上面隨便選。agv完成任務(wù)后從終點返回起點的時間和路徑可以不計,或者可以把這個時間視作固定值?路徑不會跟任務(wù)車輛沖突。
? ? ? ?場景的仿真效果如下所示:
優(yōu)化曲線
?優(yōu)化后場景如下
?部分核心代碼:
clc;
 clear;
 close all;
 warning off;
 addpath 'func\'
 addpath 'GA\'
global N2;
 global N1;
 global W;
 global W1;
 global W2;
 global W3;
 global W4;
 global V;
 global Navg;
 global X;
 global Y;
 global Starts;
 global ends;
 global Idx;
 global Index;
 global Xeach;
 global Xpos;
 global Ypos;
 %產(chǎn)生地圖
 %上下每個區(qū)域的行數(shù)
 N2 = 5;
 %左右列數(shù)
 N1 = 10;
 %AGV大小
 W ?= 8;%這個地方不要改,保證坐標(biāo)都是正數(shù),方便內(nèi)部計算處理
 %左右貨架間隔可通過1個agv
 W1 = W/4;
 %上下貨架間隔可通過兩個agv
 W2 = W/4;
 %上下兩個區(qū)域的間隔
 W3 = 2*W;
 %貨架大小
 W4 = W;
 %速度
 V ?= 1;
 %AVG數(shù)量
 Navg = 3;
 [X,Y,Starts,ends,Idx,Xeach]=func_maps(N1,N2,W1,W2,W3,W4);
 % Xeach(1:2:end)=Xeach(1:2:end)-W1/2;
 % Xeach(2:2:end)=Xeach(2:2:end)+W4+W1/2;
 %選擇需要被搬運的貨物編號
 Index= [1,2,4,5,8,17,23,21,22,34,56,44,45,91];%設(shè)置最大值不超過2*N1*N2
 Xpos = (X(Index));
 Ypos = (Y(Index));
for i = 1:length(Xpos)
 ? ? idx = find(Xeach==Xpos(i));
 ? ? if mod(idx,2)==0;
 ? ? ? ?Xpos(i) = Xpos(i)+W4+W1/2;
 ? ? else
 ? ? ? ?Xpos(i) = Xpos(i)-W1/2;
 ? ? end
 end
?
 figure;
 for i = 1:length(X)
 ? ? tmps = find(Index==i);
 ? ??
 ? ? if isempty(tmps)==1
 ? ? ? ?rectangle('Position', [[X(i),Y(i)] W4 W4], 'LineWidth', 1, 'EdgeColor', 'b', 'Clipping', 'off');
 ? ? ? ?hold on
 ? ? else
 ? ? ? ?rectangle('Position', [[X(i),Y(i)] W4 W4], 'LineWidth', 1, 'EdgeColor', 'r', 'Clipping', 'off');
 ? ? ? ?hold on
 ? ? ? ?text(X(i)+1,Y(i)+1,num2str(i));
 ? ? end
 end
 plot(Starts(1),Starts(2),'--gs',...
 ? ? 'LineWidth',2,...
 ? ? 'MarkerSize',10,...
 ? ? 'MarkerEdgeColor','b',...
 ? ? 'MarkerFaceColor',[0.5,0.5,0.5]);
 hold on
 text(Starts(1)+1,Starts(2)+1,'START');
plot(ends(1),ends(2),'--ys',...
 ? ? 'LineWidth',2,...
 ? ? 'MarkerSize',10,...
 ? ? 'MarkerEdgeColor','r',...
 ? ? 'MarkerFaceColor',[0.5,0.5,0.5]);
text(ends(1)+1,ends(2)+1,'END');
 title('紅色為需要搬運的貨物位置');
?
 MAXGEN = 50;
 NIND ? = 200;
 Nums ? = length(Index)+Navg+1; %優(yōu)化變量數(shù)量,含義為N個貨物的路線優(yōu)化變量+每個AVG的搬運數(shù)量變量+沖突策略判斷
 Chrom ?= crtbp(NIND,Nums*10);
%sh
 Areas = [];
 for i = 1:length(Index)
 ? ? Areas = [Areas,[1;length(Index)-i+1]];
 end
 for i = 1:Navg
 ? ? Areas = [Areas,[1;length(Index)-Navg+1]];%每個avg最多搬運N-AVG+1個,保證其他的至少可以搬運1個
 end
 for i = 1:1
 ? ? Areas = [Areas,[1;2]];%策略4選1
 end
FieldD = [rep([10],[1,Nums]);Areas;rep([0;0;0;0],[1,Nums])];
gen ? = 0;
%計算對應(yīng)的目標(biāo)值
 A = floor(length(Index)*rand(1,Navg))+1;?
 S = sum(A);?
 B = round(A*length(Index)/S);
 if sum(B)>length(Index)
 ?[Vbb,Ibb]= max(B);
 ?B(Ibb) = B(Ibb)-(sum(B)-length(Index));
 end
 if sum(B)<length(Index)
 ?[Vbb,Ibb]= min(B);
 ?B(Ibb) = B(Ibb)+(length(Index)-sum(B));
 end ?
 Xxx ? ? ? ? ?= [1:length(Index),B,1];%初始值
 fobj ? ? ? ? = func_obj(Xxx);
 E ? ? ? ? ? ?= fobj;
 Js ? ? ? ? ? = E*ones(NIND,1);
 Objv ? ? ? ? = (Js+eps);
 gen ? ? ? ? ?= 0;?
%%
 while gen < MAXGEN; ??
 ? ? ? gen
 ? ? ? Pe0 = 0.9999;
 ? ? ? pe1 = 0.0001;?
? ? ? FitnV=ranking(Objv); ? ?
 ? ? ? Selch=select('sus',Chrom,FitnV); ? ?
 ? ? ? Selch=recombin('xovsp', Selch,Pe0); ??
 ? ? ? Selch=mut( Selch,pe1); ??
 ? ? ? phen1=bs2rv(Selch,FieldD); ??
 ?
 ? ? ? for a=1:1:NIND ?
 ? ? ? ? ? AA ? = round(phen1(a,1:length(Index)));
 ? ? ? ? ? AA2 ?= [];
 ? ? ? ? ? Index_=Index;
 ? ? ? ? ? for i = 1:length(AA)
 ? ? ? ? ? ? ? AA2(i)=Index_(AA(i));
 ? ? ? ? ? ? ? Index_(AA(i))=[];
 ? ? ? ? ? end
 ? ? ? ? ? BB ? = floor(phen1(a,1+length(Index):end-1))+1;
 ? ? ? ? ? S ? ?= sum(BB);?
 ? ? ? ? ? BB2 ?= round(BB*length(Index)/S);
 ? ? ? ? ? if sum(BB2)>length(Index)
 ? ? ? ? ? ? ?[Vbb,Ibb]= max(BB2);
 ? ? ? ? ? ? ?BB2(Ibb) = BB2(Ibb)-(sum(BB2)-length(Index));
 ? ? ? ? ? end
 ? ? ? ? ? if sum(BB2)<length(Index)
 ? ? ? ? ? ? ?[Vbb,Ibb]= min(BB2);
 ? ? ? ? ? ? ?BB2(Ibb) = BB2(Ibb)+(length(Index)-sum(BB2));
 ? ? ? ? ? end ??
 ? ? ? ? ? CC2 ?= round(phen1(a,end));
 ? ? ? ? ??
 ? ? ? ? ? X1 ? = [AA2,BB2,CC2];
 ?
 ? ? ? ? ? %計算對應(yīng)的目標(biāo)值
 ? ? ? ? ? [fobj,pathall] = func_obj(X1);
 ? ? ? ? ? E ? ? ? ? ? ? ?= fobj;
 ? ? ? ? ? JJ(a,1) ? ? ? ?= E;
 ? ? ? ? ? XX{a} ? ? ? ? ?= X1;
 ? ? ? ? ? pathallX{a} ? ?= pathall;
 ? ? ? end?
 ? ? ??
 ? ? ? Objvsel=(JJ); ? ?
 ? ? ? [Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel); ??
 ? ? ? gen=gen+1;?
 ? ? ? %保存參數(shù)收斂過程和誤差收斂過程以及函數(shù)值擬合結(jié)論
 ? ? ? Error(gen) = mean(JJ);
 end?
 clc;
 figure;
 plot(Error,'linewidth',2);
 grid on
 xlabel('迭代次數(shù)');
 ylabel('遺傳算法優(yōu)化過程');
[V,I]=min(JJ);
XX_best ? ? ?= XX{I};
 pathall_best = pathallX{I};
?
 idxx = XX_best(1:length(Index));
 Nums = XX_best(1+length(Index):end-1);
 Color{1}='r';
 Color{2}='k';
 Color{3}='g';
 Color{4}='y';
 Color{5}='m';
 Color{6}='c';
 ?
%顯示每個avg搬運的貨物編號
 S1=0;
 E1=0;
 for j = 1:length(Nums)
 ? ? if j == 1
 ? ? ? ?S1=E1+1;
 ? ? ? ?E1=S1+Nums(j)-1;
 ? ? ? ?sel{j}=idxx(S1:E1);?
 ? ? else?
 ? ? ? ?S1=E1+1;
 ? ? ? ?E1=S1+Nums(j)-1;
 ? ? ? ?sel{j}=idxx(S1:E1);?
 ? ? end
 ? ? sel{j}
 end
 A-06-68
總結(jié)
以上是生活随笔為你收集整理的多agv系统调度的MATLAB仿真的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 6.MATLAB变量——矩阵操作一
- 下一篇: 基于相空间重构的混沌背景下微弱信号检测方
