动态定价计算,其中每个单元逐渐变得比之前的单元便宜

时间:2016-05-23 16:37:38

标签: php algorithm math

我正试图想出一个优雅的方法来做到这一点,到目前为止我失败了。这个想法很简单:

目前,我有一种分层定价方法。

  • 1-10,000 @ $ 0.007
  • 10,001-100,000 @ $ 0.005
  • 100,001-1,000,000 @ $ 0.003
  • 1,000,001+ @ $ 0.002

我想做的是1美元在0.007美元和1,000,000美元在0.002美元,其中每一个从1到1,000,000逐渐便宜而没有10k,100k和1m的硬停止。

每次我想我拥有它,我最终都会离开。这就是我现在所拥有的:

function getCost($units)
{
    $min            = 0.002;
    $max            = 0.007;
    $limit          = 1000000;

    if($units < $limit)
    {
        $pricePerUnit = (($limit - $units) / $limit * ($max - $min)) + $min;
    } else {
        $pricePerUnit = $min;
    }

    return $pricePerUnit * $units;
}

随着我越来越接近门槛,事情变得越来越便宜了,所以这个转折点最终总体价格越低,我添加的单位就越多,而这根本不是我想要的。

我知道有一种非常优雅的方式可以做到这一点,但我没有。我正在寻找其他人,至少指出我正确的方向。

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用以下方法:

  • 1个单位的总价为0.007美元。

  • 1,000,000单位的总价格为0.002 * 1,000,000 = 2,000美元。

在两者之间,对于N个单位,使用总价格 N中的线性表达式:

totalPrice = N * a + b. 

N个单位,每单位价格为pricePerUnit = totalPrice / N = a + b / N

我们有1和1,000,000件物品的总价格:

        1 * a + b = $    0.007
1,000,000 * a + b = $2,000

因此,我们可以找到ab

a = $1,999.993 / 999,999 = $0.00199999499
b = $0.007 - a = $0.00500000501

因此,对于N单位,每单位的价格为:

price = $0.00199999499 + ($0.00500000501 / N)

编辑:正如@ user3386109的评论中指出的那样,1/N减少太快了。要解决此类问题,可以在N上使用缓慢递减的表达式来表示每单位的价格。一个变体类似pricePerUnit = a + b / (1 + log N)ab适当地找到,以便我们匹配1和1,000,000的所需价格。

这个选择导致

a +   1 * b = $0.007
a + 1/6 * b = $0.002

这意味着pricePerUnit = $0.001 + $0.006 / (1 + log N)

答案 1 :(得分:0)

根据您给出的示例定价,我认为您将会有&#34;临界点&#34;如果你的目标是在音量上升时重新定价所有单位。

例如

  500,000 @ $.0045 = $2,250 (.0045 is half way between .002 and .007)
1,000,000 @ $.002  = $2,000

相反,如果每个单位都有自己的折扣价,我认为这些数字按您想要的方式运作。第一个单位成本为0.007,额外单位成本逐渐减少,但第一个单位的成本总是为0.007。

(此定价符合OP的评论&#34;我们说我有10件商品。第一件商品是10美元。如果你买2件,我会以9美元的价格卖给你第二件。第三个是8美元,......&#34;以及问题标题&#34;每个单元变得越来越便宜&#34;。

我认为您需要找到售出的第一个单位(最高价)和最后一个单位的价格,然后取平均值来查找每单位的价格。

对于小于限额的单位数量,最后售出单位的折扣是乘以每个单位的增量折扣的单位数。

$min = .002;
$max = .007;
$limit = 1000000;

$priceDiff = $max - $min;
$discountPerUnit = $priceDiff / $limit;
$discount = ($units - 1) * $discountPerUnit;
$priceLast = $max - $discount;
$pricePerUnit = ($max + $priceLast) / 2;

如果单位数量超过限制,你可以获得上述第一百万(或任何限制)以及每单位超过限制的.002。

答案 2 :(得分:0)

这是我能做的最好的事情

enter image description here

在C代码中:

double total_cost = pow( 6.57, log10(3.88 * N) ) / 96.7;

下面是各种数量的总成本表。第二列是基于分层定价的预期总成本,最后一列是基于公式的总成本。

      1    0.01    0.03
      3    0.02    0.08
     10    0.07    0.21
     30    0.21    0.51
    100    0.70    1.35
    300    2.10    3.32
   1000    7.00    8.89
   3000   21.00   21.82
  10000   50.00   58.38
  30000  150.00  143.32
 100000  300.00  383.54
 300000  900.00  941.64
1000000 2000.00 2519.85
3000000 6000.00 6186.60

它有点偏高,但有一点额外的利润有什么不妥:)