2012-01-28 19 views
5

Mam do rozwiązania the Travelling Salesman Problem przy użyciu genetic algorithm, które będę musiał napisać dla zadania domowe.Permptacje próbkowania [1,2,3, ..., N] dla dużego N

Problem składa się z 52 miast. Dlatego przestrzeń wyszukiwania to 52!. Muszę losowo próbować (powiedzmy) 1000 permutacji range(1, 53) jako osobników dla początkowej populacji mojego algorytmu genetycznego.

W tym celu, próbowałem:

>>> 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() 

Więc próbowałem

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

Biorąc jednak pod uwagę, że 52! jest bardzo duża, operacja list jest maxing przestrzeń pamięci i wymiany na moim komputerze. Nie mogę po prostu wybrać pierwszych 1000 permutacji wygenerowanych przez itertools.permutations, ponieważ jest to bardzo deterministyczne i może wpłynąć na mój algorytm genetyczny.

Czy istnieje lepszy sposób na uzyskanie tego próbkowania?

Odpowiedz

6

Nie musisz w ogóle permutować. Zadzwoń pod random.sample(range(52), 52) 1000 razy.

P.S .: Naprawdę powinieneś używać indeksowania opartego na zera (range(52) w przeciwieństwie do range(1, 53)) we wszystkich twoich pracach. Rzeczy ogólnie działają lepiej w ten sposób.

+0

Całkowicie zgadzam się z twoim indeksowaniem od zera, ale indeces tutaj reprezentują City ID i mój Profesor zdecydował, że chce zacząć od 1 ... Więc staram się pozostać wiernym jego konwencjom – inspectorG4dget

+6

To było moje doświadczenie że powinieneś zrobić to po swojemu i przekonwertować go na gówniane konwencje profesora w swoich wypowiedziach wyjściowych. –

+1

Czekaj, bo losowy _permutacja_ nie powinien to być 'p = zakres (10); random.shuffle (p) '? 'random.sample' spowoduje zduplikowanie niektórych wartości i pominięcie innych. Ale może mówisz, że te naprawdę nie muszą być permutacjami ... – senderle