【问题标题】:Combinations of "products" to form a sales promotion组合“产品”,形成促销
【发布时间】:2012-11-26 11:21:22
【问题描述】:

我正在重新开发一个旧系统,将 一篮子 用户选择的零售产品 匹配为一个或多个有效的促销。这些促销是行业标准的BOGOF(买一送一),买二送三,购买产品X和Y并获得10%的折扣等......但都要求您可以将潜在商品列表过滤到那些满足这些促销活动。

我希望解决方案能够在一次操作中获取整个购物篮零售商品并对其进行分析,而不是在订购时匹配单个产品的现行方法。 (当前的解决方案会导致不良的限制)

每个促销活动都有一系列符合条件的产品,必须存在这些产品才能触发促销活动。它们排列在 n 个集合(或位置)中,例如:

Example "Buy two get third free" Promotion =

| Item 1 |             | Item 1 |             | Item 2 |
|   or   |             |   or   |             |   or   |
| Item 2 |     AND     | Item 4 |     AND     | Item 6 |
|   or   |             |   or   |             |   or   |
| Item 3 |             | Item 9 |             | Item 4 |

  Set 1                   Set 2                  Set 3

每个促销活动必须包含每个组中的一个产品,除非该项目多次出现在同一个集合中。促销可以有无限(但通常

作为一个简单的例子,Item 1, Item 4 and Item 6 的购物篮会触发促销, 同样Item 1, Item 1 and Item 2 的篮子也会触发它。 但是Item 1, Item 2 and Item 3的篮子不会因为每套都不满意。

除了检测何时触发促销的最佳方法这一显而易见的问题外,我还需要恢复该项目已匹配到的集合(位置)以处理定价等细节。它会如果在将更昂贵(以货币计)的商品分配给促销活动时,较便宜(同等匹配)的商品更受青睐,这也是可取的。


希望下一部分能帮助解决问题,不要听起来太不清楚以至于会产生不必要的噪音,请随意忽略!

到目前为止,我最好的解决方案是为每个零售商品创建一个新套装 在“购物篮”中放置该商品将满足的促销集(位置)。 即。

Item 1 satisifies sets: {1,2}
Item 4 satisifies sets: {2,3}
Item 6 satisifies sets: {3}

那么我的理论是你“检查”这个集合列表在每个位置都包含一个独特的项目,并且每个晋升职位都被填补了。到目前为止,我的工作示例都使用蛮力、循环或递归来生成集合的所有组合(上图),以尝试检查是否存在唯一组合。这非常非常糟糕,除了一个非常微不足道的例子之外的任何东西在现实世界中根本不起作用。 (这个函数会在物品被添加到购物篮时实时调用,所以需要快速)

大量研究表明二分匹配会产生一些预期的结果,但我只能找到有关该主题的研究文章和相当复杂的数学文本。一些伪代码或基本逻辑会很棒。


我的两个问题基本上是:

1) 有没有人发现一种更好/更快/更简单的方法来分析客户购物篮以产生匹配的促销活动。
2) 假设我已经确定了将商品匹配到相关位置的最有效方式,那么确定要针对促销记录的零售商品列表的最便宜方式是什么。

如果我在隧道尽头看不到光明,我们将不胜感激! (最终的解决方案将在 .NET 中,我们使用 SQL server 2008 R2。)

【问题讨论】:

  • 快速澄清 - 为什么项目 1,2,3 不能满足您的示例?第 1 项满足 {1,2},第 2 项满足 {1,3},第 3 项满足 {1}。所以我们可以让项目 3 满足 {1},项目 1 满足 {2},项目 2 满足 {3}。除非我错过了什么
  • 每次促销有多少套?任何给定的提升都可以简化为状态机,但状态的数量会随着集合的数量迅速增加。

标签: algorithm set combinations shopping-cart bipartite


【解决方案1】:

检查给定购物车上的每个促销活动的有效性可以减少到Max Flow。在描述我的解决方案时,我假设您能够实现和解决基于图形的最大流量问题。如果不是,那是需要解决的第二个问题(幸运的是,这是一个更普遍的问题)。

让算法的输入如下:

  • 一组所有有效项目I。不一定用于算法的最终编码。
  • 购物车C 大小为n,是I 的子集,其中包含C_1 ... C_n 的项目。因此C = {C_i}fori = 1...n
  • m 子集组成的单个促销P,每个子集包含可变数量的项目。每个子集SI 的子集。每个子集不能有重复项,但单个项目可以存在于多个子集中。

如下构造图G

  • 添加一个超级源节点,标记为SOURCE
  • 添加一个超级汇节点,标记为SINK
  • 对于购物车C中的每个唯一项目C_i,添加一个可用的项目节点A_i,然后添加一条从SOURCEA_i的边,容量等于C_i的出现次数在C
  • 对于促销P 中的每个子集S_i,添加以下内容:
    • 单个集合节点S_i,以及从S_iSINK 容量1 的边。
    • 对于S_i 的每个必需项I_j,一个必需项节点B_i_j,以及一个从B_i_jS_i 的边,容量为1
  • 最后,对于每对节点A_xB_y 使得它们代表的项目是等价的,一条从A_xB_y 的边,容量为1

最后,以SOURCE 作为源,SINK 作为接收器,运行一个最大流量算法。如果生成的最大流量的值等于子集的数量 (m),则输出 true - 此购物车可以满足促销活动。否则输出 false - 此购物车无法满足促销活动。

例如,对于您设置的示例,使用购物车{1,1,4,6},应创建以下图表:


预期时间复杂度,其中项目数为n,促销中的子集数为m

  • 图表构造:
    • 添加SOURCESINK - O(1)
    • 从购物车和边缘添加独特的物品 - O(N)
    • 添加子集和所需的项目节点,以及 - O(N*M) 之间的边
    • 将边从子集节点添加到接收器 - O(M)
    • 在对应的项目节点之间添加边 - O(N^2)
    • 总计 - O(N^2 + N*M) = O(N * (N+M))
  • 最大流量算法 - 参见维基百科页面。简单的实施成本 - O((N*M)^3)。可以使用更复杂的算法进行改进。
  • 正在检索解决方案 - O(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多