Выборочные перестановки [1,2,3, ..., N] для больших N - PullRequest
6 голосов
/ 29 января 2012

Мне нужно решить задачу коммивояжера , используя генетический алгоритм , который мне придется написать для домашней работы .

Проблема состоит из 52 городов. Следовательно, пространство поиска равно 52!. Мне нужно случайным образом выбрать (скажем) 1000 перестановок range(1, 53) как отдельных лиц для начальной популяции моего генетического алгоритма.

Чтобы сделать это, я попытался:

>>> random.sample(itertools.permutations(range(1, 53)), 1000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.6/random.py", line 314, in sample
    n = len(population)
TypeError: object of type 'itertools.permutations' has no len()

Итак, я попытался

>>> random.sample(list(itertools.permutations(range(1, 53))), 1000)

Однако, учитывая, что 52! ОЧЕНЬ велик, операция list увеличивает объем памяти и свободного места на моем компьютере. Я не могу просто выбрать первые 1000 перестановок, сгенерированных itertools.permutations, потому что это очень детерминистично и это сместило бы мой генетический алгоритм.

Есть ли лучший способ добиться этой выборки?

1 Ответ

7 голосов
/ 29 января 2012

Вам не нужно переставлять вообще. Звоните random.sample(range(52), 52) 1000 раз.

P.S .: Вы действительно должны использовать индексирование с нуля (range(52) вместо range(1, 53)) во всей вашей работе. Так обычно бывает лучше.

...