Discussione sull’articolo "Algoritmi Genetici - È Facile!" - pagina 8

 
joo:

1) Cantastorie? Purtroppo non ho colto l'umorismo. Il controllo del database avviene nella funzione CheckHistoryChromosomes(chromos,historyHromosomes ) che viene richiamata da GetFitness(historyHromosomes). Ecco perché ho detto correttamente: non ci sono esecuzioni ripetute di FF.

2) La riconciliazione con il database avviene con un controllo per geni. E ogni gene viene normalizzato da SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) quando compare un nuovo cromosoma. Quindi anche qui niente "favole".

3) Vedere 2)

1,2,3) Capito. Quasi. La normalizzazione c'è davvero, ma non c'è ancora motivo di confrontare numeri reali "senza gap" per l'uguaglianza. :)

SelectInDiscreteSpace() è stato leggermente rielaborato. Non mi piaceva il fatto che si correggesse Step internamente. Non è una questione reale correggere un utente. Almeno non questa volta.

L'utente potrebbe avere delle considerazioni ragionevoli per rendere Step "irrazionale" rispetto all'intervallo di modifiche geniche.

È andata così:

double SelectInDiscreteSpace
(
double In, 
double InMin, 
double InMax, 
double step, 
int    RoundMode
)
{
  if (step==0.0)
    return(In);
  // assicurarsi che i confini siano corretti
  if ( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // se violato, restituire il confine violato
  if ( In < InMin ) return( InMin );
// se ( In > InMax ) return( InMax ); // E faremo questo alla fine, всё равно придётся
  if ( InMax == InMin || step <= 0.0 ) return( InMin );
  // portare a una determinata scala
// step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );  // No, non lo porteremo alla "scala data".
  switch ( RoundMode )
  {
  case 1:  In = ( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  In = ( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: In = ( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
  return fmin(In,InMax);
}
 
MetaDriver:

SelectInDiscreteSpace() è stato leggermente modificato. Non mi piace che si corregga Step all'interno. Non è compito del re correggere un utente. Almeno non questa volta.

L'utente potrebbe avere delle considerazioni ragionevoli per rendere Step "irrazionale" rispetto all'intervallo di modifiche del gene.

Sentite questa:

Il fatto è che Step può essere tale da dividere lo spazio in un numero non intero di sezioni, e questo non va bene, perché sorge immediatamente la domanda da quale lato del numero in ingresso "afferrare" il valore sulla riga numerica (non si sa cosa sia "giusto", destra o sinistra) - il mio algoritmo dà una risposta adeguata, ma il vostro, ahimè. Ecco perché è necessario farlo in questo modo:

step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );

Ecco alcuni esempi comparativi dei risultati del vostro codice e del mio:



Risultato


Il mio Il tuo
In 2,2 2 2
InMIN 2
InMAX 3
Passo 0,8






Risultato


Il mio Il tuo
In 2,8 3 2,8
InMIN 2
InMAX 3
Passo 0,8






Risultato


Il mio Il tuo
In 2,2 2,25 2,3
InMIN 2
InMAX 3
Passo 0,3
 
Il significato di tale normalizzazione è diverso da quello di NormalizeDouble (), ma è a discrezione del proprietario che, se non lo gradisce, può usare la normalizzazione al segno richiesto, non con un passo specificato come in SelectInDiscreteSpace().
 
joo:
Il significato di tale normalizzazione è diverso da NormalizeDouble (), ma è a discrezione del proprietario che, se non lo gradisce, può utilizzare la normalizzazione al segno richiesto, non con un passo specificato come in SelectInDiscreteSpace().

È tutto chiaro, proprio come nel post precedente.

Andrei, tutte le varianti elencate hanno il diritto di esistere qui. Anche la vostra, ovviamente. La discretizzazione fluttuante e mutevole durante l'ottimizzazione merita molta attenzione.

--

Su tutto in generale:

Si dovrebbero aggiungere impostazioni, una libreria di operatori genetici, ecc. e si dovrebbe pensare in anticipo a estensioni e utilizzi convenienti.

Sto pensando di riscrivere tutto sugli oggetti, di creare un'interfaccia più potente sia per il programma che per l'utente (grafica, con molte impostazioni in schede). Alcune cose sono da aggiungere, altre da cooptimizzare.

Più precisamente, sto ancora pensando se farlo basare sul vostro codice (usare i frammenti) o riscriverlo da capo.

Se volete partecipare, scrivetemi in privato.

Non è detto che lo pubblicherò. Vedremo. Per ora voglio farlo per me stesso.

 
MetaDriver:

Su tutto in generale:

1) In senso positivo - è necessario aggiungere personalizzazioni, una libreria di operatori genetici, ecc. e pensare in anticipo a un'estensione e a un utilizzo convenienti.

2) Più precisamente, sto ancora pensando se farlo basare sul tuo codice (usare frammenti) o riscriverlo da capo.

3) Se vuoi partecipare, scrivi in privato.

1) Al contrario, sto cercando di ridurre il numero di parametri UGA senza ridurre la flessibilità del controllo.

2) Conosco diverse persone che utilizzano il codice dell'articolo nei loro progetti così com'è, e altre che hanno riscritto il codice da 0.

3) Ti ho scritto in un messaggio privato.

 
MetaDriver:

Tutto questo è comprensibile, proprio come il post precedente.

Andrei, tutte le opzioni qui elencate hanno il diritto di esistere. Anche le vostre, ovviamente. La discretizzazione fluttuante, che cambia durante il processo di ottimizzazione, merita molta attenzione.

--

Su tutto in generale :

Si dovrebbero aggiungere impostazioni, una libreria di operatori genetici, ecc. e si dovrebbe pensare in anticipo a estensioni e utilizzi convenienti.

Sto pensando di riscrivere tutto sugli oggetti, di creare un'interfaccia più potente, sia per il programma che per l'utente (grafica, con molte impostazioni in schede). Alcune cose da aggiungere, altre da cooptimizzare.

Più precisamente, sto ancora pensando se basarmi sul tuo codice (usare i frammenti) o riscrivere tutto da capo.

...

Vladimir, vuoi pedalare o guidare?

Vuoi un codice bello o vuoi costruire una GA più bella di quella del tester?

Personalmente penso che quello del tester sia abbastanza bello, ma ci sono pochi parametri.
.

 
Urain:

Vladimir, vuoi guidare o guidare?

Vuoi un bel codice o costruire un GA più fresco di quello del tester?

Personalmente penso che quello del tester sia piuttosto bello, solo una sfumatura non è un parametro sufficiente.
.

Voglio un codice conveniente. Facile da usare, estendere, modificare e incorporare.

 
MetaDriver:

Voglio un codice conveniente. Facile da usare, estendere, modificare e incorporare.

Quindi descrivere il modello a oggetti di GA. Creare classi vuote secondo il modello descritto, quindi riempirle di codice e prescrivere l'interazione.
 

Sostituire la riga 175 con.

        NormalizeDouble((double)SumOfCurrentEpoch/MathMax(1,(double)resetCounterFF),2),

Senza questo, il rapporto di lavoro fallisce con un errore.

 
Rich:

Sostituita la riga 175 con.

Senza questo, il report dell'operazione fallirà con un errore.

Sì, si verifica un errore di divisione per 0 se non c'è stato alcun miglioramento per un determinato numero di epoche dalla prima esecuzione del ciclo dell'operatore gen.

È più semplice e logicamente corretto assegnare 1 alla variabile resetCounterFF immediatamente all'inizializzazione:

int    resetCounterFF   =1;// Contatore di azzeramento "Epoche senza miglioramento