我需要存储一些有关物品,仓库和运输成本的数据

例如,我的商店里有一些物品,而不同的仓库里有它们,尽管不一定是所有物品。然后,根据每个仓库与目的地的距离,每个仓库的运输成本可能不同。

举个例子

warehouse1 : item1, item3, item 5
warehouse2 : item1, item2
warehouse3 : item1, item3, item 4

so if the order consists of (item 1, item 2, item 3)
it can be fulfilled by either warehouse1 + warehouse2, or warehouse3 + warehouse2.
in this case it should choose whichever is cheaper

在这种情况下,我想最小化用于完成订单的仓库数量,并最小化成本。订单可以具有多个不同类型的项目,但它们都将到达同一目的地。

我当时想将所有产品的清单存储为
class Item{
   double price;
   List<Integer> warehouses; //id of all the warehouses that carry this item
}

但是,计算满足订单的最佳仓库似乎很昂贵。现在,当接到订单时,我从哈希表中查找所有项目,以获取每个项目的所有仓库的列表。

然后,我可以创建一组所有可能的装运解决方案,然后从中选择最小成本解决方案。这很慢,因为我必须生成所有可能的运输组合。我有一个预感,有一个更好的方法可以做到这一点,但似乎无法提出任何建议,我缺少什么吗?

最佳答案

我过去没有设计过这样的解决方案,但这是最有可能的方法,我将在下面概述。

首先,我将建立一个基本案例,然后对其进行改进,而不是进行改进-会提前生成所有可能的运输组合,因为您已经注意到它会很慢。

除了使成本最佳化和在实际情况中,我们在这里寻找的也是一种快速解决方案,您还必须考虑-客户满意度

您的目标是生成一个Shipment,它基本上是订单的Map<Warehouse,List<Item>>

您需要另一个表来告知您装运成本-Map<Cost,Shipment>

基本案例

步骤#1。 准备按目的地距离排序的所有仓库的列表,即对仓库进行排序,以增加到仓库的距离的顺序

步骤#2。 首先确定离您的目的地最近的仓库

步骤#3。 删除所有可以从步骤2中检测到的仓库中完成的物品

步骤#4。 对其余项目重复步骤2和步骤3,忽略已经看过的仓库

步骤#5。 如果没有任何项目,则停止。

经过以上五个步骤,您将获得base_case装运。

要知道您的基本案例是否是足够好的解决方案,您应该已经有了一个试探法,可以告诉您特定目的地的大概允许成本,用于公司仓库的布局和覆盖的区域,即此时您应该确定是否需要改进基本情况。

如果需要改进,您可以通过将物料从较短距离的仓库搬到较长距离的仓库来创建另一个新货件,前提是可以节省成本(当然,这仅适用于较远的仓库中可用的物料,并且如果较远的仓库中分组的物料数量比较短的一个)。

在五个步骤中,如果客户满意的话,您可能还决定将产品运送到上面的步骤#3 。通常认为,客户更友好地快速交付部分物品,而不是让他/她等待笨重的包裹。

另外,除了查询表,我认为您不需要任何特定的数据结构。

正如我已经说过的,我还没有真正实现任何东西,这只是我的观点。

希望能帮助到你 !!

10-04 18:23