通过向多个买家出售物品,找到最高的总价格,受用户输入的限制,可以进行多少次单独的销售


Find highest total price by selling items to multiple buyers, limited by user input to how many separate sales can be made

编辑:对不起,伙计们,我对这个问题的解释不清楚!这应该更好:

  1. 用户发送文章的ID号和最大数量。捆数

  2. API搜索所有可用的商品价格,并计算最小捆绑数量(限制到最大)的最佳结果。客户提供的号码)ONE Bundle是指交付给一个平台(买方)的一包物品

谢谢!

这是一个有趣的小问题。今天早上我花了几个小时,虽然我没有一个完整的解决方案,我想我有足够的让你开始(我相信这是你所要求的)。

首先,根据你对问题的描述,我假设这些事情:

  • 所有买家对所有商品报价
  • 没有关于物品的假设,它们可能都是不同的
  • 用户只能与有限数量的买家进行交互
  • 用户想要出售每个物品,每个物品给一个买家
  • 用户可以向单个买家出售多个物品

精确解——暴力破解

对于这个问题,首先要意识到的是,对于给定的一组买家,可以直接计算最大总收入,因为您可以为每件商品选择该买家组中最高的报价。把所有这些最高的价格加起来,你就得到了这组买家的最大总收入。

现在你所要做的就是计算每一个可能的买家组合。这是一个基本的组合问题n选k其中n是购买者的总数k是有限的购买者的数量。有一些函数可以生成这些组合的列表(我自己写的……)还有一个用于php的PEAR包)。

一旦你有了每个选择的买家组合的最大总收入,只要选择最大的一个,你就解决了问题。

更优雅的算法?

然而,正如我所说的"蛮力"所暗示的那样,上述方法并不快,而且规模可怕。我的机器内存不足,只有20个买家和20件商品。我相信有更好的算法存在,而且我已经有了一个好的算法,但它并不完美。

这是基于机会成本。我计算每件商品的最高价格和第二高价格之间的差额。这个差额就是没有选择出价最高的买家的机会成本。

然后我选择出价高的买家,机会成本最高(从而避免最坏的机会成本),直到我有k - 1个买家(其中k是我可以选择的最大值)。最后的选择是棘手的,而不是写一个更复杂的算法,我只是运行所有的可能性为最终买家和选择最佳收益。

该策略在大多数情况下选择最佳组合,即使失败了,也不会错过太多。它的可扩展性也相对较好。在小范围内,它比暴力破解快10倍,如果我将所有参数(买家、买家限制和商品)增加4倍,计算时间就会增加20倍。考虑到所涉及的组合数量,这已经相当不错了。

我已经起草了一些代码,但是对于这篇文章来说太长了。如果你感兴趣,请告诉我,我会想办法发给你。

这是一个图问题。它可以用Edmond's Blossom V算法来解决。这是一种匹配算法,用来找到最好的配对,比如在约会程序中。也许你想找一维装箱算法。在一维箱子包装中,你有一个限制物品分配到无限的箱子或架子上,箱子越装满越好。

如果我正确理解了这个问题,它是np完全的,通过最小化集覆盖。我们可以将Set Cover的实例转换为OP问题的实例,如下所示:

设集合Cover的一个实例由大小为n的集合X和子集S_1S_2,…, S_m of X。构造一个OP问题的实例,其中卖方有n物品要卖给m买家,其中买家i对物品j出价1,如果*S_i*包含物品j,否则为0。对于购买者数量受k限制且支付总价为n的OP问题的解对应于具有k集的原始Set Cover问题的解。所以,如果你对OP的问题有一个多项式时间的解,你可以通过连续求解1、2、3等情况来求解最小集覆盖。买家,直到你找到一个总价格等于n的解决方案。