【问题标题】:algorithm tipping point算法临界点
【发布时间】:2013-04-12 15:48:28
【问题描述】:

我是一个完整的算法笨蛋,我有这个问题,我需要找到购买未知数量的小部件的最低成本,无论是按单价还是通过批量购买 x 个小部件......一个例子会帮助我'我确定:-

1) 小部件每单位价格为 0.05 美元 2) 小部件批次的价格为每 100 个小部件 4.00 美元

假设我想购买 140 个小部件 -

a) 按单位计算的成本是 140 x $0.05c => $7.00 b) 按批次计算的成本是 2 批 100 个 @ 4.00 美元 => 8.00 美元(可以忽略多余的 60 个小部件)

所以在这种情况下按单位购买会便宜 1.00 美元

但是,如果我想购买 190 个小部件,那么 -

a) 按单位计算的成本是 190 x $0.05c => $9.50 b) 按批次计算的成本是 2 批 100 个 @ 4.00 美元 => 8.00 美元(可以忽略多余的 10 个小部件)

这种情况下批量购买价格更便宜……

所以我需要找出如何以编程方式找出两种方法之间的“临界点”在哪里以获得最便宜的价格。

我希望我已经解释清楚了,我确信这是一个简单的答案,但我的大脑今天已经快速消退了!

TIA

编辑::

好的,抱歉——我意识到我没有像我应该的那样清楚——正如有人指出的那样,批次和单位的混合也是可能的,因此对于 140 个小部件示例,它也可能是 1 个批次和 40 个单位.

我想要实现的是以编程方式找到购买 X 个小部件的最便宜方式,每个小部件的价格为 $XX,并且还给出了一批价格为 $YY 的 NN 个小部件。

购买批次的任何多余小部件都没有问题,即它可以超过购买的 X,但不能少于 X

因此,对于 140 个示例,1 批 @ 4.00 美元 + 40 个单位 @ 0.05 美元 => 6.00 美元,这是我认为最便宜的。和 对于 190 个示例,我认为 2 批仍然是最便宜的,因为 1 批 + 90 个单位是 8.50 美元...

我希望有一些简洁的方程式可以做到这一点:)

【问题讨论】:

  • 请详细说明您的问题..

标签: algorithm


【解决方案1】:

我在 python 中编写了一个基本的蛮力样式脚本来比较两个选项的价格(最多 1000 个元素)。这不是最快也不是最优雅的方法,但它似乎有效。

输出的格式是:(<unit-count>, (<per-unit-cost>, <per-batch-cost>))

import math
import itertools
import pprint

unitList = range(1000)
pricePerUnit = .05
pricePerBatch = 4.0
numberPerBatch = 100.0

def calculatePerUnit(units):
  """ Calculate the price of buying per unit
  """
  return units * pricePerUnit

def calculatePerBatch(units):
  """ Calculate the price of buying per batch
  """
  return math.ceil(units / numberPerBatch) * pricePerBatch

def main():
  """ Execute the script
  """
  perUnit = map(calculatePerUnit, unitList)
  perBatch = map(calculatePerBatch, unitList)
  comparisonList = zip(perUnit, perBatch)
  perUnitCheaperPriceList = list(itertools.ifilter(lambda x: x[0] < x[1], comparisonList))
  perUnitCheaperUnitList = map(lambda x: int(x[0] / .05), perUnitCheaperPriceList)                                                                              
  pprint.pprint(zip(perUnitCheaperUnitList, perUnitCheaperPriceList))

if __name__=="__main__":
  main()

结果:

[gizmo@test ~]$ python TippingPoint.py 
[(1, (0.050000000000000003, 4.0)),
 ... These are sequential values I left out for brevity ...
 (79, (3.9500000000000002, 4.0)),
 (101, (5.0500000000000007, 8.0)),
 ... These are sequential values I left out for brevity ...
 (159, (7.9500000000000002, 8.0)),
 (201, (10.050000000000001, 12.0)),
 ... These are sequential values I left out for brevity ...
 (239, (11.950000000000001, 12.0)),
 (301, (15.050000000000001, 16.0)),
 ... These are sequential values I left out for brevity ...
 (319, (15.950000000000001, 16.0))]

【讨论】:

    【解决方案2】:

    如果您反过来想,这个问题的答案非常简单。您已经知道价格的“临界点”。它是 8.00 美元。你不知道的是那个以单位为单位的点,即 8.00 美元除以 0.05 美元(每单位)=> 160 个单位。

    请注意,也有机会以 4.00 美元购买 100 件,以 0.05 美元购买 60 件,总计 7.00 美元。这是您可能考虑也可能不考虑的第三种可能性。

    编辑:编辑后,事情变得更加简单:

    您在 $XX 有 1 件商品,在 $YY 有一批 NN 件商品。假设 $YY/NN

    1. 将目标数量除以 NN,然后四舍五入。您将必须购买此数量的批次
    2. 将剩余数量乘以 $XX。如果超过 $YY,只需购买额外的批次,否则以 $XX 购买剩余数量

    【讨论】:

    • 我不确定这是否 100% 正确。例如,在 319 个单位时,每单位选项的成本为 15.95 美元,而每批选项的成本为 16 美元。可能有多个临界点。
    • 是的,很可能有多个临界点,上面的例子是 100 到 200 个单位之间的那个。介于 200 和 300 之间的是 $12/0.05=240,最后一个是 $16/0.05 = 320。没有比这更高的了,因为只需 20 美元,您就可以“免费”获得一批额外的批次(500 对 400)
    • 感谢您的回复——我已经对我原来的问题进行了一些澄清——绝对允许混合单位/批次......对于不清楚的原始帖子感到抱歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多