我要构建复杂的算法,以便在列表中选择最佳元素组合。
我有20个元素的列表。我使用这个算法制作了这个列表的所有组合,resutlt将是一个大小为2 ^ 20-1(没有重复)的元素列表
from itertools import combinations
def get_all_combinations(input_list):
for i in xrange(len(input_list)):
for item in combinations(input_list, r = i + 1):
yield list(item)
input_list = [1,4,6,8,11,13,5,98,45,10,21,34,46,85,311,133,35,938,345,310]
print len(get_all_combinations(input_list)) # 1048575
我有另一个算法应用于每个列表,然后计算最大值。
// this is just an example
def calcul_factor(item):
return max(item) * min(item) / sqrt(min(item))
我试着这样做:但这需要很长时间。
columnsList= get_all_combinations(input_list)
for x in columnsList:
i= calcul_factor(x)
factorsList.append(i)
l.append(x)
print "max", max(factorsList)
print "Best combinations:", l[factorsList.index( max(factorsList))]
使用Maps / Lamda表达式解决问题以使“parallelisme”计算最大值吗? 有人暗示这样做吗?
答案 0 :(得分:0)
如果您找不到更好的算法(这里可能需要),您可以避免使用生成器创建这些大列表。
在itertools.chain
的帮助下,您可以合并itertools.combinations
- 生成器。此外,max
- 函数可以将函数作为键。
您的代码可以简化为:
all_combinations = chain(*[combinations(input_list, i) for i in range(1, len(input_list))])
max(all_combinations, key=algorithm)
由于此代码仅依赖于生成器,因此它可能更快(并不意味着足够快)。
编辑:我通常同意休·博思韦尔的观点,在使用这样的实现之前,你应该尝试找到更好的算法。特别是如果你的列表包含超过20个元素。
答案 1 :(得分:0)
如果您可以轻松计算calcul_factor(item + [k])
给定的calcul_factor(item)
,那么动态编程方法可能会大大受益。
如果你可以尽早消除一些不好的解决方案,它也会大大减少要考虑的组合总数(分支和绑定)。
如果计算表现得相当好,您甚至可以使用iex单纯形法或线性求解器直接走向解决方案(类似于O(n**2 log n)
运行时而不是O(2**n))
您能否向我们展示实际 calcul_factor
代码和实际 input_list
?