Я пытаюсь выполнить поиск перестановок списка списков, подсчитывая каждую перестановку и находить минимальное значение. Я могу сделать это путем жесткого кодирования решения, когда длина списка списков равна четырем. Мой вопрос в том, как я могу обобщить решение для любой длины до 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
Код не отображается, если он будет работать. l! = list_of_lists. Возможно, вы можете обновить пример. Его легко написать с помощью itertools. Просто найдите документы. Он встроен в python. Проблема заключается в сложности алгоритма: вы не сможете перебирать все комбинации с такой большой длиной. Он растет экспоненциально. – sascha
Извините, саша. Я исправил вторую строчку. Что касается сложности, то это моя главная проблема. Мой список может подняться до len (l) = 50. Это будет означать 50! Перестановки. – ddcastrodd
50! перестановки - это много перестановок для оценки. Даже если бы вы могли оценить одну квадриллионную перестановку в секунду, вам все равно понадобилось бы ~ 10^42 лет, чтобы оценить их всех (возраст Вселенной составляет всего 10-10 лет). Структура for-loop, по-видимому, является наименьшей из ваших проблем. – mhum