2020年MathorCup数学建模C题仓内拣货优化问题解题全过程文档及程序

2020年第十届MathorCup高校数学建模挑战赛

C题仓内拣货优化问题

原题再现:

  某电商公司客户订单下达仓库后,商品开始下架出库,出库主要包含5个流程如下图所示:
在这里插入图片描述
  l 定位:仓库有多个货架,每个货架有多个货格,商品摆放在货格中,且每个货格最多摆放一种商品,商品可以摆放在多个货格。订单下达仓库后,定位操作,确定商品下架的货格和每个货格下架的商品数量。
  l 组单:单个客户订单商品数量少,对于中小件商品仓库,需要将多个客户的订单合并,构成任务单,这就是组单操作。
  l 拣货:拣货开始,拣货员在某个复核台领拣货车及任务单,领取时间不计,然后根据推荐顺序依次访问任务单中商品所在货格,并下架商品,将商品放在拣货车上。下架完毕,拣货员将拣货车送往某个复核台,到达复核台后拣货员无需等待,继续领取拣货车和任务单,开始下一个任务单拣货流程。备注:(1) 拣货员开始和结束复核台可以不一致。(2) 一个拣货员负责对多个任务单时,每次只能拣一个任务单的商品。同一任务单,货格访问顺序不同,行走距离也有差异。(3) 拣货员的行走速度为 1.5m/s,商品下架过程,对任意一个货格,若下架商品数量小于 3 件,每件完成下架花费 5 秒,否则每件花费 4 秒。多人同时在一个货格拣货,不考虑等待的时间。
  l 复核和打包:拣货时,拣货员可能多拣或者漏拣商品。拣货车放到复核台先对任务中商品复核,然后将商品按照订单打包。备注:(1) 只有复核台正常工作时,才可以进行复核打包操作,每个订单复核和打包花费30 秒。(2) 只有拣货员将任务单中商品通过拣货车送到复核台后,复核台才能对该任务单中商品进行复核和打包。(3) 若一个复核台完成该复核台所有任务单的复核和打包,没有新任务前,该复核台将处于空闲状态。从0 时刻到 TOTAL_TIME 时刻,若一个复核台总空闲时间为IDLE_TIME,则该复核台利用率=1-IDLE_TIME/TOTAL_TIME。多人同时到达一个复核台时,需要考虑等待的时间。
  现有一个仓库,仓库数据见附件 1“仓库数据.xlsx”,包括 4 个表格,前 3 个表格为仓库信息,包括货架、货格、复核台的位置及大小,货格和货架的关系。第 4 个表格为任务单信息,一个任务单包含多个订单,一个订单商品包含多个货格,一个货格需要拣多件商品。仓库示意图见图 1,注意横纵坐标比例不是 1:1。
在这里插入图片描述
  根据仓库数据附件 1 和附件 2,仓库有 13 个复核台,4 排货架,其中每排 25 组货架,每组 2 个货架,共 50 个货架,每个货架包含 15 个货格。水平方向每组货架之间的距离为 1500 毫米,竖直方向相邻两排货架纵向距离为 2000 毫米,货格长宽都是 800 毫米,复核台长宽都是 1000 毫米。备注:货架和复核台为障碍物,不可通行,其余位置均可通行。不用考虑拣货车尺寸,货架和复核台高度。
在这里插入图片描述
说明:
  1. 当绕障碍物折线行走时横向和竖向偏移都取 d=750mm;
  2. 复核台之间距离简化为两复核台坐标差的绝对值之和,如复核台 A坐标 ,复核台 B 坐标 ,则两复核台距离为 ;
  3. 货格与复核台距离简化为货格中点到复核台最近一条边中点的距离,如 L1 和 L7)
  根据上述已知条件和要求,请完成以下问题:
  问题 1:图 2 给出拣货员在仓内路线示例(L1-L7)。当拣货员在仓库中拣货时,需要在货格之间、货格与复核台之间、复核台与复核台之间行走。由于这些行走通常要绕过障碍物,不能直接采用坐标计算欧几里得距离。请你按照图中距离标示,设计一种计算 3000 个货格和 13 个复核台总共 3013 个元素之间距离的方法。(附件中货架坐标可理解为第一个货格左下角坐标,如 S001 的(x,y)表示货格 S00101 的坐标。其他相类似。复核台坐标也理解为左下角坐标。)
  问题 2:假设所有复核台正常工作,任务单 T0001 等待拣货,拣货员 P在复核台 FH10 领取了任务单 T0001。请给 P 规划理想的拣货路线,包括货格访问顺序、返回的复核台,计算完成出库花费的时间(拣货员拣货开始到所有任务复核打包完成花费的时间)。
  问题 3:假设 2 个复核台 (FH03,FH11)正常工作,5 个任务单(T0002-T0006)等待拣货,继续由拣货员 P 负责拣货,P 初始位置为 FH03。通过建模和优化,请给 P 指定任务领取顺序,规划理想的拣货路线,使得这些任务尽快出库。请计算完成出库需要花费的时间和每个复核台利用率。
  问题 4:假设 4 个复核台(FH01,FH03,FH10,FH12)正常工作,49个任务单(T0001-T0049)等待拣货,9 个拣货员(P1-P9)负责拣货,请给每个拣货员分配任务单、起始拣货复核台,并分别规划理想的拣货路线,使得 49 个任务单尽快完成出库,并计算完成出库需要花费的时间和每个复核台利用率。
  问题 5:在问题 4 中,有 4 个复核台(FH01,FH03,FH10,FH12)正常工作,请评估增加一个正常工作的复核台对出库时间的影响。
  问题 6:商品在货架中的摆放位置,会影响拣货效率。若将畅销品放置在离复核台较近的位置,拣货员行走距离相应减少,但畅销品所在货架可能拥挤,反而降低拣货效率。对于仓内商品摆放问题,你有什么建议?
  注:在问题 3,4,5 中,当一个人有多个任务时,只能一个一个任务完成,不能在完成一个任务过程中拣另一个任务的货。
附件 4 计算结果文件要求说明:
  为验证计算结果,本赛题需要提交数据文件
  文件名为:C 队号计算结果.xlsx。
  问题 1 数据填入 Ques1 中,给出 3013 个元素的最短距离矩阵 3013﹡3013。 序号顺序为 S00101,S00102,…,S00115,S00201,…,S20001,S20002,…,S20015。 复核台 FH01,FH02,FH03,…,FH13。 也即 S00101 标号为 1,S00102 标号为 2,…,S20015 标号为 3000,复核台FH011标号为3001,复核台FH02标号为3002,…,FH13标号为3013。将得到的最短路矩阵填入表单 Ques1。该最短路矩阵共占 3013 行和3013 列。行从 1 行开始,列从 A 列开始。
  问题 2 数据填入 Ques2。第 2 列原始名称中 3—25 行为任务 1 中的 23 个商品货格号;第 3 列为复核台或商品货格对应的标号,范围为 1—3013。第 4 列为对应商品货格的件数,在附件仓库数据任务单中商品件数列中直接摘抄即可。复核台商品件数标 0 即可。
  问题 3 数据填入 Ques3与问题 2 表单意义相同。只是增加了一列任务单。注意当完成一个任务后,回到一个复核台,下一次即从该复核台领取任务单出发。
  问题 4 数据填入 Ques4与问题 3 表单意义相同。只是增加了一列人(P1-P9)

整体求解过程概述(摘要)

  仓储中心是物流行业中的重要组成元素,研究仓储效率问题就是要对拣货路径选择与货位分配进行分析,在保证有序完成任务订单的同时尽可能缩短出货时间。本文基于最短路径方法,利用遗传算法、贪心算法进行求解,对拣货路径选择做出了合理的设计,同时对货位分配也做了深入的探索性研究。
  针对问题一,需要计算货格与复核台共 3013 个元素之间的距离。考虑到不同情况下最短距离的计算方法不同,本文分了三个部分依次计算:货格与货格之间、货格与复核台之间、复核台与复核台之间。进一步通过分析不同排及不同巷道的情况得到了各种情形下的距离计算方法。
  针对问题二,由于终点待定,本文应用图论知识提出了替换复核台的概念,固定了路径的起点和终点后,基于问题一求得的距离矩阵建立最短路径模型,这属于 NP 难问题,通过遗传算法进行求解,计算得到完成出库花费的总时间为 725.8 s 。
  问题三中任务单的数量增多,复核台有两个,应用替换复核台的方法将其转换为旅行商问题,同样属于 NP 难问题,通过遗传算法求解得到每个任务单的完成路线,通过调整方向使五条路径首尾相连并从指定的初始复核台 FH03 出发,拣货员可以连续工作,从而有最高的效率。计算得到出库需要花费的时间为 2531.33 s ,FH03、 FH11 的利用率分别为 43.85% 、33.18%。
  问题四进一步升级,需要对 4 个复核台、49 个任务单、9 个拣货员进行规划,同样先利用替换复核台方法及遗传算法算得每个任务单的最短路径,通过计算及理论分析发现在此种情形下,影响出货时间的主要因素为复核时间,因此只需调整 49 个任务单的终点复核台使得各复核台的复核时间达到平衡,运用贪心算法进行调整,从而得到最短的出货时间。计算得到出库需要花费的时间为 5699.4 s ,FH01、FH03、FH10、FH12的利用率分别为 91.88%、92.30%、96.03%、92.58%。
  问题五在问题四的基础上增加了一个复核台,由于第四问验证后发现复核台一直处于满载状态,本文对五个复核台的情况进行近似计算发现复核台仍处于满载状态,因此按照第四问的方法,增加第五个复核台后出库时间理论上大致会变为之前的五分之四,经过计算发现用时为 4605s,是四个复核台情况下的 80.8%,与理论分析相符。进一步探究发现,当复核台数量增加到六个后会出现复核台空载的情况,即无法继续通过增加复核台数量缩短出货时间,需要考虑对线路的进一步优化。
  问题六提供了另一个侧面来提高仓库拣货的工作效率,通过调整商品的摆放位置来影响拣货效率。本文提出了仓库分区与商品分级的策略,在此基础上通过将二者耦合,构建了货物分配的优化模型并给出了相关建议。

模型假设:

  1、假设拣货员完成一次任务即行走至复核台进行复核和打包;
  2、假设不考虑商品与拣货车的长宽,即不考虑一任务单多车或多任务单一
车的情况;
  3、假设不考虑多储位货物拣货的情况;
  4、多人同时在一个货格拣货,不考虑等待的时间;而多人同时到达一个复核台时,需要考虑货物等待的时间。

问题分析:

  随着全球贸易的急速发展,物流效率的提高得到越来越多的关注。仓储在物流工作中担任着举足轻重的作用,提高仓储中心的作业效率成为相关领域的研究重点。本文主要针对某电商公司的货架式仓储中心的拣货路径进行研究,通过计算货格与复核台之间的距离建立最短路径模型,并利用遗传算法进行求解,对各

   问题一分析

  问题一需要求出货格与复核台总共 3013 个元素之间的距离,即需要在考虑绕开障碍的情况下找到任意两个对象之间的最短距离。本文通过观察货格与复核台的分布规律,分为三个部分分别计算:货格之间、货格与复核台之间、复核台与复核台之间。对于货格之间,考虑到货架所在的排及巷道会影响路径的选择,本文对不同情况分别进行了分析;对于货格与复核台之间,处于仓库下方的复核台可直接计算,处于仓库左方的复核台则同样需要分多种情况进行分析;对于复核台与复核台之间则直接简化为坐标差的绝对值之和。在计算过程中,本文提出了一种将货格坐标迁移到巷道相应位置的策略,极大程度上简化了计算的冗杂程度。

   问题二分析

  问题二给定了一个具体的任务单,需要给拣货员规划合理路径使得出库花费的时间最短。考虑到拣货员下架商品的时间及复核任务单的时间固定,只需求得最短拣货路径即可使得总用时最少。此处已固定了初始复核台为 T0001,终点复核台可从 13 个复核台中任选,为了便于计算,本文提出了替换复核台的概念来固定终点,基于问题一得到的各元素之间的距离矩阵建立了问题二最短路径模型。由于该模型属于 NP 难问题,本文采用了遗传算法对模型进行求解,结合拣货员的行走速度即可计算出拣货路途中所花时间。

   问题三分析

  问题三将复核台数量限制在了两个,任务单数量变为五个,其余条件与第二问相同,需要求出出库最少花费的时间及复核台的利用率。本文将分为两个步骤进行分析,首先考虑先求出每个任务单各自的最短路径,其次再将这些路径按照合理的顺序与方向衔接起来。在求解每个任务单的最佳路径时同样引入替换复核台来代替起点与终点,从而均可转化为旅行商问题,这依旧是一个 NP 难问题,求解方法与第二问相同,利用遗传算法寻求最短路径。在得到各个任务的最短路径后对它们调整顺序、改变路径方向使得第一项任务的起点为指定的 FH03、任务之间首尾相连、最后一项任务的复核时间尽可能短,即可得到耗时最短的方案。

   问题四分析

  问题四的复核台变为 4 个,拣货员增加到 9 个,任务单增加为 49 个,要求使得出库时间尽量少。考虑首先对每个任务单寻求最佳路径,再将这些路径进行合理的分配使得各个复核台需要复核的订单数量大致相等,以免造成需要复核的订单堆积而耗去大量时间,最后再通过贪心算法将这些任务单分配给拣货员。

   问题五分析

  问题五在问题四的基础上提供了一个额外的复核台,需要去评估对出库时间的影响。通过对问题四的分析可以发现当拣货员较多时拣货的效率得以提高,从而复核时间对出货时间的影响有所上升。本文通过分析增加一个复核台后复核时间与拣货时间的关系来进行评估,当增加的一个复核台能够有效缓解复核台待复核订单堆积的情况时认为它在一定程度上提高了出货效率。

   问题六分析

  在自动化仓库进行出入库操作时,商品在货架中的摆放位置,会在很大程度上影响拣货效率。在货物摆放中,需要考虑的原则有很多, 如货架应承载均匀,上轻下重;货物应加快周转,采取先入先出策略;提高拣货效率,应就近入库/出库等。然而,倘若一味地将畅销品放置在离复核台较近的位置,拣货员行走的距离固然会减少,但畅销品所在货架可能会造成拥挤,反而降低拣货效率。因此,提出了仓库分区与商品分级策略,以货格到复核台的距离对仓库库区进行分区,以商品的热销程度、相关性大小进行商品的分区。在此基础上,通过两者的耦合,构建货物分配的优化模型,使得总拣货达到最优。并在此基础上,给出货物存储的原则与货位分配的相关建议。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:(代码和文档not free)

The actual procedure is shown in the screenshot

clear
filename='C:\Users\MR.WEI\Desktop\附件 1:仓库数据.xlsx';
[data1]=importdata(filename);
counter=data1.data.x0x8D270x683C;
spotter=data1.data.x0x590D0x68380x53F0;
indent=data1.textdata.x0x4EFB0x52A10x5355(2:1201,:);
indent_num=data1.data.x0x4EFB0x52A10x5355;
n=size(counter,1);
for i=1:n
str=char(data1.textdata.x0x8D270x683C(i+1,1));
m1=str2num(str(2:4));
m2=str2num(str(5:6));
m3=mod(m1,8);
m4=mod(m3,2);
m5=floor(m1/8);
m6=floor(m1/2);
m7=ceil(m3/2);
if(mod(m1,2)==1)
L(i,1)=counter(i,1)-750;
else
L(i,1)=counter(i,1)+counter(i,3)+750;
end
L(i,2)=counter(i,2)+counter(i,4)/2;
if(m3==0)
L(i,3)=3*15+m2;
else
L(i,3)=(m7-1)*15+m2;
end
if(m4==1)
L(i,4)=m5+m4;
else
L(i,4)=m5+2;
end
L(i,5)=m1;
L(i,6)=m2;
L(i,7)=counter(i,1);
L(i,8)=counter(i,2);
end
for i=3001:3013
if(i<=3008)
L(i,1)=spotter(i-3000,1)+spotter(i-3000,3)/2;
L(i,2)=spotter(i-3000,2)+spotter(i-3000,4);
else
L(i,1)=spotter(i-3000,1)+spotter(i-3000,3);
L(i,2)=spotter(i-3000,2)+spotter(i-3000,4)/2;
end
L(i,7)=spotter(i-3000,1);
L(i,8)=spotter(i-3000,2);
end
dis=zeros(3013);
for i=1:3013
for j=1:3013
if(i<j)
if(i<=3000&&j<=3000)
if(L(i,4)==L(j,4))
dis(i,j)=abs(L(i,2)-L(j,2))+750*2;
elseif(ceil(L(i,3)/15)~=ceil(L(j,3)/15))
dis(i,j)=abs(L(i,1)-L(j,1))+abs(L(i,2)-L(j,2))+750*2;
else
p=L(i,6)+L(j,6);
if(p<=15)
dis(i,j)=abs(L(i,1)-L(j,1))+800*(p-1)+750*4;
else
dis(i,j)=abs(L(i,1)-L(j,1))+800*(31-p)+750*4;
end
end
elseif(i<=3000||j<=3000)
if(i<=3008&&j<=3008)
dis(i,j)=abs(L(i,1)-L(j,1))+abs(L(i,2)-L(j,2))+750;
else
if(L(i,5)==1&&L(i,5)==3&&L(i,5)==5&&L(i,5)==7)
dis(i,j)=abs(L(i,1)-L(j,1))+abs(L(i,2)-L(j,2))+750;
else
d1=abs(L(i,1)-L(j,1))+L(i,6)*800-800/2+750+abs(L(i,2)-(L(i,6)*800-800/2+750)-L(
j,2))+750;
d2=abs(L(i,1)-L(j,1))+(15-L(i,6))*800+800/2+750+abs(L(i,2)-((15-L(i,6))*800+800
/2+750)-L(j,2))+750;
if(d1<d2)
dis(i,j)=d1;
else
dis(i,j)=d2;
end
end
end
else
dis(i,j)=abs(spotter(i-3000,1)-spotter(j-3000,1))+abs(spotter(i-3000,2)-spotter
(j-3000,2));
end
end
end
end
for i=1:3013
for j=1:3013
if(i>j)
dis(i,j)=dis(j,i);
end
end
end
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
  • 0
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
case 2: printf("Please enter the type of product: "); char type2[20]; scanf("%s", type2); printf("Please enter the name of product: "); char name2[20]; scanf("%s", name2); 2021MathorCup数学建模竞赛D是一个钢材切割下料问题。这个问题的 printf("Please enter the quantity of product: "); int quantity2; scanf("%d", &quantity2); printf("主要目标是通过最优化的下料方案,减少钢材的浪费和成本,提高生Please enter the date of sale: "); char date2[20]; scanf("%s", date2); add_sale(type2产效率。 具体来说,这个问题需要考虑以下几个因素: 1. 切割方案:钢, name2, quantity2, date2); break; case 3: query(); break; case 4: save(); break; case 5: sort(); printf("Sort complete.\n"); break; case材可以按照不同的切割方案进行下料,每个方案都有不同的成本和浪费 6: return 0; default: printf("Invalid choice.\n"); break; } } return率。 2. 切割约束:钢材的切割需要满足一定的约束条件,如长度、宽度 0; } ``` 这个代码中,每个产品作为一个结构体,链表中存储的是每、厚度等。 3. 工艺要求:钢材的切割需要满足一定的工艺要求,如个产品的指针。可以通过添加产品和销售记录来修改链表中的数据,查询每种产品的总量表面质量、平整度等。 4. 生产效率:钢材的切割需要考虑生产效率、进日期、销出数量、销售时间等,将数据保存到文件中,以及按照库存数量排序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值