【问题标题】:How can find the lowest value of a calculation based on several variables?如何根据多个变量找到计算的最小值?
【发布时间】:2011-03-03 23:06:28
【问题描述】:

警告:我正在使用 ColdFusion,但我觉得这可以涵盖广泛的语言,因为这更像是一个编程问题,而不仅仅是一个 ColdFusion 问题。

好的,我的任务是实现代码以将促销应用到购物车中的商品。基本上,任何数量的商品都可以有任意数量的促销活动 - 即“购买 2 件 'ABC' 物品,获得 1 件 'ABC' 物品 50% 折扣”。但是,也可以“购买3 of item'ABC',免费获得1 of item'ABC'”。或者甚至是“购买 2 件 'ABC',获得 1 件 'XYZ' 50% 折扣”。

因此,想象一下在各种产品中开展更多这样的促销活动。

现在,我需要遍历所有可能的场景,以应用为客户带来最佳价值(最低小计)的促销(或促销)。

但是,我无法弄清楚如何编写将在所有可能的情况下运行的代码。我可以通过过滤掉那些不适用于购物车中商品的促销活动来缩小符合条件的促销活动的数量。显然,我也知道购物车中符合条件的商品数量。

假设我的购物车中有 5 件商品,其中 3 件商品有符合条件的促销活动(如上述)。 1 个项目有 3 个可能的促销,另一个有 4 个可能的促销,另一个有 2 个可能的促销。我的第一个想法是,遍历每个可能的促销活动,并在该循环中,遍历符合条件的商品的每个可能顺序:

1-2-3 1-3-2 2-1-3 2-3-1 3-1-2 3-2-1

...每次都应用促销,保存产生最低小计的组合。

这行得通吗?是不是矫枉过正?谁有更好的建议?

任何代码示例将不胜感激。虽然我在 ColdFusion 中编程,但我可以很好地阅读/理解其他语言。

谢谢。

【问题讨论】:

  • 如果一个产品有两个促销,你应该怎么做?两者都适用,还是放弃成本更高的那个?
  • 我想知道这是否更适合programmers.so。在许多情况下,我认为您可以简单地为每个促销存储一个值,该值仅在商品价格发生变化时才会更新。然后,您可以遍历购物车并消除商品,因为您首先应用最高的绝对促销值。
  • 老实说,在现实世界中,最大的销售总是用于最大的促销,只需尝试最大的促销 -> 如果可以再试一次,如果不去更小的等等。
  • +1 回答一个有趣的问题。还添加了人工智能标签,因为我怀疑这个问题可能是 NP 完全的。
  • 也可以看到这个问题:stackoverflow.com/questions/426173/…

标签: loops coldfusion random recursion artificial-intelligence


【解决方案1】:

而不是循环遍历项目并寻找组合,您可以循环遍历促销和与购物车匹配的模式,也许更容易?

或者,如果一个总是优于另一个,也许你可以为促销分配优先级?那么如果应用了一个,您可以跳过所有优先级较低的促销活动吗?

【讨论】:

    【解决方案2】:

    这似乎是一个搜索问题。好吧,每个问题都是一个搜索问题。我将从一个简单的深度优先搜索开始,因为它占用的内存很少。

    下面是深度优先搜索的一些伪代码。

    def bestSetOfPromotions(cart, promotions, applied-promotions):
        if (len(promotions) == 0):     #no more choices
            return applied-promotions
        best-set = [] #best set of promotions found so far, the empty set.
        for next-promotion in promotions:
            if canApply(next-promotion, cart, applied-promotions):
                best = bestSetOfPromotions(cart, promotions.remove(next-promotion), applied-promotions.push(next-promotion))
                if (costOf(cart, best) < costOf(cart,best-set)):
                   best-set = best
        return best-set
    
    #we call it as such:
    bestSetOfPromotions(cart, allThePromotions, [])
    

    上面的代码假定促销只能应用一次。更改为允许同一促销的多个应用程序应该很简单。

    代码检查所有合法 (canApply) 促销的所有可能排序,并找到给给定“购物车”成本最低的排序。这将花费 O(2^len(promotions))。

    如果此搜索时间过长,我建议将其修改为分支定界搜索,并将促销从大到小排序。

    【讨论】:

    • +1 有趣的方法 - 这似乎假设您可以完全探索每一种可能性,然后选择最低成本?任何缩放问题?
    • @organgepips 分支和绑定的扩展非常可怕(但仍然比蛮力好很多),但只要他的购物车中的物品少于 10-20 件(或更多?),他应该是安全的:他会看到哪个项目达到上限:执行时间将从几毫秒变为几小时,只需再增加 1 个项目。但是分支定界是最好的精确算法之一。现实是,如果这确实是 NP Complete,那么今天就不可能将横向扩展和精确结合起来。
    【解决方案3】:

    基于@Henry 的回答,我认为解决方案取决于促销的处理方式。如果满足以下条件,这可能每次都可以最佳解决:

    1. 可应用于订单的给定类型(例如买一送一)的促销数量没有限制
    2. 给定促销适用的商品数量是有限的(不买一件全价,想买多少就买多少减半),数量越大,单位成本越低
    3. 促销仅适用于一种“类型”的项目,并且项目仅属于一种类型(例如书籍)。

    #2 中的点用于确定“优先级”,这样算法将按类型和该类型的数量对项目进行分组,并遍历这些组以找到适用的促销活动。

    现在,如果上面提到的是不真实,我认为您现在正在处理一个问题,即无法断言在没有找到其他所有解决方案的情况下需要多长时间才能达到“最佳”解决方案也是。现在,如果项目的数量很少,找到所有可能性并选择最低成本可能是可行的,但我想可能性的数量会根据项目的数量和可能的促销数量呈指数增长。我将此称为NP complete 问题。

    相反,您需要一种能够在合理的时间内产生“良好”解决方案的算法。如果这是真的,我认为一种称为simulated annealing 的方法是适用的:基本上是一种迭代任意次数的算法(您需要进行测试以找到一个在性能方面可以接受的值)。该算法是随机输入的,在这种情况下适用于促销。该算法返回总成本。每次迭代都会改变算法的输入——整体算法的一部分是找到产生“好”结果的两次迭代,并将它们的输入组合起来进行另一次迭代。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2021-06-14
      • 2022-11-12
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 2015-10-25
      相关资源
      最近更新 更多