2012-01-28 30 views
5

için [1,2,3, ..., N] 'nin Örnekleme İzinleri the Travelling Salesman Problem'u genetic algorithm kullanarak ödev ödevini yazmak zorundayım.Büyük N

Sorun, 52 şehirden oluşmaktadır. Bu nedenle, arama alanı 52!'dir. Genetik algoritmamın ilk popülasyonu için birey olarak range(1, 53) 1000 permütasyonunu rastgele örneklemem gerekiyor.

Bunu yapmak için, Denedim:

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

Yani, list operasyon bellek ve takas alanı tükenmek üzere olduğunu 52! ÇOK büyük olduğu göz önüne alındığında, Ancak
>>> random.sample(list(itertools.permutations(range(1, 53))), 1000) 

çalıştı bilgisayarımda. itertools.permutations tarafından üretilen ilk 1000 permütasyonları seçemiyorum çünkü çok belirleyici ve bu benim genetik algoritmamı önyargıyor.

Bu örneklemeyi başarmanın daha iyi bir yolu var mı?

cevap

6

Hiç bir şekilde izin almanıza gerek yoktur. random.sample(range(52), 52)'u 1000 kez arayın.

P.S .: Tüm çalışmalarınızda sıfır tabanlı dizin oluşturmayı (range(1, 53) yerine range(52)) kullanmalısınız. İşler genellikle bu şekilde daha iyi çalışır.

+0

Sıfır tabanlı endeksleme ile tamamen katılıyorum, ancak burada indeksler City ID'lerini temsil ediyor ve benim Prof 1'den başlamak istediğine karar verdi ... Bu yüzden onun kongresine sadık kalmaya çalışıyorum – inspectorG4dget

+6

Bu benim deneyimim oldu sadece kendi yolunu kendin yapmalı ve bunu profosyonun boktan sözleşmelerinden çıkış ifadelerinize dönüştürmelisin. –

+1

Bekleyin, rastgele bir _permutation_ için bu olmamalıydı 'p = range (10); random.shuffle (p) '? random.sample, bazı değerleri kopyalayıp diğerlerini çıkarır. Ama belki de bunların aslında permütasyonlar olması gerekmediğini söylüyorsunuz ... – senderle

İlgili konular