2012-05-10 23 views
5

Câu hỏi của tôi được liên kết với câu hỏi này: Roulette-wheel selection in Genetic algorithm. Population needs to be sorted first? Nếu chúng tôi không phân loại dân số, cách tổ chức lựa chọn bánh xe roulette cho nó là gì? Chắc chắn, chúng ta phải tìm kiếm theo cách tuyến tính ngay bây giờ. Bạn có đoạn mã nào trong C++ hoặc Java cho trường hợp này không?Làm thế nào để lựa chọn bánh xe roulette nên được tổ chức cho dân số không được sắp xếp trong thuật toán di truyền?

Trả lời

12

Dân số không cần phải được sắp xếp chút nào - chìa khóa để chọn lựa roulette là xác suất của một cá thể được chọn để sinh sản tỷ lệ với thể lực của nó.

Giả sử bạn có một dân số không được phân loại, với fitnesses như sau:

[12, 45, 76, 32, 54, 21] 

Thực hiện lựa chọn roulette, bạn chỉ cần chọn một số ngẫu nhiên trong khoảng từ 0 đến 240 (tổng thể dục của người dân). Sau đó, bắt đầu từ phần tử đầu tiên trong danh sách, trừ số lượng của từng cá nhân cho đến khi số ngẫu nhiên nhỏ hơn hoặc bằng 0. Vì vậy, trong trường hợp trên, nếu chúng tôi chọn ngẫu nhiên 112, chúng tôi thực hiện như sau:

Step 1: 112 - 12 = 100. This is > 0, so continue. 
Step 2: 100 - 45 = 55. This is > 0, so continue. 
Step 3: 55 - 76 = -21. This is <= 0, so stop. 

Vì vậy, chúng tôi chọn cá nhân # 3 để sao chép. Lưu ý cách này không yêu cầu dân số phải được sắp xếp.

Vì vậy, trong giả, nó nắm xuống:

let s = sum of population fitness 
let r = random number in range [0, s]. 
let i = 0. 
while r > 0 do: 
    r = r - fitness of individual #i 
    increment i 
select individual #i - 1 for reproduction. 

Lưu ý rằng - 1 trong dòng cuối cùng là để chống lại increment i đã xong trong vòng lặp cuối cùng của vòng lặp (vì mặc dù chúng tôi đã tìm thấy cá nhân chúng tôi muốn, nó tăng bất kể).

Các vấn đề liên quan