编辑:对不起,伙计们,我对这个问题的解释不清楚!这应该更好:
-
用户发送文章的ID号和最大数量。捆数
-
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_1, S_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的解决方案。