如何有效地搜索排列

时间:2016-05-12 23:18:32

标签: algorithm python-2.7 permutation

我正在尝试搜索列表列表的排列,对每个排列进行评分,并找到最小值。当列表列表的长度为4时,我可以通过硬编码解决方案来实现。我的问题是如何将我的解决方案概括为任何长度达50?如何避免编写一系列for循环?

answer = {}
l=[[16,5,6],[6,3,4],[5,1,2],[10,1,4]]
lowest = get_expected_value(l)
for x in l:
    for y in l:
        for z in l:
            for a in l:
                if x != y and x != z and x != a and y != z and y != a and z != a:
                     if get_expected_value([x,y,z,a]) <= lowest:
                         answer[get_expected_value([x,y,z,a])] = [x,y,z,a]
                         lowest = get_expected_value([x,y,z,a])

print ans[min(ans.keys())]

get_expected_value定义如下:

 def get_expected_value(list_minions):
        expected = 0
        for item in xrange(len(list_minions)):
            if item == 0:
                expected += list_minions[0][0]
            else:
                expected += (list_minions[item][0])*(1.0 - (list_minions[item-1][1]/float(list_minions[item-1][2])))
        return expected

1 个答案:

答案 0 :(得分:1)

这是一个处理任意长度的列表l的解决方案(并不总是在@mhum指出的任何合理时间内完成) 使用相同的get_expected_value函数。

from itertools import permutations
l = ((16,5,6),(6,3,4),(5,1,2),(10,1,4)) # in general, you should choose a different letter than `l` for variable names, as it can be confused with `1`
print min(permutations(l), key=get_expected_value)

关键的想法是利用itertools'permutation生成器函数来完成获取列表l的所有扩展的肮脏工作。 最后,您可以使用key的{​​{1}}关键字参数来指定您想要的最小值,而不是自己跟踪最小值。 给定对象集合的最小值(在这种情况下,对象是min的排列),其中“值”由 与l相关联的功能,在本例中为key。所以我们有: