匹配/分配问题

计算科学 优化 算法 近似
2021-11-24 22:21:11

我不确定如何表示和解决以下问题。

我有一个销售列表(时间戳和数量)和相应的库存提取列表(时间戳和数量)。我最终想要实现的是识别销售交易未考虑的库存消耗(即丢失的库存)。为了增加复杂性,抽​​奖可以对应于多于一次的销售,而销售可以对应于多于一次的抽奖(多对多)。

关于我应该如何开始这个的任何想法?

以下是真实数据示例:

在此处输入图像描述

1个回答

您没有说允许抽取库存与销售匹配的条件是什么,但我会假设它是:如果我们希望特定销售与特定销售匹配,时间戳和项目都必须匹配特定的库存抽取。

如果这是正确的,您的问题可以通过 (time,item)-pair 分离:对于出现在数据集中的每个时间戳和每个项目,只查看针对该时间戳和该项目发生的销售和库存抽取,看看是否有的库存抽取无法与销售相匹配;然后继续下一对。这将问题分解为更小的部分。

鉴于您的问题陈述,对于每个 (timestamp,item)-pair,以下算法是您能做的最好的算法:

d1,,dm表示库存抽取的数量(对于那个(时间,项目)对)。s1,,sn表示销售订单的数量(对于那个(时间,项目)对)。然后:

  • 如果d1++dm<s1++sn,您的记录有问题(但没有可疑的库存抽取)。

  • 如果d1++dm=s1++sn,没有什么可疑的。

  • 如果d1++dm>s1++sn,则至少有一个库存抽取是可疑的。实际上,通常没有办法判断哪个库存抽取有问题。更准确地说,让δ=(d1++dm)(s1++sn); 数量总和为的任何抽奖子集δ 可能是可疑的。换句话说,对于任何集合S{1,2,,m}这样iSdi=δ, 集合S可能是可疑的。你可以枚举所有集合S,但通常会有很多集合。你所知道的是,其中一组是一组可疑的库存抽取,但你不知道是哪一组。通常,您无法将手指放在任何一次库存抽奖上并说它绝对有问题或绝对不可疑(您只能说抽奖i如果i存在于所有集合中S这样iSdi=δ; 你只能说drawi如果i不存在于任何这些集合中S)。更糟糕的是,通常会有成倍增加的可能集合S,因此如果您有很多订单,找到所有这些可能需要很长时间。

    因此,实际上,某个项目在某个时间抽取的库存总量超过了该项目当时的销售总量,那么您几乎只能说这些库存抽取中至少有一个看起来可疑;将它们全部标记为人类检查。

为了做得更好,您需要除了时间戳、项目和数量之外的其他信息。例如,您可能有额外的信息,例如物品的价值、进行库存抽取的工人的身份等等——这可能会帮助您做得更好。