最佳订单履行

时间:2013-04-11 08:18:21

标签: algorithm search optimization

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

  1. 它应包含最少数量的仓库
  2. 所有仓库都应尽可能贴近客户。
  3. 任何想法都受到高度赞赏。谢谢!

    UPD:

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

    UPD 2 可用仓库的数量接近15个。所以蛮力在这里没有帮助。

3 个答案:

答案 0 :(得分:10)

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

让项目由i编制索引,仓库由j编制索引。让Qi为购物车中i项的数量,Sij为仓库ij项的数量,Dj为从客户到仓库的距离j

首先找到最小仓库数k。当且仅当仓库xj涉及订单时,才允许二进制变量1jk是此计划的价值。

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”)。

答案 1 :(得分:4)

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

麻省理工学院应用数学规划讲座的

Chapter 9给出了整数规划的一个很好的介绍。在第三页上,您会发现仓库位置问题作为整数编程可解决的问题的示例。请注意,此处描述的问题比您在问题中描述的问题稍微一般:对于您的情况,可以假设仓库始终处于打开状态(y i = 1),并且固定的运营成本在你的情况下,仓库的f i 总是f i = 0。

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

答案 2 :(得分:0)

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

如果订单中有10件商品。

你有9个库存

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

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

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

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

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

如果有,哪些产品可以转让。

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

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

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

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

所以基本上你必须编写代码。

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

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

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