找到最佳尺寸组合的算法

时间:2015-09-19 10:36:13

标签: algorithm multidimensional-array dimensions

我正在寻找一种算法来找到最佳尺寸组合,以达到理想的效果。

以下面的例子为例:

|   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)来找出最佳解决方案,而我却找不到它。

1 个答案:

答案 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)