我需要存储一些有关物品,仓库和运输成本的数据
例如,我的商店有一些商品,不同的商品库存,但不一定是所有商品。然后,每个仓库可能会有不同的运输成本,具体取决于它们与目的地的距离。
以此为例
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
}
然而,计算满足订单的最佳仓库似乎很昂贵。现在,当订单进入时,我查找哈希表中的所有项目,以获取每个项目的所有仓库的列表。
然后我可以创建一套所有可能的装运解决方案,然后从中选择最小成本解决方案。这非常慢,因为我必须生成所有可能的运输组合。我有预感有更好的方法可以做到这一点,但似乎无法想出任何东西,有什么我想念的吗?
答案 0 :(得分:1)
您要求的基本上是Set Cover Problem
的教科书定义每个仓库都对应一个子集,而Universe将对应于您需要满足的顺序。遗憾的是,NP-complete和已知算法具有指数复杂性。
您可能会根据问题中的其他约束(或根据您的容错,在同一链接中存在多项式近似值)获得良好的启发式结果。
答案 1 :(得分:1)
我过去没有设计过这样的解决方案,但这是最可行的方法,我将按照下面的说明进行操作。
首先,我将构建一个基础案例,然后我将改进它而不是做 - 提前生成所有可能的运输组合,因为您已经注意到它会很慢。
我们在这里看到的是一个快速的解决方案,除了成本最优外,在实际情况下,您还必须考虑 - 客户满意度。
您的目标是为订单生成Shipment
,基本上是Map<Warehouse,List<Item>>
。
您需要另一张表格来告诉您货件的费用 - Map<Cost,Shipment>
。
<强>基本情况强>
步骤#1。准备所订购目的地距离的所有仓库清单,即从仓库增加距离的排序仓库
步骤#2。首先确定离您目的地最近的仓库
步骤#3。打开在步骤2中检测到的可以从仓库中完成的所有项目
步骤#4。对剩余项目重复步骤2和步骤3,忽略已经看过的仓库
步骤#5。如果没有任何项目,请停止。
经过以上五个步骤后,您将获得base_case货件。
要知道您的基本情况是否是足够好的解决方案,您应该已经有了一个货运启发式功能,可以告诉您公司仓库布局的特定目的地的大致允许费用以及您所覆盖的区域,此时您应该决定是否需要改进基础案例。
如果需要改进,您可以通过将物品从较短距离的仓库移动到较长距离的仓库来创建另一个新货物,只要这样可以节省成本(当然只对于更远的仓库中的可用物品以及如果分组物品的数量增加更远)仓库比较短的一个)。
在五个步骤中,如果客户满意度较高,您可能还会决定在步骤#3 上面运送物品。通常认为客户更友好地快速交付部分物品而不是让他/她等待笨重的包裹。
另外,我认为除了查找表之外,您还不需要任何特定的数据结构。
正如我已经说过的那样,我没有实现任何真实的东西,这只是我的意见。
希望它有所帮助!!