2012-01-06 28 views
5

This question answers pseudocode for roulette wheel selection. Nhưng đó là vấn đề tối đa. Nhưng vấn đề của tôi là giảm thiểu giá trị của chức năng thể dục. Điều đó có nghĩa, các cá nhân có thể lực thấp có xác suất cao hơn để được chọn hơn cá nhân có tập thể dục cao. Làm thế nào tôi có thể thực hiện điều đó?Lựa chọn bánh xe roulette để giảm thiểu chức năng

Xin cảm ơn trước.

Trả lời

4
import java.util.Random; 
import java.util.Arrays; 
import java.util.Comparator; 

class MyComparator implements Comparator 
{ 
    public int compare(Object o1, Object o2) 
    { 
     Number n1 = (Number) o1; 
     Number n2 = (Number) o2; 

     if(n1.jump > n2.jump) 
     { 
      return 1; 
     } 
     else if(n1.jump < n2.jump) 
     { 
      return -1; 
     } 
     else 
     { 
      return 0; 
     } 
    } 
} 


class Number 
{ 
    public double i; 
    public int pos; 
    public double jump = 0; 


    public Random r = new Random(); 

    public Number(int pos) 
    { 
     this.pos = pos; 

     i = r.nextInt(); 
    } 
} 


public class Temp 
{ 
    public static void main(String[] args) 
    { 
     Number[] n = new Number[50]; 

     double total = 0; 

     for(int i=0; i<50; i++) 
     { 
      n[i] = new Number(i); 

      total += n[i].i; 
     } 

     for(int i=0; i<50; i++) 
     { 
      n[i].jump = n[i].i/total; 
     } 


     Arrays.sort(n, new MyComparator());  

     for(int i=0; i<50; i++) 
     { 
      System.out.print(n[i].pos + ", "); 
     } 

     System.out.println(); 

     for(int i=0; i<50; i++) 
     { 
      n[i].jump = n[i].i/total; 
      n[i].jump = 1-n[i].jump; 
     } 

     Arrays.sort(n, new MyComparator());  

     for(int i=0; i<50; i++) 
     { 
      System.out.print(n[i].pos + ", "); 
     } 

     System.out.println(); 
    } 
} 

Trong ví dụ trên, nói Số lớp là lớp cá nhân của bạn, i đang tập thể dục, nhảy là xác suất được chọn làm cha mẹ. Lúc đầu, chúng tôi tính toán xác suất được chọn làm cha mẹ như trước đây. Tại bước này, tập thể dục cao hơn sẽ có xác suất cao hơn. Sau đó, chúng tôi trừ xác suất từ ​​1. Điều này mang lại cho thể dục thấp hơn thể dục cá nhân cao hơn (tập thể dục giả cho vì lợi ích của lựa chọn). Bây giờ tính toán lại xác suất. Thấy không, trật tự của sự hoàn toàn bị đảo ngược.

4

Sử dụng các thuật toán tương tự nhưng làm cho tỷ trọng của mỗi cá nhân = maxfitness - fitness

+1

Đối với vấn đề thực tế trong cuộc sống, rất khó để biết MAX_FITNESS giống như MIN_FITNESS. – user

+0

Tôi không nên sử dụng mũ chỉ báo không đổi. maxFitness cho bánh xe roulette của bạn là tập thể dục tối đa của thế hệ hiện tại, vì kích thước của bánh xe roulette/xổ số là tổng của các thế hệ hiện tại. –

2

Không thể sử dụng bánh xe Roulette để giảm thiểu vì tỷ lệ thu nhỏ. Hơn nữa, nó cũng không thể được sử dụng khi có thể dục tiêu cực hoặc null vì xác suất của chúng sẽ là số âm hoặc không. Theo đề xuất của Larry bạn có thể sử dụng bình thường hóa cục bộ bằng cách trừ đi, để tập thể dục tối đa của dân số của bạn, tập thể dục của từng cá nhân, nhưng một lần nữa bạn sẽ phải sửa thể dục tối đa để nó không có xác suất không.

Tôi khuyên bạn nên sử dụng lựa chọn giải đấu đã được chứng minh nhiều lần tốt hơn so với roulette.

2

Có thể đã quá muộn nhưng tôi không khuyên bạn nên max_fitness - fitness vì bạn sẽ mất các yếu tố tệ nhất (chúng có thể giúp khám phá). Thay vào đó bạn có thể làm một loại đảo ngược.

def roulette_selection(population): 
    fs = [fitness(i) for i in population] 
    sum_fs = sum(fs) 
    max_fs = max(fs) 
    min_fs = min(fs) 
    p = random()*sum_fs 
    t = max_fs + min_fs 
    choosen = population[0] 
    for i in population: 
     if MAXIMIZATION: 
      p -= fitness(i) 
     elif MINIMIZATION: 
      p -= (t - fitness(i)) 
     if p < 0: 
      choosen = i 
      break 
    return choosen 
+0

Đã làm việc cho tôi, cảm ơn –

1

Thay đổi phòng tập thể dục thành fitness_new = 1/fitness_old và bạn gặp sự cố tối đa. Nếu fitness_old = 0 là có thể, hãy thêm 1 vào mẫu số để tránh chia cho 0.

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