我正在努力优化我的工作中的订单填写方式。现在,一名员工只获取最新的16个订单(有时是14或18个)并填写它们。
我正在尝试更改它,以便不是简单地按最新的订单列表,而是命令它们,以便每个批次在类似的位置订购。但我无法弄清楚我应该如何排序列表。以下是我想要做的简化示例。
示例订单列表:
对列表进行排序后,我希望订单2和4彼此相邻,1和6彼此相邻,等等。这样的事情:
我正在使用PHP,但任何语言的任何示例或提示都会非常有用。
编辑:
让我试着更详细地解释一下。员工抓住批量订单,然后他们使用带条形码扫描器的PDA来填写订单。我们的仓库设置为首先是位置A,下一个是B,依此类推。根本没有涉及回溯。一般来说,他们必须走遍整个仓库来填充一批订单,因为平均而言,16个订单将包含来自所有地点的产品。
如果我更改从订单日期到订单产品的位置接下来要填写的订单的分类,那么一批订单可能只有位置AG并且不必走遍整个仓库。
另一个编辑(我真的需要更好地发布好的细节)
这是我们目前的流程:
我还应该注意,我们的很多/大多数产品都很小,16个订单的“拣货单”可以有500-800件。目前,我们有大约28,000种不同的库存产品。
答案 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)
我认为这里最好的解决方案是分离采摘和包装阶段。
以下是它在我的工作场所的运作方式
我们发现这很有效,特别是每个阶段的确认。
我们目前正在重新实现PHP中的所有内容,这对我们来说非常有用。
我的建议是,重新考虑你的工作流程
答案 2 :(得分:1)
问题似乎与自身相矛盾 - 编辑前的第一部分涉及订单的订购,而编辑则讨论了如何获得订单的正确批次给用户。我将假设你的编辑更正确,并讨论批处理而不是订购。
听起来,在最坏的情况下,员工需要走遍所有地点(A-Z,我假设),然后返回A开始下一批订单。鉴于这种假设,您似乎只是尝试创建最大位置小于Z的批次。换句话说,如果您有六个订单,则分组为两个批次,如:[A, Y, B, G, Y, Z]
,您将它们分成[ABG]
和[YYZ]
。因此,我认为算法非常简单:
例如,假设我们有四个订单,我们想要从以下两个批次:(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 /扫描仪等等。
你需要的只是一件事:两个元素的传递性比较(<)运算符(传递意味着如果A< B和B< C然后A< C总是)。如果您有此运算符,则需要进行排序。
专注于这一点,如有必要,请回到客户讨论要求。如果定义运算符<太复杂了,无论如何客户都不会满意。