物流仿真能够这样完成:数据记载
记载下物流体系运转的数据是物流仿真体系最为重要的环节。咱们在构建仿真体系时要全面、充沛的考虑到体系运转中需求输出哪些数据,并在MATLAB中树立数据表,将体系运转的数据记载到表里,以供下一环节的数据计算与剖析调用。本文将扼要介绍笔者在构建物流仿真体系时的数据记载方法。
数据表发生的逻辑
1、流程活动
“卸货”、“查验”、“理货”、“上架”、“分拣”等流程为首要仓储流程活动(二级流程可根据实践需求在流程库里导出)。流程中的活动规矩决议了仿真体系中服务台的运转机制。
仓储运作参阅流程(示例)
2、资源调用
流程活动中需求调用的“人、设备、设备”资源,资源的状况分为“占用、闲暇”两种状况,假如资源被占用,则需求等候,反之运转。
逻辑举例
3、数据记载
各个服务台在进行活动时需求记载活动数据,活动数据的结构如前文中所说,可根据体系输出的需求进行结构,本文中举例说明数据记载中的几个重要的数据输出。活动时刻记载时分为:开端时刻与完毕时刻,上一活动完毕到下一活动开端的时刻闲暇为等候时刻。
1)时刻:一切活动的运转都是在某个时刻点上运转,大部分的数据计算都需求运用届时刻数据。时刻能够按需求的精准程度拟定时刻刻度;
2)队伍数:队伍数是等候需求处理的货品(托盘/箱/盒)的数量,队伍数的多少表现了体系的繁忙程度;
3)服务台数量:一个服务台的构成由“人、设备、设备”组成,服务台数量影响了服务台一起处理队伍的才能。
数据记载表(示例)
4、数据记载成果
5、MATLAB源码:
体系运转进程的数据记载(示例)
[M,N] =size(worksheet_raw); %界说worksheet_raw队伍数
for I = 1:M-1
%到货
if any(arrivaltable(:,1) ==worksheet_data(I,raw_wtime)) %到货表列称号写入
if worksheet_data(I,raw_unload_queue)> 0
pallet_data =arrivaltable(find(arrivaltable(:,1) == worksheet_data(I,raw_wtime)),2) +worksheet_data(I,raw_unload_queue);
else
pallet_data =arrivaltable(find(arrivaltable(:,1) == worksheet_data(I,raw_wtime)),2);
end
end
pallet_data_0 = pallet_data;
if I > 1
for n = 1:worksheet_n
%%%调整卸货资源
ifany(worksheet_data(:,raw_e_unload) == I) %假定上一行有资源开释
deskNo =worksheet_data(find(worksheet_data(:,raw_e_unload) == I),raw_desk_unload);
% deskNo =sum(worksheet_data(:,raw_e_unload) == I – 1); %检查服务台数量
if deskNo > 1 %假如是多服务台
ifany(rescall_data(:,raw_unload_per) == 0)
deskNo0 =length(find(rescall_data(:,raw_unload_per) == 0)); %找到资源表中被占用资源坐标
for desk_No = 1:deskNo
rescall_data(desk_No,raw_unload_per) = 1; %调整资源表中的卸货人员资源状况
rescall_data(desk_No,raw_eforklift) = 1; %调整资源表中的电叉车资源状况
rescall_data(desk_No,raw_unloadar) = 1; %调整资源表中的卸货端口资源状况
end
end
elseif deskNo <= 1 %假如是单个服务台
rescall_data(min(find(rescall_data(:,raw_unload_per) == 0,1)),raw_unload_per) = 1; %调整资源表中的卸货人员资源状况
rescall_data(min(find(rescall_data(:,raw_eforklift) == 0,1)),raw_eforklift) = 1; %调整资源表中的电叉车资源状况
rescall_data(min(find(rescall_data(:,raw_unloadar) == 0,1)),raw_unloadar) = 1; %调整资源表中的卸货端口资源状况
end
end
end
end
%%%调整查验资源
if any(worksheet_data(:,raw_e_inspect) ==I) %假定本行有资源开释
deskNo =worksheet_data(find(worksheet_data(:,raw_e_inspect) == I),raw_desk_inspect);
% deskNo =sum(worksheet_data(:,raw_e_inspect) == I); %检查服务台数量
if deskNo > 1 %假如是多服务台
ifany(rescall_data(:,raw_inspect_per) == 0)
deskNo0 =length(find(rescall_data(:,raw_inspect_per) == 0)); %找到资源表中被占用资源坐标
for desk_No = 1:deskNo
rescall_data(desk_No,raw_inspect_per) = 1; %调整资源表中的卸货人员资源状况
end
end
elseif deskNo <= 1 %假如是单个服务台
rescall_data(min(find(rescall_data(:,raw_inspect_per) == 0,1)),raw_inspect_per) = 1; %调整资源表中的卸货人员资源状况
end
end
%%%调整查验资源完结
%%%调整上架资源
if any(worksheet_data(:,raw_e_store) ==I) %假定本行有资源开释
deskNo = worksheet_data(find(worksheet_data(:,raw_e_store) == I),raw_desk_store);
% deskNo =sum(worksheet_data(:,raw_e_inspect) == I); %检查服务台数量
if deskNo > 1 %假如是多服务台
ifany(rescall_data(:,raw_store_per) == 0)
deskNo0 =length(find(rescall_data(:,raw_store_per) == 0)); %找到资源表中被占用资源坐标
for desk_No = 1:deskNo
rescall_data(desk_No,raw_store_per) = 1; %调整资源表中的卸货人员资源状况
end
end
elseif deskNo <= 1 %假如是单个服务台
rescall_data(min(find(rescall_data(:,raw_store_per) == 0,1)),raw_store_per) = 1; %调整资源表中的卸货人员资源状况
end
end
%%%调整上架资源完结
worksheet_n = length(worksheet_txt);
if sum(pallet_data > 0) %判别是否有新到货数据 【到货数据】
worksheet_data(I,raw_unload_queue) =sum(pallet_data); %新到货数据进入队伍 【到货队伍】
pallet_data(:) = 0; %到货表清零
end
%%%卸货流程
%%%%检查队伍
if worksheet_data(I,raw_unload_queue) >0 %判别pallet_data是否有到货 【判别到货队伍】
%%%%构建服务台
if length(find(rescall_data(:,raw_unload_per)> 0)) >= 1 && length(find(rescall_data(:,raw_eforklift) > 0))>= 1 && length(find(rescall_data(:,raw_unloadar) > 0)) >=1 %服务台是否闲暇 【判别卸货资源服务台】
deskNo_unload =min([length(find(rescall_data(:,raw_unload_per) > 0)),length(find(rescall_data(:,raw_eforklift)> 0)),length(find(rescall_data(:,raw_unloadar) >0)),worksheet_data(I,raw_unload_queue)]); %确认服务台数量【构建多服务台】
worksheet_data(I,raw_desk_unload) =deskNo_unload; %记载服务台数量【卸货服务台数量】
%%%%服务
worksheet_data(I,raw_b_unload) =I; %开端卸货时刻【开端卸货】
worksheet_data(I,raw_e_unload) = I+ res_data(raw_serviceability,raw_unload_per); %按服务才能确认完毕时刻【卸货完毕】
%%%%构成队伍
worksheet_data(I +1,raw_unload_queue) = worksheet_data(I,raw_unload_queue) – deskNo_unload; %队伍削减【进入服务台】
%%%%资源占用
for unload_i = 1:deskNo_unload %循环树立服务台
rescall_data(min(find(rescall_data(:,raw_unload_per) ~= 0, 1)),raw_unload_per) = 0;
unloadper_sheet(size(unloadper_sheet,1)+ 1,1) = unload_i; %记载卸货人员资源监控表
unloadper_sheet(size(unloadper_sheet,1),3) = I;
unloadper_sheet(size(unloadper_sheet,1),4) = I +res_data(raw_serviceability,raw_unload_per);
rescall_data(min(find(rescall_data(:,raw_eforklift)~= 0, 1 )),raw_eforklift) = 0; %资源服务目标减一 【占用一个卸货服务台资源】
eforklift_sheet(size(eforklift_sheet,1) + 1,1) = unload_i; %记载电叉车资源监控表
eforklift_sheet(size(eforklift_sheet,1),3) = I;
eforklift_sheet(size(eforklift_sheet,1),4) = I + res_data(raw_serviceability,raw_unload_per);
rescall_data(min(find(rescall_data(:,raw_unloadar) ~= 0, 1 )),raw_unloadar)= 0; %资源服务目标减一 【占用一个卸货服务台资源】
unloadar_sheet(size(unloadar_sheet,1) + 1,1) = unload_i; %记载卸货台监控表
unloadar_sheet(size(unloadar_sheet,1),3) = I;
unloadar_sheet(size(unloadar_sheet,1),4) = I + res_data(raw_serviceability,raw_unload_per);
end
else
worksheet_data(I +1,raw_unload_queue) = worksheet_data(I,raw_unload_queue);
end
end
%%%卸货流程完结
if I > 1
%%%查验流程
%%%%检查并构成队伍
if any(worksheet_data(I -1,raw_inspect_queue)) %上一时刻指针队伍是否有剩下
if any(worksheet_data(I -1,raw_desk_inspect)) %假如上一行有服务台
queue_surplus = worksheet_data(I -1,raw_inspect_queue) – worksheet_data(I – 1,raw_desk_inspect); %队伍扣除
else
queue_surplus = worksheet_data(I -1,raw_inspect_queue); %判别队伍是否有剩下
end
else
queue_surplus = 0;
end
if any(sum(worksheet_data(:,raw_e_unload)== I))
serviceNo_i = find((worksheet_data(:,raw_e_unload)) ==I); %检查卸货完毕服务数量
queue_new =sum(worksheet_data(:,raw_e_unload) == I) *worksheet_data(serviceNo_i,raw_desk_unload); %货品查验队伍生成
else
queue_new = 0;
end
worksheet_data(I,raw_inspect_queue) =queue_surplus + queue_new; %剩下队伍顺延
% worksheet_data(I,raw_inspect_queue) = sum(worksheet_data(:,raw_e_unload)== I);
if worksheet_data(I,raw_inspect_queue) >0 %判别是否有队伍等候 【判别查验队伍】
%%%%构建服务台
iflength(find(rescall_data(:,raw_inspect_per) > 0)) >= 1 %服务台是否闲暇 【判别卸货资源服务台】
deskNo_inspect =min([length(find(rescall_data(:,raw_inspect_per) >0)),worksheet_data(I,raw_inspect_queue)]); %确认服务台数量【构建多服务台】
worksheet_data(I,raw_desk_inspect)= deskNo_inspect; %记载服务台数量【查验服务台数量】
%%%%服务
worksheet_data(I,raw_b_inspect) =I; %开端卸货时刻【开端卸货】
worksheet_data(I,raw_e_inspect) = I+ res_data(raw_serviceability,raw_inspect_per); %按服务才能确认完毕时刻【卸货完毕】
worksheet_data(I +1,raw_inspect_queue) = worksheet_data(I,raw_inspect_queue) -deskNo_inspect; %队伍削减【进入服务台】
for inspect_i =1:deskNo_inspect %循环树立服务台
rescall_data(min(find(rescall_data(:,raw_inspect_per) ~= 0, 1)),raw_inspect_per) = 0; %资源服务目标减一 【占用一个卸货服务台资源】
inspectper_sheet(size(inspectper_sheet,1) + 1,1) = inspect_i; %记载卸货人员资源监控表
inspectper_sheet(size(inspectper_sheet,1),3) = I;
inspectper_sheet(size(inspectper_sheet,1),4)= I + res_data(raw_serviceability,raw_inspect_per);
end
end
end
%%%查验流程完结
……


