电子商务:计算折扣的算法

31

我需要专家意见来解决一个棘手的问题。

情景如下:

  • 电子商务网站
  • 大量产品
  • 这些产品上混合了大量折扣

一个产品由唯一的ProductID标识,并拥有销售价格。这是非常经典的场景。同时,该产品也可以参加一个或多个折扣活动。

折扣可以有不同类型。其中之一的例子是:

  • 购买一组产品中的两个或两个以上产品,每个产品享受X%的折扣

一个商品只能获得一个折扣,因此一旦一条线项目被打折,它就不能参加其他折扣。

测试案例数据:

  • Product-1: $10
  • Product-2: $10
  • Product-3: $50
  • Product-4: $100

Discount-A: 购买两个或两个以上产品,以下任意一个产品享受20%的折扣

  • Product-1
  • Product-2
  • Product-3
  • Product-4

Discount-B: 购买该产品并享受以下产品50%的折扣

  • Product-3

测试场景1:

购物篮: 包含如下商品:

  • Product-1
  • Product-3
  • Product-4

计算 #1:

  • Discount-A: Product-1, Product-3, Product-4 = $2 + $10 + $20 = $32
    • = $32 总共节省的金额

计算 #2:

  • Discount-A: Product-2, Product-4 = $2 + $20 = $22
  • Discount-B: Product-3 = $25
    • = $22 + $25 = $47 总共节省

这意味着 折扣-A 折扣-B 的组合将为客户提供最佳可能的折扣。

测试方案2:

购物篮:包含以下线路项目:

  • 产品-3
  • 产品-4

计算#1:

  • 折扣-A:产品-3,产品-4 = $10 + $20 = $30
    • = $30 总共节省

计算#2:

  • 折扣-B:产品-3 = $25
    • = $25 总共节省

这意味着应用 折扣-A 将为客户提供最佳可能的折扣。


为了计算给定篮子的最佳折扣,必须评估所有产品和这些产品上可用的所有折扣的所有组合。

通常篮子中有30-40个行项目,每个行项目都有0-3个折扣。

基本上我陷入了寻找一种有效方式来进行这种计算的困境中。

现在我对应用折扣的算法大致如下:

  • 清除篮子上的折扣
  • 获取篮子中线路项目的所有唯一ProductID
  • 获取这些ProductID的所有可用折扣
  • ForEach折扣(无序)
    • 如果非折扣标记的行项目满足,则应用折扣
      • 将折扣中的行项目标记为已折扣

但是这完全不够,因为它没有尝试不同的行项目/折扣组合。

我一直在寻找可以解决此类问题的标准化算法,但迄今为止没有任何运气。

希望能从您那里听到消息:)


1
解决方案必须达到最佳状态吗?我认为这是NP难题,并且缺乏最优子结构,因此无法通过动态规划来解决。当然,暴力破解很简单,但是对于30-40个带有少量折扣的项目,这并不是一个好的选择。 - svinja
1
除非折扣比目前看起来更简单,否则它通过集合覆盖的缩减是NP难问题。 “折扣可以有不同类型”,您能告诉我们所有不同类型的折扣吗? - David Eisenstat
1个回答

13
假设:
1. 您可以根据您的购物篮计算出所有可用的折扣。 2. 每个产品只能应用一个折扣。 3. 每个折扣只能使用一次。
那么这个问题就变成了一个称为assignment问题,可以使用Hungarian algorithm在O(n^3)的时间复杂度内得到最优解。
您需要计算一个矩阵M[a,b],其中包含如果在产品b上使用折扣a所节省的金额。(如果不适用折扣,则将节省的金额设置为0。)
匈牙利算法将计算分配折扣给产品以节省最多资金的方法。
如果您没有相同数量的折扣和产品,则添加虚拟折扣(节省为零)或虚拟产品(同样为零)直到折扣数量与产品数量相匹配。

嗨,彼得,这看起来非常有前途!非常感谢你的贡献。我会让这个问题保持开放状态几天,以查看是否收到更多的意见。我不会忘记将其标记为已回答。谢谢。 - Brian Holmgård Kristensen
@BrianHolmgårdKristensen 对于您的产品3和产品4的购物篮,这将提供45美元的折扣 - 通过B对产品3进行25美元的折扣,并通过A对产品4进行20美元的折扣,使用产品3来触发但不接收第二个折扣。 - David Eisenstat
@David - 谢谢,你说得很对 - 我把限制理解为仅将折扣应用于非折扣产品,但我错过了另外一个限制,即折扣只能来自非折扣产品。 - Peter de Rivaz
最后一个限制对算法有什么影响?如果您只能基于尚未包含在其他折扣中的产品生成折扣,则无法直接使用您的答案。 - Marius
@PeterdeRivaz,你能解决这个问题吗?我卡在同一个点了。 - Hasmukh Rathod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接