【发布时间】:2014-01-06 21:33:29
【问题描述】:
我正在为一家水果店编写一个智能柜台程序,它的作用如下:
当客户购买n类型的水果时,该程序会检查部分/全部这些水果是否符合/几种折扣优惠,如果符合,这些水果将享受相对折扣。
具体的Discount定义是这样的(每个Discount包含的tag_clause个数是不确定的,每个水果都有几个tag):
<discount name='aaa' discount='90%'>
<tag_clause>bestseller</tag>
<tag_clause>juicy</tag>
<tag_clause>badseller</tag>
</discount>
意思是:如果客户想要享受这个折扣,他/她至少会购买三种不同的水果,并且他们的每个标签至少匹配折扣定义中的一个tag_clauses。
举个例子:如果你买的是苹果(标签:畅销书,多汁),西瓜(标签:多汁) 和 banana(tags:badseller),那么您可以享受 90% 的折扣。
由于每个折扣由几个(不确定)数量的 tag_clauses 组成,挑战是找到所有可能的组合,其中几个水果可以匹配折扣 A,另外几个匹配折扣 B,其余的可能匹配折扣 C 或不匹配(将以原价出售)。
这里是模型Fruit和Discount的定义:
class Fruit(object):
def __init__(self):
self.name = None
self.weight = Decimal('0.0')
self.price = Decimal('0.00')
self.tags = None
class Discount(object):
def __init__(self):
self.name = None
self.discount = Decimal('0.0')
self.clauseTagNum = 0
self.clauseTags = []
我的问题是:给定 n 种水果和 m 个折扣,尝试找出所有可能的尝试匹配组合。也就是说,我想生成所有组合(所以我可以过滤它们),但不知道如何生成它们。
例如,如果客户购买水果A, B, C, D, E,而这里我们有三个不同的折扣Disc-3, Disc-2_1, Disc-2_2,它们的tag_clause 编号是3、2、2。部分可能的组合是:
A,B,C try-match Disc-3 | D,E try-match Disc-2_2
B,C,D try-match Disc-3 | A,E try-match Disc-2_1
C,E try-match Disc-2_2 | A,D try-match Disc-2_1 | B try-match nothing
A,B try-match Disc-2_1 | C,E try-match Disc-2_1 | D try-match nothing
非常感谢您的宝贵时间。
【问题讨论】:
-
几个明确的问题:是否需要满足每个 tag_clause 才能应用折扣?你的意思是 90% 的折扣,还是 10% 的折扣?
-
这个问题看起来像一个多维背包问题,所以它可能是 NP 难的。对于正常数量的杂货,只要您的算法不是太效率低下,这应该不是问题,但是像暴力破解所有可能的折扣组合这样的东西可能会导致如此多的滞后,以至于您的程序无法使用。
-
你坚持哪一部分?例如,也许您想生成所有组合(以便您可以过滤它们),但不知道如何生成所有组合。在这种情况下,你可以问一个具体的问题,而不是仅仅说“这是我的任务,我该怎么做?”或者,如果您知道这不是完全可以解决的,而无需花费太长时间,并且您需要帮助实施您在网上找到但不理解其中一个步骤的优化算法,请向我们展示您理解的部分以及您从哪里获得迷路了。
-
为什么这些折扣是根据水果的种类来的?如果我想买 3 盒苹果,我是不是要买一个西瓜和一个香蕉来获得折扣?每种水果的数量重要吗?
-
@user2357112 问题1:是的,每个tag_clause都需要满足,这里的折扣意味着10% off |问题2:买3盒苹果就另当别论了,不过还是谢谢你提到这个想法。最后感谢你的解决方案分析。
标签: python algorithm combinations