1. 引言
随着经济的迅速发展,使得社会需求日益增加,企业专业化生产也越来越深入,物流行业在中国也得到了快速发展,其中也包括供应链物流。现在的物流市场日趋成熟,竞争越来越激烈,提高客户的满意程度成为物流市场的主要竞争目标。影响客户满意程度的因素很多,其中主要的一个因素就是配送速度。对于供应链物流来说,可以通过优化其配送环节来提高配送速度与效率,其中拣货就是配送过程中的关键步骤 [1]。
2. 仓内拣货问题介绍
电商公司客户订单下达仓库后,商品开始下架出库,出库主要包含5个流程如下图所示:
![](//html.hanspub.org/file/15-2621264x9_hanspub.png)
1) 定位:仓库有多个货架,每个货架有多个货格,商品摆放在货格中,且每个货格最多摆放一种商品,商品可以摆放在多个货格。订单下达仓库后,定位操作,确定商品下架的货格和每个货格下架的商品数量。
2) 组单:单个客户订单商品数量少,对于中小件商品仓库,需要将多个客户的订单合并,构成任务单,这就是组单操作。
3) 拣货:拣货开始,拣货员在某个复核台领拣货车及任务单,领取时间不计,然后根据推荐顺序依次访问任务单中商品所在货格,并下架商品,将商品放在拣货车上。下架完毕,拣货员将拣货车送往某个复核台,到达复核台后拣货员无需等待,继续领取拣货车和任务单,开始下一个任务单拣货流程。
4) 复核台先对任务中商品复核,然后将商品按照订单打包。
为方便问题的研究,我们给出一组信息,进行实际计算:
假设4个复核台(FH01,FH03,FH10,FH12)正常工作,49个任务单(T0001~T0049)等待拣货,9个拣货员(P1~P9)负责拣货,要求给每个拣货员分配任务单、起始拣货复核台,并分别规划理想的拣货路线,使得49个任务单尽快完成出库,并计算完成出库需要花费的时间和每个复核台利用率。
3. 模型的假设
1) 假设仓内货物充足,不会出现短缺。
2) 假设每个任务单的完成时间只与起始和终止复核台的选择有关。
3) 假设拣货员将货物放到复核台可直接再去取货,忽略中转时间。
4) 多人同时在一个货格拣货,不考虑等待的时间。
5) 拣货员每次均可完全按照任务单的要求进行拣货,不考虑因为漏拣,错拣所耽误的时间。
4. 模型的建立与求解
由于有9个拣货员,而只有4个复核台,必定会造成复核台的拥堵。因此,复核台成为影响总体出库时间的关键。同时,为了每个使任务单都尽快出库,减少任务单在仓库的平均“逗留时间”(即从任务单出现至出仓的时间),我们以“需要拣货时间短的任务单先执行”的第一原则进行处理。由于总的出仓时间取决于最后一个工作完毕的复核台的时间,我们以“对4个复核台和9个拣货员的工作时间的平均分配”为第二原则进行,这样可以减少最后一个完成工作的复核台的时间,同时可以减少复核台的堵塞。
接下来,我们通过计算机模拟的方式按照上述原则仿照实际情况,对任务单进行处理,得出具体的实施方案,已经相应的时间信息。
4.1. 初始化阶段
1) 初始的时候形成一个49列,16行的矩阵C,列对应49个货单,行对应16个不同的开始和终止复核台的方案,
表示其第i行第j列的元素,其值表示货单j按第i行的方案运行所需的时间。矩阵C的值如表1所示。
![](Images/Table_Tmp.jpg)
Table 1. Time required for a task single scenario (unit: s)
表1. 任务单个方案所需时间(单位:s)
2)
为C动态矩阵,用来存储C的加权信息;
3) F为4维行向量,每一个元素代表一个复核台,用来动态存储复核台的工作时间,初始值为0。
4) h为49维向量,则
为其第表示第j个元素,含义是任务单j所需的复核时间;h的值如表2所示。
![](Images/Table_Tmp.jpg)
Table 2. Task order review time (unit: s)
表2. 任务单所需复核时间(单位:s)
5) P为9列10行的矩阵,则每一列代表一个人所执行的任务单j;
6) Q与P同规模,用来存放P对应元素的任务单所对应的方案i;
7)
为9维列向量,每一列对应一个拣货员,用来动态储存拣货员的积累行动时间,初始值
。
4.2. 任务执行阶段
Step 1:对
中的元素进行加权。将F中每个复核台对应的元素值,加入到
中以该复核台为终止复核台的方案中,从而使得选到相对忙碌的复核台为终止复核台的概率降低。
Step 2:选取
中最小权值的元素的位置
,将
对应的任务作为第k个人的任务,然后j将存入P中第k个人对应的位置处,i存入Q的相应位置,
中第k个人对应元素增加
。
Step 3:判断F中方案i的终止复核台对应元素是否为0,若为0,F中该元素的值加
,否则加
。
Step 4:将第j列的值都置为极大inf。
Step 5:最后恢复
,重新令
。
Step 6:重复执行Step 1至Step 5共9次,来确定9个人的初始任务。
Step 7:搜索
中的最小值所存的位置R,找到Q中第R个人最后一次任务的方案,保证任务先完成的先开始下一任务。
Step 8:确定第R个人当前最后一次任务方案的终止复核台FH。执行Step1,在矩阵
中寻找以该终止复核台为起点的方案中的最小值元素的位置
,选定之后把j,i分别放入P,Q中,
的值加入到
中该人的位置R处。然后把
对应的
加入到F中方案i的终止复核台对应元素中。
Step 9:恢复
重新令
。
Step 10:重复执行Step 7到Step 9,直至所有任务单均已被选定。
Step 11:计算最终结果,在得到的结果之中,
为9个人分别行动的时间,Q和P为相应的每个人的任务信息,为复核台的工作时间信息,并且F中的最大值即为最终的出仓时间。
4.3. 模型求解
通过MATLAB编程进行求解,得出拣货方案结果如表3、表4所示,复核台与拣货人员的工作时间如表5、表6所示,复核台的效率如表7所示。
![](Images/Table_Tmp.jpg)
Table 4. Programs and tasks performed by pickers (left: Program No., right: Task Order No.)
表4. 拣货员执行的方案与任务(左边:方案编号,右边:任务单编号)
![](Images/Table_Tmp.jpg)
Table 5. Cumulative working time of review Desk (unit: s)
表5. 复核台累计工作时间(单位:s)
![](Images/Table_Tmp.jpg)
Table 6. Cumulative working hours of the picker (unit: s)
表6. 拣货员的累计工作时间(单位:s)
![](Images/Table_Tmp.jpg)
Table 7. Operating efficiency of the review table and total warehousing time (time unit: s)
表7. 复核台的运行效率及出仓总时间(时间单位:s)
5. 总结
对于此问题,需要解决9个拣货员,4个复核台,49个任务单的任务分配,任务单的执行顺序等问题。我们给出拣货员领取任务单的原则,以及方案选择的选择,构建了一套计算机模拟体系,运用了MATLAB模拟,得到总的出库时间为5666.47 s,复核台的利用率分别为0.9107、0.8736、0.9212、0.9192。
附录
MATLAB程序
load('zuobiao_H.mat')
load('zuobiao_C.mat')
load('zuobiao_fht.mat')
P=zeros(10,9);
P1=zeros(size(P));
Pt=zeros(1,9);
F=[1,3,10,12;0,0,0,0];
C=zuobiao_C;
Cd=C;
for i1=1:9
for i3=1:4%加权
for i2=i3:4:i3+12
Cd(i2,:)= Cd(i2,:)+F(2,i3);
end
end
a1=min(min(Cd));
P(1,i1)=c1;
P1(1,i1)=b1;
a2=C(b1,c1);
Pt(1,i1)=Pt(1,i1)+a2;
h=zuobiao_H(1,c1); %为求F
z1=zuobiao_fht(b1,2); %终止复核台编号
if F(2,d1)==0
F(2,d1)=F(2,d1)+a1+h;
else
F(2,d1)=F(2,d1)+h;
end
C(:,c1)=99999999999999;
Cd=C; %重置
end
%前9次循环结束
for i4=10:49
for i3=1:4 %加权
for i2=i3:4:i3+12
Cd(i2,:)= Cd(i2,:)+F(2,i3);
end
end
e1=min(Pt);
zero_index=find(P1(:,k1)==0);%找一列中最后一个任务方案
first_zero_index=zero_index(1);
f1=first_zero_index-1;
P1_end=P1(f1,k1);
z2=zuobiao_fht(P1_end,2);%终止复核台编号
g1=find(zuobiao_fht(:,1)==z2);
n1=Cd(g1,:);
m1=min(min(n1));
P(f1+1,k1)=q1;
P1(f1+1,k1)=p1;
m2=C(p1,q1);
Pt(1,k1)=Pt(1,k1)+m2;
h2=zuobiao_H(1,q1); %为求F
z2=zuobiao_fht(p1,2); %终止复核台编号
if F(2,d2)==0
F(2,d2)=F(2,d2)+a1+h2;
else
F(2,d2)=F(2,d2)+h2;
end
C(:,q1)=99999999999999;
Cd=C; %重置
end