2012-01-28 21 views
5

Tôi phải giải quyết the Travelling Salesman Problem sử dụng genetic algorithm mà tôi sẽ phải viết cho bài tập về nhà.Phép lấy mẫu của [1,2,3, ..., N] cho lớn N

Sự cố bao gồm 52 thành phố. Do đó, không gian tìm kiếm là 52!. Tôi cần phải lấy mẫu ngẫu nhiên (ví dụ) 1000 hoán vị của range(1, 53) làm cá thể cho số lượng ban đầu của thuật toán di truyền của tôi.

Để làm điều này, tôi đã cố gắng:

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

Vì vậy, tôi đã cố gắng

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

Tuy nhiên, cho rằng 52! là rất lớn, các hoạt động list sử dụng hết không gian bộ nhớ và swap trong máy của tôi. Tôi không thể chỉ chọn 1000 hoán vị đầu tiên được tạo ra bởi itertools.permutations vì nó rất xác định và có thể thiên vị thuật toán di truyền của tôi.

Có cách nào tốt hơn để đạt được mẫu này không?

Trả lời

6

Bạn không cần phải hoán đổi chút nào. Gọi số random.sample(range(52), 52) 1000 lần.

P.S .: Bạn thực sự nên sử dụng chỉ mục dựa trên 0 (range(52) thay vì range(1, 53)) trong tất cả công việc của bạn. Mọi thứ thường hoạt động tốt hơn theo cách đó.

+0

Tôi hoàn toàn đồng ý với chỉ số dựa trên số không của bạn, nhưng phân ở đây đại diện cho ID thành phố và Giáo sư của tôi quyết định rằng anh ấy muốn bắt đầu từ 1 ... Vì vậy, tôi đang cố gắng giữ đúng quy ước của mình – inspectorG4dget

+6

Đó là trải nghiệm của tôi rằng bạn chỉ nên làm theo cách riêng của bạn và chuyển nó thành quy ước shitty giáo sư của bạn trong báo cáo đầu ra của bạn. –

+1

Đợi, cho một _permutation_ ngẫu nhiên không nên là 'p = range (10); random.shuffle (p) '? 'random.sample' sẽ lặp lại một số giá trị và bỏ qua các giá trị khác. Nhưng có lẽ bạn đang nói rằng những thực sự không phải là hoán vị ... – senderle