欢迎访问无锡华德仓储设备有限公司官方网站!网站地图

多批次的订单分拣系统货架分配算法是怎么样的?

人气:191 发布时间:2024-08-18

  小弟供职于某电商公司,公司有自己的加工中心,加工中心的重要职责之一就是根据收到的订单,为客户分拣打包好每个订单中包含的产品。常规分拣流程:每天结单后,系统会统计好当天所有订单中包含的所有产品,并分别放入分拣货架,一个货架放置一种产品。例--------------------------------------------------------------当天供有4个订单:订单1(包含产品,Ax1、Bx3、Cx2、Dx4)订单2(包含产品,Bx2、Cx3、Dx2、Ex2)订单3(包含产品,Cx2、Dx4、Ex2、Fx2)订单4(包含产品,Ax1、Bx3、Cx2、Dx2)那么,系统会统计出:当天所有订单共包含产品:Ax1、Bx8、Cx9、Dx12、Ex4、Fx2,转运工会将这些产品按指定数量分别放置到6个货架上分拣工每拿到一个订单,分拣货架上相应产品的货架格子灯会亮起,分拣工根据亮灯情况将产品放入该订单盒子,完成一次分拣---------------------------------------------------------------------------------目前的问题来了,之前公司有100个分拣货架。当天订单产品种数之和小于100时,这套系统工作正常没有问题,但是随着公司业务量的不断增大,每天的订单产品种数总和一但大于100时,系统肯定无法工作了。最简单的办法就是增加物理货架的个数,但由于场地等其他原因,投入非常巨大,并且物流货架也不可能无限制的增加,所以我们想通过软件算法去解决这个问题,我相信业内一定有同样的处理办法,思路如下:例:系统将每天的订单分为多个批次,保证每个批次的订单所包含产品种类小于或等于100,且这批订单中包含的种数小于或等于100种,这样以后无论产品种数怎么提升无非就是订单分解成几批次的问题了。但是目前困扰的就是这个最优算法改怎么写?例:今天所有订单产品类目总和是170种,共100个订单,每个订单中包含的产品及数量是已知的,只有100个分拣货架。求解:将这些订单拆分成几个批次(批次数越小越好,减少转运次数),每个批次的订单包含的产品种数小于或等于100,那么应该怎么分?每个批次应该具体是哪些订单?求一个最优解该算法已经超出小弟知识范围,请数学大牛支招----万分感谢!

  我还没能解决题主的问题。说一下我到目前为止的思路吧,权当抛砖引玉。我甚至都不保证我思考的方向是正确的。

  首先,既然货架的容量可以当作无限大(见原题评论),那么,每个订单中每种产品的数量就不重要了,重要的只是有无。于是可以用一个0/1向量表示一个订单,向量的长度是所有产品的种类数,向量中的1表示订单中有这种产品,0表示没有。所有订单的向量可以排成矩阵,例如:

  第一行表示1号订单中有2、3、5号产品,以此类推。

  现在假设只有3个货架(100太大了,画不来……),那么上边这批订单可以这样处理:

  1) 先用3个货架分别装1、2、5号产品,搞定2、3号订单;

  2) 再用3个货架分别装2、3、5号产品,搞定1号订单;

  3) 最后用3个货架分别装3、4、5号产品,搞定4号订单。

  这样总共需要3个批次。

  把上面的矩阵的行列交换一下次序,让新矩阵的每行分别对应原矩阵的第2、3、1、4行,每列分别对应原矩阵的第1、2、5、3、4列(即按照处理订单和产品的顺序排列),可以看得更清晰:

  矩阵沿对角线形成三个块(前两行是一个块,排版比较困难……),各块之间没有重叠的行,每个块的宽度都是3(货架数目),且从左向右排列。每个块代表一个批次。

  我对原问题的建模就是:寻找一种交换订单矩阵各行各列的方法,使得交换后的矩阵能够划分成尽可能少的块。

  然后我发现我不会解这个问题……

  ==========================

  然后题主又提出说,可以把包含产品种类比较多的订单拆开。

  这样的话,就又有一种思路:不是按行分批,而是按列分批,像这样:

  竖线左右分别是两批,但是这样有两个订单被拆了。

  与之前的思路相比,这种思路要求解的问题有两点不同:

  1) 只需要考虑交换各列,不需要考虑交换各行(虽然把矩阵排成对角的样子思考更方便);

  2) 目标函数要综合考虑批数和被拆开的订单数了。

  很不幸,这个问题我也不知道怎么解……

  谢邀。

  也感谢 @王赟 Maigo

  写的答案,已经建立了一个很好的模型。看了问题评论,题主表示「拆单的问题可以忽略不计」,所以接下来就只讨论第一种模型。

  这里我在王赟同学的模型基础上,再把问题重新描述一下:

  设,用来表示所有的订单,每一行表示一个订单,一个订单里需要的物品,就在相应的列上置1,否则就是0,比如(还是拿王赟同学的例子)

  第一行表示1号订单中有2、3、5号产品,以此类推。按照题主的假设,没有拆单,也就是说D矩阵每一行的元素加起来,不会超过货架个数(我们设为 k 吧)

  现在我做一点操作,怎么操作呢,就是在某些元素的位置上加1。比如我在第2行最后一个元素位置上加1,于是第2行和第3行就变成一样了:

  这样我们就可以看出来,第1行可以单独成为一批,第2行和第3行可以合并为一批,第4行还是单独一批。并且很容易看出,在某些位置加1的这个操作,对订单分批来说,是没有影响的。

  那么A矩阵为什么就可以分为这样3批呢?因为A矩阵的秩(rank)是3,也就是说,A矩阵的秩是多少,就可以分为多少批。

  所以我们的目标就明确了:需要做一些操作,在原始矩阵的某些位置上加1,使得结果的矩阵的秩(rank)要越小越好,当然,A矩阵每一行的元素加起来不能超过货架个数(也就是 k)

  用数学式子表达出来,就是(对矩阵E的约束做了松弛):

  其中,

  这就转化为一个优化问题了,不过很遗憾,这个优化问题是不好求解的(我没仔细证明过是不是NP,在E矩阵满足原始约束的情况下应该是对的,松弛之后我不能确定,但至少是非凸的,这就不好求解了)

  虽然严格求解不好解,但是我们可以求一个近似解。我们可以用核范数(nuclear norm)来近似秩(rank),也就是把优化的目标函数变成:

  这就变成一个凸优化问题了,就可以有很多有效的方法快速地进行求解!

  比如用 Boyd 教授开发的 CVX 工具包(CVX: Matlab Software for Disciplined Convex Programming

  ),几行代码就搞定了

  这里 matA 就是最后的结果,把 matA 里重复的行去掉,每一行就是一个批次了!每一行里面的1就是要取的物品。

  这虽然是松弛了目标函数之后得到的近似解,但是在实际应用中应该也足够用了。

  为什么要一个品种一个货架呢? 把一定量的订单汇总后,把订单内的所有品种拣在同一货架或容器里,在分拣到对应的订单中去

  医用试剂瓶如何分拣?人工分拣?耗时耗力!马克拉伯机器视觉免费软件SGVision轻松解决,采用的算法为形状匹配与像素统计的调用。

  下方链接进入马克拉伯学院马克拉伯,一个机器视觉应用开放社区

  医用试剂瓶分拣(原图)

  一、 检测与实现功能

  本案例通过调用相应算法实现不同试剂瓶的分拣。

  二、 检测系统需求分析

  1.为了获得最优的打光效果,这里选用背光源从下往上打光;

  2.为了达到检测要求,这里选用500W黑白网口相机,工业高像素级25mm定焦镜头;

  注意:这里背光源打光,所以不需要调整光源角度。我们所须要注意的是相机焦距和物距的调整以及相机参数的设置,将样品尽量调整到清晰。

  三、检测具体步骤

  1.调用形状匹配算法,选择样品1进行形状匹配,选中你想测试的区域并设置模板待用。如下图: 图一

  注意:这里调用形状匹配主要是为了给样品做一个位置配准,右边参数要调整好,这样才能准确找到样品位置并做纠正。

  2.调用像素统计算法,框选样品1,并设置相应合格范围。图二

  注意:匹配源一定要选择我们设置的形状匹配,合格标准一定要设置在样品检测结果范围内。不然会显示NG

  3.点击测试,区分出样品1和样品2: 图三 OK图,即样品1图四 ok图 样品1图五 OK图样品1图六NG图样品2图七 NG图 样品2

  所有算法设置完,点击右下方的测试按钮,检测所有算法设置是否无错误,若无,点击确定退回主界面,点击主界面“检测”按钮即可开始检测产品。