2012-01-28 13 views
5

che devo risolvere the Travelling Salesman Problem utilizzando un genetic algorithm che dovrò scrivere per compiti.campionamento permutazioni di [1,2,3, ..., N] per la grande N

Il problema è composto da 52 città. Pertanto, lo spazio di ricerca è 52!. Ho bisogno di campionare casualmente (per esempio) 1000 permutazioni di range(1, 53) come individui per la popolazione iniziale del mio algoritmo genetico.

Per fare questo, ho provato:

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

Così ho provato

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

Tuttavia, dato che 52! è molto grande, l'operazione list è maxing lo spazio di memoria e di swap sul mio computer. Non riesco a scegliere le prime 1000 permutazioni generate da itertools.permutations perché è molto deterministico e questo pregiudicherebbe il mio algoritmo genetico.

Esiste un modo migliore per ottenere questo campionamento?

risposta

6

Non è necessario permutare. Chiama il numero random.sample(range(52), 52) 1000 volte.

P.S .: È davvero necessario utilizzare l'indicizzazione basata su zero (range(52) in contrapposizione a range(1, 53)) in tutto il proprio lavoro. Le cose generalmente funzionano meglio in questo modo.

+0

Sono totalmente d'accordo con l'indicizzazione basata su zero, ma gli indumenti qui rappresentano gli ID città e il mio Prof ha deciso che vuole iniziare da 1 ... Quindi sto cercando di rimanere fedele alla sua convenzione – inspectorG4dget

+6

È stata la mia esperienza che dovresti farlo a modo tuo e convertirlo nelle convenzioni di merda del tuo professore nelle tue dichiarazioni di uscita. –

+1

Attendi, per una _permata_ casuale non dovrebbe essere p = intervallo (10); random.shuffle (p) '? 'random.sample' duplicherà alcuni valori e ometterà gli altri. Ma forse stai dicendo che queste non devono essere permutazioni ... – senderle

Problemi correlati