Discussione sull’articolo "Algoritmi Genetici - È Facile!" - pagina 13
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Nella libreria libera dell'articolo, lavorare con il genotipo. Lavorare con il fenotipo in FF (come nell'esempio 2).
Quanto sopra significa che la libreria funzionerà in modo altrettanto efficiente se il fenotipo viene elaborato in FF, ma il numero di iterazioni (esecuzioni in FF) sarà significativamente più alto rispetto al caso in cui il GA lavori direttamente con il fenotipo (perché lo spazio di ricerca aumenta). Al limite, la ricerca (senza affinamento del fenotipo) tende a uno spazio di ricerca continuo.
Buonasera.
Vorrei ringraziarla per l'ottimo articolo.
All'inizio è stato un po' complicato per me, ma in un certo senso l'ho capito.
Prima di scrivere qualcosa in questo forum, vorrei chiarire se ho capito bene il tuo articolo e il percorso dell'algoritmo UGA:
1)Impostazione dei parametri di ingresso di UGA per un particolare compito.
---UGA
2)Creare una colonia iniziale di genitori combinando casualmente i geni
2.2)Calcolo del risultato di FF per ciascuna colonia
2.3)Rimozione dei cloni.
3)Determinazione del miglior risultato di FF tra tutti gli individui di quella colonia
4) Avvio del ciclo di creazione di una colonia di discendenti dalla prima colonia. I discendenti vengono creati utilizzando gli strumenti: Crossover, mutazione artificiale e naturale, replicazione genica e prestito genico, dove
Crossover - scambio di parti dei cromosomi dei genitori,
Mutazione artificiale - selezione di geni fuori dal range (gene del genitore 1, gene del genitore 2).
Est. Mutazione - selezione di geni fuori dal range (minimo del range di geni, massimo del range di geni).
replicazione - selezione di geni in intervalli vicini ai valori dei geni parentali, ma con un certo offset.
prestito di geni - creazione di un "individuo assemblato" da un numero di genitori pari al numero di geni.
5 )Eliminazione dei cloni
6 )Calcolo del risultato della FF per ciascuna di queste colonie.
7)Confronto dei risultati degli individui discendenti con il risultato di riferimento e sua eventuale sostituzione. in caso di sostituzione viene azzerato il contatore "Epoche senza variazioni del valore di riferimento".
8)Ordinamento di tutti gli individui dal migliore al peggiore.
9) -->voce 4
10)Se non si sono verificate epoche senza variazioni in Y, allora termina ed emette il valore di riferimento trovato.
Mi scuso in anticipo, forse questo è un thread di discussione piuttosto che un tutorial, ma non ho nessun altro posto dove chiedere consigli. In realtà ho incontrato GA per la prima volta nel vostro articolo (prima del vostro articolo, non capivo nemmeno cosa significassero le parole "Fast(algoritmo genetico)" nel tester del terminale), quindi la mia conoscenza ed esperienza (ho iniziato a programmare in MQL5 circa 2 mesi fa) è un po' limitata.
Se capisco il vostro algoritmo GA, cercherò di trapiantarlo in OOP. Per questo, infatti, ho iniziato a studiarlo. Ho già implementato dei modelli di trading che si auto-ottimizzano con la ricerca diretta, ma non ancora con il GA (modelli sul principio descritto nell'articolo https://www.mql5.com/ru/articles/217).
Grazie in anticipo.
mi__x__an:
...Vorrei chiarire se ho capito bene il vostro articolo e il percorso dell'algoritmo UGA.
Buongiorno .
Grazie per la sua pronta risposta.
Allora ho alcune domande.
Che cos'è l'array di cromosomi? Possibili valori del parametro ottimizzato?
Quindi se, ad esempio, ottimizziamo "dimensioneminima del lotto" nell'intervallo da 0,1 a 1 (con un passo minimo di 0,1),
allora l'array avrà il seguente aspetto: {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, numero di geni nel cromosoma 1, minimo 0.1 massimo 1.0, passo 0.1? È così?
E una domanda correlata, come inserire in tale array, ad esempio: Stop Loss ottimizzato [10...500], Take Profit [10...500], Dimensione minima del lotto [0.1...1.0] e flag di trailing (utilizzare o meno il trailing)[0...1]?
In generale, come dovrebbero essere i dati di input quando si ottimizzano parametri con diversi tipi, minimi e massimi di valori possibili?
Grazie in anticipo per la risposta.
Qual è l'array di cromosomi in questo caso? I possibili valori del parametro ottimizzato?
Se, ad esempio, ottimizziamo la "dimensioneminima del lotto" in un intervallo compreso tra 0,1 e 1 (con un passo minimo di 0,1),
allora l'array avrà questo aspetto: {0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}, numero di geni nel cromosoma 1, minimo 0.1 massimo 1.0, passo 0.1? È così?
E una domanda correlata, come inserire in tale array, ad esempio: Stop Loss ottimizzato [10...500], Take Profit [10...500], Dimensione minima del lotto [0.1...1.0] e flag di trailing (utilizzare o meno il trailing)[0...1]?
In generale, come dovrebbero essere i dati di input quando si ottimizzano parametri con diversi tipi, minimi e massimi di valori possibili?
Grazie in anticipo per la risposta.
No,
Chromosome[] è esattamente quello che dice il commento.
Il primo indice [0] è il valore di fitness dell'individuo. Gli altri sono parametri ottimizzati all'interno di un determinato intervallo. Questo è il genotipo.
Lavorare con il fenotipo (stop loss, take profit, volumi, indicatori o altro) in FF (scala dei parametri ottimizzati nell'intervallo dei geni del cromosoma):
Ad esempio, i geni sono impostati nell'intervallo [-1;1], quindi
Indice 0: valore FF <---------------------------------------------------------[8;8]//pivot a Pi/2 otto.
1° indice: Stop loss [10..500] <------------------------------------------------ [-1;1]
2° indice: Take profit [10..500] <--------------------------------------------- [-1;1]
3° indice: Volume minimo del lotto [0,1...1,0] <--------------------------------------- [-1;1]
4° indice: flag di trailing (per utilizzare o meno il trailing)[0..1] <------ [-1;1]
Inoltre, l'array Chromosome[] ha 5 celle. Per esempio, un cromosoma potrebbe avere questo aspetto {0.2, 0.3, -0.8, 0.1, 0.9;}
Ma in questo caso l'elaborazione della correttezza dei valori dei geni non reali dovrà essere effettuata in FF. Cioè, se ottimizziamo i tipi long, double e bool, UGA genererà valori reali per tutti loro, anche per bool ci saranno molte variazioni di geni nell'intervallo da RangeMinimum a RangeMaximum, con l'uso reale possibile di due soli valori 1 e 0. Ho capito bene? E già la selezione dei valori corretti sarà fatta in FF?
Allora il modo migliore per eliminare questo inconveniente, per me personalmente, sarebbe quello di introdurre una funzione di servizio che corregga i valori dei geni dei cromosomi in modo da renderli utilizzabili nel FF.
-->generazione di discendenti -->rettifica dei valori dei geni ai valori effettivamente utilizzabili -->eliminazione dei cloni -->richiamo del FF.
Con questa procedura, pensate che avrà un grande impatto sulle prestazioni di UGA? In fondo, per idea, il numero di esecuzioni di FF dovrebbe essere ridotto se il passo per l'ottimizzazione di un parametro è maggiore di quello per l'altro.
Bene, se questo non è adatto, allora si dovrebbe usare un algoritmo genetico binario (come quello implementato nel tester). C'è un articolo al riguardo sul quarto forum.
No, il punto è diverso. L'algoritmo può essere utilizzato perfettamente anche per questi casi.
mi__x__an:
Ma in questo caso l'elaborazione della correttezza dei valori, non dei geni reali, dovrà essere fatta in FF. Cioè, se ottimizziamo i tipi long, double e bool, UGA genererà valori reali per tutti loro, anche per bool ci saranno molte variazioni di geni nell'intervallo da RangeMinimum a RangeMaximum, con l'uso reale possibile di due soli valori 1 e 0. Ho capito bene? E la selezione dei valori corretti avverrà già in FF?
Tutte le operazioni con il fenotipo dovrebbero essere fatte in FF. Si tratta di decodificare dal genotipo al fenotipo.
Ok, supponiamo che il parametro ottimizzato sia di tipo bool e che siano possibili solo due varianti: true e false. Allora la decodifica sarà qualcosa di simile:
dove gene è un gene specifico di un cromosoma.
Risulta che con tutta la varietà di possibili varianti di questo gene (genotipo) otterremo solo 2 fenotipi. Questo è anche il caso della natura vivente.
Tuttavia, ne consegue una conseguenza naturale: si genereranno più varianti di cromosomi (e quindi si calcolerà più volte il FF) di quanto sia necessario per risolvere il problema. In altre parole, l'ottimizzazione richiederà più tempo. Ne ho già parlato. Sarà lo stesso in caso di codifica binaria dei cromosomi. Si dovrà comunque decodificare in un fenotipo specifico per il compito.
MA. Sia nel caso della codifica binaria che nel caso della rappresentazione dei geni con numeri reali, è molto facile evitare calcoli FF non necessari (per ridurre il numero di possibili varianti cromosomiche) impostando le FASI DI RICERCA e i PASSI per ogni PARAMETRO OTTIMIZZATO. In altre parole, si tagliano in anticipo le varianti di cromosoma non necessarie (questo è già stato fatto nell'ottimizzatore standard con la codifica binaria). Questo può essere fatto anche per il GA dell'articolo, basta aggiungere la funzionalità appropriata - la possibilità di impostare i limiti e i passi per ogni gene, cioè permettere al GA di lavorare direttamente con il fenotipo.
ma la necessità di specificare i confini e il passo per ogni gene della libreria ne riduce la flessibilità.
Quello che probabilmente non è il modo migliore e nemmeno il peggiore l'ho usato nell'ottimizzatore dei modelli di trading:
1 - classe del parametro ottimizzato - ereditatore di CObject
2 - funzione virtuale del modello generale principale:
virtual CList *OptimizatedParams()consente a ciascun modello specifico di creare il proprio elenco di parametri ottimizzati.
3. funzione ottimizzatrice: enumera ricorsivamente tutti i valori necessari.
Tutti i tipi enumerati possono essere gestiti dalla funzione di ottimizzazione.
Ora la domanda: sarebbe razionale creare CList come dati di input in cui le informazioni sul parametro ottimizzato vengono passate attraverso questa classe di parametri ottimizzati, e la libreria UGA stessa crea tutti i confini e i passaggi necessari per ogni gene. In questo modo si avrebbe una maggiore flessibilità e si ridurrebbe il numero di esecuzioni inutili di FF per creare cloni non genetici ma fenotipici.