我正在寻找一种算法来找到最佳尺寸组合,以达到理想的效果。
以下面的例子为例:
| A | B | C | y |
|--------|--------|-------|-----|
| dog | house1 | green | 30 |
| dog | house1 | blue | 15 |
| cat | house1 | green | 20 |
| cat | house2 | red | 5 |
| turtle | house3 | green | 50 |
A,B,C是测量的尺寸。 y是测量结果。
如果我想得到所有尺寸组合,即y> = 50,那么结果就是:
turtle, house3, green
turtle, any, green
turtle, house3, any
turtle, any, any
any, house3, green
any, house3, any
any, any, green
any, house1, green
any, house1, any
也许这是一个容易解决的问题,但我试图用O(n)来找出最佳解决方案,而我却找不到它。
答案 0 :(得分:4)
从包含(any, any, ..., any), 0
的工作队列开始。此队列的元素将是由左侧的组合和许多元素组成的对,这些元素无法从any
更改(这将很快变得更有意义)。在工作队列为空之前,从中删除一个元素并计算相应的总和。如果它没有达到阈值,则丢弃它。否则,将其报告为所寻求的组合之一。对于可以更改的每个any
,对于该列中的每个值,将由当前值any
替换为该值的组合排队,并将索引锁定所有先前的any
值。
考虑输出敏感的界限,这是在最优的多项式因子内(通常,可以有指数级的多种组合)。
在Python 3中:
def overthreshold(data, threshold):
queue = [(('any',) * len(data[0][0]), 0)]
for combination, begin in queue:
if sum(row[1] for row in data
if all(x in {'any', y}
for x, y in zip(combination, row[0]))) < threshold:
continue
yield combination
for i in range(begin, len(combination)):
if combination[i] == 'any':
queue.extend((combination[:i] + (x,) + combination[i+1:], i + 1)
for x in {row[0][i] for row in data})
def demo():
data = [
(('dog', 'house1', 'green'), 30),
(('dog', 'house1', 'blue'), 15),
(('cat', 'house1', 'green'), 20),
(('cat', 'house2', 'red'), 5),
(('turtle', 'house3', 'green'), 50),
]
for combination in overthreshold(data, 50):
print(combination)