Algorithm 如何找到一副收藏卡的最佳价格? 或者旅行推销员玩魔术!

Algorithm 如何找到一副收藏卡的最佳价格? 或者旅行推销员玩魔术!,algorithm,combinatorics,Algorithm,Combinatorics,我认为这是一个相当有趣的算法挑战。好奇是否有人对解决它有什么好的建议,或者它是否已经以一种已知的方式解决了 销售各种游戏的收藏卡,包括魔术聚会。他们不只是从库存中销售卡片,而是从多个供应商(50+以上)那里转售。每个供应商都有不同的卡片库存,每张卡片的价格也不同。每个供应商还对运输收取统一费率(通常)。考虑到所有这些,如何找到一副牌(比如40-100张)的最佳价格 仅仅为每张卡找到最优惠的价格是行不通的,因为如果你从10个不同的供应商订购10张卡,那么你将支付10倍的运费,但是如果你从一个供应商

我认为这是一个相当有趣的算法挑战。好奇是否有人对解决它有什么好的建议,或者它是否已经以一种已知的方式解决了

销售各种游戏的收藏卡,包括魔术聚会。他们不只是从库存中销售卡片,而是从多个供应商(50+以上)那里转售。每个供应商都有不同的卡片库存,每张卡片的价格也不同。每个供应商还对运输收取统一费率(通常)。考虑到所有这些,如何找到一副牌(比如40-100张)的最佳价格

仅仅为每张卡找到最优惠的价格是行不通的,因为如果你从10个不同的供应商订购10张卡,那么你将支付10倍的运费,但是如果你从一个供应商订购全部10张卡,那么你只支付一次运费

前几天晚上,我编写了一个简单的HTML刮板(使用),它获取每张卡的所有不同价格,然后找到所有在卡片组中携带所有卡片的供应商,汇总每个供应商的卡片价格,并按价格排序。那真的很容易。最终总价格接近所有卡的总中间价

我确实注意到,一些单独的卡最终远高于中间价。这就提出了将订单拆分到多个供应商的问题,但前提是拆分订单可以节省足够的成本,以支付额外的运费(每个新增的供应商都会增加另一笔运费)

从逻辑上看,最好的价格可能只涉及几个不同的供应商,但如果这些卡足够昂贵()那么从理论上讲,从不同的供应商订购每一张卡仍然可以节省足够的成本,以证明所有额外的运输是合理的

如果你要解决这个问题,你会怎么做?纯蛮力计算卡/供应商组合的所有可能组合?在我有生之年更有可能完成的一个过程似乎涉及到在固定的迭代次数上进行一系列有条理的估计。我有一些想法,但我很好奇其他人会提出什么建议

我更多的是寻找算法,而不是实际的代码。如果有什么不同的话,我现在正在使用.NET


我会很贪婪

假设你将承担运费,并从所有供应商处购买。计算出你得到的绝对最低价格。然后针对每个供应商,计算出能够从他们那里购买一些卡片与从其他人那里购买卡片相比能为你节省多少钱。通过运输订购供应商-增量节约

从提供最小价值的供应商开始,砍掉该供应商,将其卡重新分配给其他供应商,并重新计算增量节约。清洗,漂洗,然后重复,直到你最边缘的供应商为你省钱


这应该能找到一个好的解决方案,但不能保证能找到最好的解决方案。然而,找到绝对最佳的解决方案似乎是NP难的。

我自己也曾思考过这一点。考虑以下事项:

如果你花了一周的时间才弄明白, 代码、调试和算法 只提供1%的折扣,好吗 怎么办

答案可能是“不”(除非你把毕生积蓄都花在了纸牌上,在这种情况下,你可能是疯了)。。。或者亚马逊网站

因此,已有一种简单的近似算法:

Wait until you're buying lots of cards (reduce the shipping overhead).
Buy the cards from 3 vendors:
    - the two with the cheapest-but-most-diverse inventories
    - a third which isn't really cheap but definitely has every card you'd want.
Optimize accordingly (for each card, buy from the cheaper one).
Also consider local vendors you could just walk to, pre-constructed decks, and trading.
根据第一手和第二手的经验,我可以说,你会发现,你可以得到中位数的价格,也许你可以多付几美元的运费,而每一个仍然在中位数左右。你会发现,你可能需要为库存不足的信用卡多付一点钱,但这将是少之又少,运费节省将弥补这一点

我想起了一句古老的编程格言:“永远不要优化,除非它是绝对必要的;很可能你不需要优化,或者优化了错误的东西。”(例如,你的时间也是一种资源,也有金钱价值)

编辑:考虑到这一点,这是一个非常酷的问题,如果有时间,应该解决它。

有趣的问题!:)

因此,如果我们有n张卡和m个供应商,蛮力方法可能需要检查多达n^m个组合,对吗(因为不是每个供应商都有每张卡,所以要少一点,但我想这在总体方案中并不重要;)

让我们先假设每个供应商都有每张卡,然后看看如果他们没有,情况会如何变化

  • 找到最便宜的单一供应商解决方案
  • 按价格订购卡,在其他供应商处找到最贵且更便宜的卡
  • 对于来自供应商1的所有卡,如果它们在那里更便宜,请将它们移动到供应商2
  • 如果添加了供应商2并没有降低订单的成本,请撤消并终止订单,否则重复步骤2
  • 因此,如果一个供应商没有所有的卡,你必须从多供应商的情况开始。对于每个供应商,您可以从购买所有存在的卡开始,然后将算法应用于剩余的卡

    显然,您可能无法利用此方法定价中的所有细微之处。但是如果我们假设大部分的价格差异是由个别的高价卡构成的,我认为你可以通过这种方式找到一个合理的解决方案


    在写了这些之后,我意识到,n^m假设实际上是错误的。 一旦您选择了一组供应商进行购买,您只需为每张卡选择最便宜的供应商即可。这是一个很大的优势,因为在哪里购买每张卡的个人选择不会相互干扰

    这对我们的问题意味着什么?从第一眼来看,这意味着经销商的选择是一个问题(长期而言)