2012-01-06 12 views

risposta

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

Nel precedente esempio, dicono Numero classe è la classe individuale, i è il fitness, salto è la probabilità di essere selezionato come genitore. Inizialmente calcoliamo la probabilità di essere selezionati come genitore come prima. In questa fase, una maggiore idoneità avrà una probabilità maggiore. Quindi sottraiamo la probabilità da 1. Ciò dà al fitness più basso una maggiore idoneità individuale (pseudo forma fisica per la scelta). Ora ricalcolare la probabilità. Vedi, l'ordine dell'essere è totalmente invertito.

4

Utilizzare lo stesso algoritmo ma fare la proporzione di ogni singolo = maxfitness - fitness

+1

Per problemi reali, è improbabile che conosca MAX_FITNESS come MIN_FITNESS. – user

+0

Non avrei dovuto usare cappucci di indicazione costante. maxFitness per la ruota della roulette è il massimo della generazione attuale, dal momento che la dimensione della ruota della roulette/lotteria è la somma delle attuali generazioni di fitness. –

2

La ruota della roulette non può essere utilizzata per la riduzione al minimo a causa del ridimensionamento. Inoltre, non può essere usato anche quando ci sono fitness negativi o nulli perché la loro probabilità sarebbe negativa o nulla.

Come suggerito da Larry, è possibile utilizzare la normalizzazione locale sottraendo, alla massima idoneità della propria popolazione, l'idoneità di ciascun individuo, ma ancora una volta sarà necessario correggere l'idoneità massima in modo che non abbia una probabilità nullo.

Ti suggerisco di utilizzare una selezione di torneo che è stata dimostrata più volte meglio della roulette.

2

Potrebbe essere troppo tardi ma, non è consigliabile il max_fitness - fitness poiché si perdono gli elementi peggiori (possono aiutare per l'esplorazione). Invece puoi fare una sorta di inversione.

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

Ha funzionato per me, grazie –

1

Modificare il fitness per fitness_new = 1/fitness_old e si ha di nuovo problema di massimizzazione. Se fitness_old = 0 è possibile, aggiungi 1 al denominatore per evitare una divisione per zero.

Problemi correlati