问题 最佳订单履行


我有以下问题。用户有购物车 N 其中的物品。有数量 Q 每个项目。此外,还有 P 仓库,每个仓库都有一定的库存水平(可能是0)。每个仓库和客户之间的距离也是已知的。我需要找到一组可以容纳订单并满足以下约束的仓库(按降低优先级排序):

  1. 它应该包含最少数量的仓库
  2. 所有仓库都应尽可能贴近客户。

任何想法都受到高度赞赏。谢谢!

UPD:

如果一个仓库无法完全满足某些项目,那么它可以由几个不同的仓库交付。例如。我们需要10个苹果,我们有2个库存水平为7和3的仓库。然后这两个仓库将提供苹果(总共提供10个)。

UPD 2 可用仓库的数量接近15个。所以蛮力无济于事。


12834
2018-04-11 08:18


起源

您需要指定更多:如果客户订购数量会发生什么 Q 高于库存水平 S 一些仓库?另一个仓库是否必须全部交付 Q 物品,或者他们可以共享订单(即第一个仓库发送 S 物品,另一个 Q-S? - blubb


答案:


我建议选择David Eisenstat的解决方案。如果您想了解更多有关该主题或需要实现自己解决整数程序的算法,我可以推荐以下参考:

第9章 麻省理工学院应用数学编程讲座给出了整数编程的一个很好的介绍。在第三页,您找到了 仓库位置问题 作为整数编程可解决的问题的一个例子。请注意,那里描述的问题比您在问题中描述的问题略胜一筹:对于您的情况,可以假设仓库始终处于打开状态(y一世 = 1),以及固定的运营成本f一世 仓库总是f一世 在你的情况下= 0。

本章的其余部分将详细介绍整数编程,并重点介绍解决整数程序的各种方法。


3
2018-04-16 11:14



谢谢你的参考 - Volodymyr Rudyi
@volodymyr:很高兴我能帮到你!也谢谢你 :) - blubb
@blubb:对于这​​个问题,有没有一个已实现的解决方案,你现在知道吗? - Shiv4nsh


这可以通过整数编程来解决。

让项目编入索引 i 和仓库索引 j。让 Qi 是项目的数量 i 在购物车和 Sij 是项目的数量 i 在仓库 j 和 Dj 是客户到仓库的距离 j

首先找到最小仓库数量 k。让二进制变量 xj 是 1 当且仅当仓库 j 参与订单。 k 是这个计划的价值。

minimize sum over j of xj
subject to
for all i, (sum over j of min(Sij, Qi) * xj) >= Qi
for all j, xj in {0, 1}

第二个找到最近的仓库。我假设我们想要最小化距离的总和。

minimize sum over j of Dj * xj
subject to
for all i, (sum over j of min(Sij, Qi) * xj) >= Qi
(sum over j of xj) <= k
for all j, xj in {0, 1}

有许多不同的库来解决整数程序,一些免费/开源。他们通常接受的程序格式与我在此处介绍的格式相似但更受限制。你必须自己编写一些代码来扩展总和和通用量词(“for all”)。


10
2018-04-11 13:45



谢谢。也许您可以建议一些文章/教程/书籍以更好地理解这个主题? - Volodymyr Rudyi
对不起,我从一个没有使用教科书的课上学到了这些材料。 - David Eisenstat
@DavidEisenstat这个材料来自哪个课程? - dandice
@Shahbaz是的,我也参加过算法课。只要避免NP硬度降低所使用的小工具,整数编程就会非常有效。 - David Eisenstat
@dandybreath我引起了我的注意,Van Hentenryck教授正在教授一个 Coursera上的258版本。 - David Eisenstat


您可能有也可能不喜欢这样,但我有仓储和订单履行处理经验。我个人的真实生活经历并不需要算法,而是需要一系列仓库和客户服务支持工具(希望这对您和其他在仓储运营开发领域苦苦挣扎的人来说都是值得思考的):

如果订单上有10件商品。

你有9个库存

你在一个位置有5个,在另一个位置有4个。

你拆分了订单。无法履行的1个产品成为“后退订单”。它可以取消,因为您不知道您或您的供应商何时交付。请务必注意您的信用卡授权参考。

剩余的9个(可执行产品)库存将针对您的仓储虚拟库存进行查询,以获得最佳组合。

在我们的例子中,我们做了三件事:

仓库X的履行人员可以轻松地从另一个仓库转移物品吗?是/否

如果是这样哪种产品可以转让。

这可能需要基于仓库负载和功能的人工交互。

如果您严格要求自动化和虚拟库存日复一日地波动,那么您可以根据仓库库存进行最佳猜测。

接下来,将订单拆分为两个,并引用纸质路径的主要订单。

然后,您打印到目的地并希望他们能够履行,如果他们不能,那么希望他们可以部分履行订单并生成可以根据客户的要求取消的订单。

所以基本上这就是你需要编写的代码。

订购  乍看之下订单拆分并参考主订单。  库存仓库塞尺功能。  基于虚拟库存的加权拆分订单,参考基于仓库功能的主订单,从其他仓库检索产品。  打印选择页面(仓库功能)  后退订单或部分履行手册功能(客户服务工具)  只标记出货时标记为已装运的货物。

注意事项:  确保主要订单引用操作后退和拆分。  确保拆分和部分履行订单引用任何其他延期订单和拆分。  尽你所能  标记已发货。  在发货的产品上收集$$$。

希望这有帮助,祝你好运!


0
2018-04-16 16:23