2016-05-12 6 views
0

Я пытаюсь выполнить поиск перестановок списка списков, подсчитывая каждую перестановку и находить минимальное значение. Я могу сделать это путем жесткого кодирования решения, когда длина списка списков равна четырем. Мой вопрос в том, как я могу обобщить решение для любой длины до 50? Как я могу избежать написания серии циклов?Как эффективно искать перестановки

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 
+0

Код не отображается, если он будет работать. l! = list_of_lists. Возможно, вы можете обновить пример. Его легко написать с помощью itertools. Просто найдите документы. Он встроен в python. Проблема заключается в сложности алгоритма: вы не сможете перебирать все комбинации с такой большой длиной. Он растет экспоненциально. – sascha

+0

Извините, саша. Я исправил вторую строчку. Что касается сложности, то это моя главная проблема. Мой список может подняться до len (l) = 50. Это будет означать 50! Перестановки. – ddcastrodd

+0

50! перестановки - это много перестановок для оценки. Даже если бы вы могли оценить одну квадриллионную перестановку в секунду, вам все равно понадобилось бы ~ 10^42 лет, чтобы оценить их всех (возраст Вселенной составляет всего 10-10 лет). Структура for-loop, по-видимому, является наименьшей из ваших проблем. – mhum

ответ

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 генератора, чтобы сделать грязную работу получать все permuations из списка l. Наконец, вместо того, чтобы следить за минимумом самостоятельно, вы можете использовать аргумент ключевого слова key из min, чтобы указать, что вы должны иметь минимальный размер данного набора объектов (в этом случае объекты являются перестановками l), где их " значение "задается функцией , связанной с key, в данном случае get_expected_value. Итак, у нас есть:

Смежные вопросы