1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/Y52Vlplr
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。然后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉,变异过程产生更适应环境的新一代“染色体”群。这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解。通过优化算法处理之后,得到某个AVGj,搬运了Pj个货物,每个货物的搬运长度为Lj,那么中的路线长度,即对应我们的优化目标函数。
4.部分源码
%选择需要被搬运的货物编号
Index= [9,5,19,12,13,14,17,21,63,64,75,97];%12个目标
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)-W4/2,Y(i)-W4/2] W4 W4], 'LineWidth', 1, 'EdgeColor', 'b', 'Clipping', 'off');
hold on
else
rectangle('Position', [[X(i)-W4/2,Y(i)-W4/2] W4 W4], 'LineWidth', 1, 'EdgeColor', 'r', 'Clipping', 'off');
hold on
text(X(i)+1,Y(i)+1,num2str(i));
end
end
MAXGEN = 50;
NIND = 200;
Nums = length(Index)+Nagv+1; %优化变量数量,含义为N个货物的路线优化变量+每个agv的搬运数量变量+冲突策略判断
Chrom = crtbp(NIND,Nums*10);
%sh
Areas = [];
for i = 1:length(Index)
Areas = [Areas,[1;length(Index)-i+1]];
end
for i = 1:Nagv
Areas = [Areas,[1;length(Index)-Nagv+1]];%每个agv最多搬运N-agv+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,Nagv))+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;
%保存参数收敛过程和误差收敛过程以及函数值拟合结论
Error(gen) = mean(JJ);
end
clc;
figure;
plot(Error,'linewidth',2);
grid on
xlabel('迭代次数');
ylabel('遗传算法优化过程');
[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);
%显示每个agv搬运的货物编号
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
idxx = (1:length(Index));
Nums = XX_best(1+length(Index):end);
figure;
for i = 1:length(X)
rectangle('Position', [[X(i)-W4/2,Y(i)-W4/2] W4 W4], 'LineWidth', 1, 'EdgeColor', 'b', 'Clipping', 'off');
hold on
end
for j = 1:length(sel)
tmps = sel{j};
for jj = 1:length(tmps)
rectangle('Position', [[X(tmps(jj))-W4/2,Y(tmps(jj))-W4/2] W4 W4], 'LineWidth', 1, 'EdgeColor', Color{j}, 'Clipping', 'off');
hold on
text(X(tmps(jj))+1,Y(tmps(jj))+1,num2str(tmps(jj)));
end
end
02_068m