重新排序订单以提高仓库效率

时间:2009-05-15 15:48:13

标签: php algorithm language-agnostic sorting

我正在努力优化我的工作中的订单填写方式。现在,一名员工只获取最新的16个订单(有时是14或18个)并填写它们。

我正在尝试更改它,以便不是简单地按最新的订单列表,而是命令它们,以便每个批次在类似的位置订购。但我无法弄清楚我应该如何排序列表。以下是我想要做的简化示例。

示例订单列表:

  • 在位置E订购1:2个产品,在位置Q订购5个产品
  • 位置Z为2:1,位置B为20
  • 在位置Y中订购3:1,在位置N中订购1
  • 在B地点订购4:3
  • 在位置A订购5:1,在位置E订购10
  • 在位置A订购6:1,在位置B订购1,在位置Q订购5

对列表进行排序后,我希望订单2和4彼此相邻,1和6彼此相邻,等等。这样的事情:

  • 在位置E订购1:2个产品,在位置Q订购5个产品
  • 在位置A订购6:1,在位置B订购1,在位置Q订购5
  • 位置Z为2:1,位置B为20
  • 在B地点订购4:3
  • 在位置Y中订购3:1,在位置N中订购1
  • 在位置A订购5:1,在位置E订购10

我正在使用PHP,但任何语言的任何示例或提示都会非常有用。

编辑:

让我试着更详细地解释一下。员工抓住批量订单,然后他们使用带条形码扫描器的PDA来填写订单。我们的仓库设置为首先是位置A,下一个是B,依此类推。根本没有涉及回溯。一般来说,他们必须走遍整个仓库来填充一批订单,因为平均而言,16个订单将包含来自所有地点的产品。

如果我更改从订单日期到订单产品的位置接下来要填写的订单的分类,那么一批订单可能只有位置AG并且不必走遍整个仓库。


另一个编辑(我真的需要更好地发布好的细节)

这是我们目前的流程:

  1. Picker抓住一个装有16个铲斗的推车
  2. Picker通过PDA(带扫描仪和wifi)将数据桶中的16个独特条形码扫描到网页上,并创建“拣货单”
  3. 产品按地点排序(选择器只能按任何产品行走一次)
  4. 然后,特殊网页会告诉员工哪个产品以及要抓取的数量以及他们扫描产品上的条形码
  5. 然后它会说明要将产品放入哪个桶中,并且他们会扫描他们放入产品的桶中的条形码
  6. 挑选完所有产品后,Picker进入装运站并在其中一个桶中扫描成VB程序(是的,我知道。有一天会被转换)
  7. 为“拣货单”中的所有订单打印收据,并将其放入正确的存储桶
  8. 每个桶都已清空并打包
  9. Picker现在发货人将包装好的订单放在秤上,并将收据上的条形码扫描到一个程序中。
  10. 自动打印正确的邮资,订单标记为已发货,并向客户发送包含跟踪信息的电子邮件
  11. 托运人将邮资标签放在页面上,密封并将其放入成品包装堆中
  12. 在一天结束时,USPS和UPS接收货物。
  13. 我还应该注意,我们的很多/大多数产品都很小,16个订单的“拣货单”可以有500-800件。目前,我们有大约28,000种不同的库存产品。

6 个答案:

答案 0 :(得分:1)

正如我在关于这个问题的评论中所写,我认为你只是以错误的方式看问题。

您的描述意味着他们可以在必须“构建”/完成订单之前到达所有位置。问题是,现在,事情按照订单进行分组,因此他们尝试通过转到所需的所有位置来填充订单#1,然后他们开始查看订单#2等。

相反,您需要根据位置以及他们需要在每个位置获取的内容为他们提供汇总信息。然后他们只需按顺序前往所有位置,然后从每个位置获取所需的一切。当他们去过所有地点时,他们会通过清单填写他们的大量订单。

如果我在这里做了一些不正确的假设,请告诉我,我会尝试采用不同的方法。


只是为了尝试澄清差异,这里是每个方法中员工的动作(前两个不明确,因为他们可能已经按照不同的顺序去了地点,我只是遵循你列出的确切顺序,作为员工可能会)。

按日期排序(12次移动):

E > Q > Z > B > Y > N > B > A > E > A > B > Q

您的重新排序版本(10次移动):

E > Q > A > B > Z > B > Y > N > A > E

按位置汇总(7次移动):

A > B > E > N > Q > Y > Z

为了进一步强调差异,如果我假设您的所有位置与前一个位置等距(因此从A移动到B的成本为1),并且每个字母都有一个位置。假设你们都希望在0号位置开始和结束,你有:

按日期原始排序:移动量= 138
您重新排序的版本:移动量= 138 (这有点令人惊讶)
按位置汇总:移动量= 52

答案 1 :(得分:1)

我认为这里最好的解决方案是分离采摘和包装阶段。

以下是它在我的工作场所的运作方式

  1. 分配了一批订单 (一般基于交付方式 和/或网站订单来自)
  2. 选择器被分配,选择滑动 打印,包含产品列表 和数量(不具体到 顺序)
  3. Picker去挑选,带回来 到车站。
  4. 在PC上扫描项目 通过“结账”流程。这个 确保选择器具有 正确地挑选了一切。
  5. 打印发票
  6. 批次转到打包,每张发票 扫描,然后扫描项目 为了订单,包装,下降 装运箱
  7. 循环订单
  8. 发送完整的批次,电子邮件/短信 对客户说他们的订单是 被派遣
  9. 皇家邮政/其他运输公司 来拿走订单
  10. 我们发现这很有效,特别是每个阶段的确认。

    我们目前正在重新实现PHP中的所有内容,这对我们来说非常有用。

    我的建议是,重新考虑你的工作流程

答案 2 :(得分:1)

问题似乎与自身相矛盾 - 编辑前的第一部分涉及订单的订购,而编辑则讨论了如何获得订单的正确批次给用户。我将假设你的编辑更正确,并讨论批处​​理而不是订购。

听起来,在最坏的情况下,员工需要走遍所有地点(A-Z,我假设),然后返回A开始下一批订单。鉴于这种假设,您似乎只是尝试创建最大位置小于Z的批次。换句话说,如果您有六个订单,则分组为两个批次,如:[A, Y, B, G, Y, Z],您将它们分成[ABG][YYZ]。因此,我认为算法非常简单:

  1. 浏览每个订单并计算最大距离项目。
  2. 按最大位置对订单排序。
  3. 根据此排序返回批次。
  4. 例如,假设我们有四个订单,我们想要从以下两个批次:(A,B),(A,Y),(F,G),(E,P)。然后我们将它们的最大距离项计算为[B,Y,G,P]。排序后,我们最终得到[B,G,P,Y]。因此第一批将包含#1和#3,第二批将包含#2和#4。包含Y的顺序无论如何都必须从A到Y,所以它也需要来自A的项目没有区别;但是通过将#1和#3保持在一起,其中一名员工走得更少。

答案 3 :(得分:0)

使用usort,您可以自定义排序方法。这样,基于数组(列表),您可以比较元素并按照您希望的最佳顺序放置该数组,而不仅限于键或值。您可以使用数组本身中的对象,并确定顺序应该是什么。

答案 4 :(得分:0)

这是一个复杂的问题,听起来像是旅行推销员。

你能做的是:
以所有可能的顺序创建列表 根据每行之间的连接数计算每个列表的分数。

例如: 如果order2后面是order6,则得分为1,因为1个位置(B)重叠。如果下一个订单是order3,则分数将增加0,因为Y或N都不是6。

得分最高的列表是最佳顺序。

列表中的18个元素有18个! = 6402373710000000订购列表的可能方式。 所以我会以随机顺序创建10个20个列表并选择得分最高的列表。

答案 5 :(得分:-1)

您可能缺乏重点:太多细节,例如您使用的编程语言,最终用户使用的PDA /扫描仪等等。

你需要的只是一件事:两个元素的传递性比较(&​​lt;)运算符(传递意味着如果A< B和B< C然后A< C总是)。如果您有此运算符,则需要进行排序。

专注于这一点,如有必要,请回到客户讨论要求。如果定义运算符<太复杂了,无论如何客户都不会满意。