function [PATH,t,surplus_box]=tong_zhuangxiang(box,truck)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%函数名称:同类装箱程序 tong_zhuangxiang
%%入口参数:货物信息 box(cell格式,第一行为长宽高重,第二行为货物的名称,第三行同第二行,第四行是旋转方向) 货车信息 truck
%%出口参数:规划的装箱路径 PATH 优化目标 t(v/(max(x*y*z)) 剩余的货物 surplus_box
%%函数功能说明:
%%对同类进行打包,步骤如下:
%%步骤1:判断总箱子是否超重,如果超重,只对限重范围内的箱子进行装车
%%步骤2:将箱子进行装车(按照先z,再y,后z的方向)
%%装车:预估可以箱子可以排成多少行列,按照不同的情况,进行装车。
%%注意:box至少包含两个箱子
%%by SebastianLi, At ZhengZhou, 24th February, 2021
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w=0;
num_box=size(box,2); % 货物的个数
for i=1:num_box
w=w+box{1,i}(1,4); % 货物的总重量
end
%% 判断总箱子是否超重,如果超重,只对限重范围内的箱子进行装箱
if w>truck(1,4)
w=0;
for i=1:num_box
w=w+box{1,i}(1,4);
if w>truck(1,4)
break
end
end
if i>1 % 如果在限重范围内,还存在部分箱子可以装车,则该些箱子进行装车
uu1=box(:,i:end);
box=box(:,1:i-1);
num_box=size(box,2);
x=box{1, 1}(1,1); % 货物尺寸
y=box{1, 1}(1,2);
z=box{1, 1}(1,3);
truck_x=truck(1,1); % 卡车尺寸
truck_y=truck(1,2);
truck_z=truck(1,3);
num_x=fix(truck_x/x); % 在x方向上最多能装num_x个
num_y=fix(truck_y/y); % 在y方向上最多能装num_y个
num_z=fix(truck_z/z); % 在z方向上最多能装num_y个
START=[0,0,0]; % 起始坐标
if x<=truck_x && y<=truck_y && z<=truck_z % 如果长宽高都满足约束
PATH{1,1}(1,:)={START,box{1, 1},box{2, 1}}; % PATH 待增添的装箱次序
if num_box<=num_z % 如果全部货物可以排成一柱,即底面积为x*y的高矩形
for i=2:num_box
PATH{1,1}(i,:)={[0,0,(i-1)*z],box{1, i},box{2, i}};
end
end
if num_box>num_z && num_box<=num_y*num_z % 如果全部货物可以排成一排,像底面积为x*truck_y的高矩形
if num_z==1
for i=2:num_box
PATH{1,1}(i,:)={[0,(i-1)*y,0],box{1, i},box{2, i}};
end
elseif num_z>1
t2=zeros(num_z,1);
for j=1:num_y-1
t3=ones(num_z,1)*j;
t2=[t2;t3]; % t2 对于y
end
while size(t2,1)<num_box
t2=[t2;t2];
end
t4=(0:num_z-1)';
while size(t4,1)<num_box
t4=[t4;t4];
end % t4 对于z
for i=2:num_box
PATH{1,1}(i,:)={[0,t2(i,1)*y,t4(i,1)*z],box{1, i},box{2, i}}; % (fix((i+1)/num_z)-1)*y mod(i+1,num_z)*z
end
end
end
if num_box>num_y*num_z && num_box<=num_x*num_y*num_z % 如果全部货物可以装成多排,并且可以全部装进车厢里
t2=zeros(num_z,1);
for j=1:num_y-1
t3=ones(num_z,1)*j;
t2=[t2;t3]; % t2 对于y
end
while size(t2,1)<num_box
t2=[t2;t2];
end
t4=(0:num_z-1)';
while size(t4,1)<num_box
t4=[t4;t4];
end % t4 对于z
for i=2:num_box
PATH{1,1}(i,:)={[fix((i-1)/(num_y*num_z))*x,t2(i,1)*y,t4(i,1)*z],box{1, i},box{2, i}};
end
end
surplus_box={};
if num_box>num_x*num_y*num_z % 如果货物不能全部装进车厢里,按照多排进行排放,并统计剩余箱子
surplus_box=box(:,1:num_box-num_x*num_y*num_z);
box(:,1:num_box-num_x*num_y*num_z)=[];
PATH{1,1}(1,:)={START,box{1, 1},box{2, 1}};
num_box=num_x*num_y*num_z;
t2=zeros(num_z,1);
for j=1:num_y-1
t3=ones(num_z,1)*j;
t2=[t2;t3]; % t2 对于y
end
while size(t2,1)<num_box
t2=[t2;t2];
end
t4=(0:num_z-1)';
while size(t4,1)<num_box
t4=[t4;t4];
end % t4 对于z
for i=2:num_box
PATH{1,1}(i,:)={[fix((i-1)/(num_y*num_z))*x,t2(i,1)*y,t4(i,1)*z],box{1, i},box{2, i}};
end
end
t=zeros(size(PATH,1),1);
for num_PATH=1:size(PATH,1)
angles=[];
for j=1:size(PATH{num_PATH, 1},1)
s=eightangle(PATH{num_PATH, 1}{j, 1},PATH{num_PATH, 1}{j, 2});
angles(end+1:end+8,:)=s;
end
end
place=max(angles(:,1))*max(angles(:,2))*max(angles(:,3));
s1=0;
for i=1:size(PATH{num_PATH, 1},1)
s1=s1+PATH{num_PATH, 1}{i, 2}(1,1)*PATH{num_PATH, 1}{i, 2}(1,2)*PATH{num_PATH, 1}{i, 2}(1,3);
end
t(num_PATH,1)=s1/place; % t 目标值
else % 如果长宽高不满足约束,输出空集
PATH={};
t=0;
surplus_box=box;
end
if isempty(surplus_box)==0
surplus_box=[surplus_box,uu1];
else
surplus_box=uu1;
end
else % 如果只有一个箱子,且超重,直接输出
PATH={};
t=0;
surplus_box=box;
end
else
x=box{1, 1}(1,1); % 货物尺寸
y=box{1, 1}(1,2);
z=box{1, 1}(1,3);
truck_x=truck(1,1); % 卡车尺寸
truck_y=truck(1,2);
truck_z=truck(1,3);
num_x=fix(truck_x/x); % 在x方向上最多能装num_x个
num_y=fix(truck_y/y);
num_z=fix(truck_z/z);
START=[0,0,0]; % 起始坐标
if x<=truck_x && y<=truck_y && z<=truck_z
PATH{1,1}(1,:)={START,box{1, 1},box{2, 1}}; % PATH 待增添的装箱次序
if num_box<=num_z % 如果全部货物可以排成底面积为x*y的高矩形
for i=2:num_box
PATH{1,1}(i,:)={[0,0,(i-1)*z],box{1, i},box{2, i}};
end
end
if num_box>num_z && num_box<=num_y*num_z % 如果全部货物可以排在底面积为x*truck_y的高矩形
if num_z==1
for i=2:num_box
PATH{1,1}(i,:)={[0,(i-1)*y,0],box{1, i},box{2, i}};
end
elseif num_z>1
t2=zeros(num_z,1);
for j=1:num_y-1
t3=ones(num_z,1)*j;
t2=[t2;t3]; % t2 对于y
end
while size(t2,1)<num_box
t2=[t2;t2];
end
t4=(0:num_z-1)';
while size(t4,1)<num_box
t4=[t4;t4];
end % t4 对于z
for i=2:num_box
4993135271781073D装箱算法.zip
需积分: 0 89 浏览量
2023-05-11
19:40:28
上传
评论
收藏 24KB ZIP 举报
偷感学习
- 粉丝: 3
- 资源: 1