2012-01-06 12 views

cevap

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

oranını yapmak , atlama olasılık uygunluktur i, Numara sınıf bireysel sınıf olduğunu söylemek Ebeveyn olarak seçilme. İlk önce, daha önce olduğu gibi ebeveyn olarak seçilme olasılığını hesaplıyoruz. Bu aşamada, daha yüksek uygunluk daha yüksek bir olasılık elde edecektir. Daha sonra, olasılık 1'den çıkarırız. Bu, daha düşük bir zindelikle daha yüksek bir zindelik verir (seçim için sözde zindelik). Şimdi olasılığı yeniden hesaplayın. Bak, varlığın sırası tamamen tersine döndü.

4

, aynı algoritmayı kullanarak ancak Yukarıdaki örnekte her = maxfitness - fitness

+1

Gerçek yaşam problemi için MAX_FITNESS değerini MIN_FITNESS gibi bilmeniz pek olası değildir. – user

+0

Sabit belirten kapaklar kullanmamalıydım. Rulet çarkı için maxFitness, mevcut jenerasyonun maksimum zindeliğidir, çünkü rulet çarkı/piyango büyüklüğü mevcut nesil sporların toplamıdır. –

2

Rulet tekerleği, ölçekleme nedeniyle en aza indirgenmek için kullanılamaz. Ayrıca, olumsuz ya da sıfır uygunluk olduğunda da kullanılamaz çünkü olasılıkları negatif ya da sıfırdır.

Larry tarafından önerildiği gibi, yerel normalleştirmeyi çıkartarak, popülasyonunuzun maksimal uygunluğuna, her bireyin zindeliğine, ancak yine de maksimum bir zindeliği düzeltmek zorunda kalacaksınız, böylece boş bir olasılık yoktur.

Ruletten çok daha iyi kanıtlanmış bir turnuva seçimini kullanmanızı öneririm.

2

Çok geç olabilir ama, en kötü öğeleri (keşif için yardımcı olabilir) kaybedeceğinizden dolayı max_fitness - fitness'u önermiyorum. Bunun yerine bir tersine çevirme yapabilirsin.

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

Benim için çalıştı, teşekkürler –

1

Değişim spor = 1/fitness_old fitness_new için ve tekrar maksimizasyonu sorun var. Eğer fitness_old = 0 mümkün ise, sıfıra bölünmeden kaçınmak için paydaya 1 ekleyin.