多agv系统调度的MATLAB仿真
? ? ? ? 從起點出發(fā),到貨物點領取貨物最后到卸貨點,以完成任務總時間最短為目標進行單目標優(yōu)化,約束條件為,任務不沖突,路徑不沖突,要能實現(xiàn)路徑規(guī)避 ,4-6臺agv一起工作。左右貨架間隔可通過1個agv,上下貨架間隔可通過兩個agv,通道為雙向行駛通道。一臺agv只能帶一個貨物,優(yōu)化目標為完成任務總的時間最短,agv的速度是勻速,轉彎也不會減速,取貨物時間為固定值。上面的圖里面?貨物看為正方形?跟agv一樣的長度大小,agv試做是跟貨物一樣大小的正方形agv的速度是每秒1個車身。多臺agv一起完成指定任務的時間最短,比如你可以設置三臺agv一起取十個左右的貨物到終點,使得這個時間最短。那就設置3臺agv一起工作?取十個貨物到終點?任務不沖突?路徑不沖突?這樣可以么,十個貨物你可以在圖片上面隨便選。agv完成任務后從終點返回起點的時間和路徑可以不計,或者可以把這個時間視作固定值?路徑不會跟任務車輛沖突。
? ? ? ?場景的仿真效果如下所示:
優(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;
%產生地圖
%上下每個區(qū)域的行數(shù)
N2 = 5;
%左右列數(shù)
N1 = 10;
%AGV大小
W ?= 8;%這個地方不要改,保證坐標都是正數(shù),方便內部計算處理
%左右貨架間隔可通過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];%設置最大值不超過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;
%計算對應的目標值
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];
?
? ? ? ? ? %計算對應的目標值
? ? ? ? ? [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ù)值擬合結論
? ? ? 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
總結
以上是生活随笔為你收集整理的多agv系统调度的MATLAB仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.MATLAB变量——矩阵操作一
- 下一篇: 基于相空间重构的混沌背景下微弱信号检测方