Discusión sobre el artículo "Algoritmos Genéticos: ¡Es fácil!" - página 5

 
shurick:

Muchas gracias por la aclaración, la pregunta sobre la eliminación de duplicados está totalmente respondida a mi satisfacción. Adjunto el código del script que muestra la función original y la optimizada, que demuestra la reducción del número de pasadas en los bucles. En mi comentario actual NO estoy señalando un error en la función, sino sugiriendo su optimización, y mi objetivo principal era averiguar el principio de la eliminación de duplicados, a lo que he recibido una respuesta completa. Una vez más, muchas gracias por la biblioteca y por la aclaración de la función.

110 y 160 son demasiado para 20 cromosomas.... Has puesto el contador en el lugar equivocado.

Ese es el lugar correcto:

//Seleccione el segundo del par....
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG cuenta cuantas veces pasamos los ciclos Ch y Ch2
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // DEBUG cuenta cuantas veces comparamos cromosomas.
          //Pongamos a cero el recuento del número de genes idénticos
          cnt=0;
          //Comprueba los genes, siempre y cuando los genes sean los mismos.
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //Si el número de genes idénticos es igual al número total de genes
          //...el cromosoma se reconoce como duplicado.
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

OK. Ahora prueba con la misma población, con los mismos cromosomas, pero en esta secuencia:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

¿Qué observamos?

 

a Shurick:

Efectivamente. El número de comprobaciones de unicidad, con todos los cromosomas diferentes, puede calcularse mediante la fórmula

(PopulChromosCount^2-PopulChromosCount)/2

En nuestro ejemplo, que tiene 20 cromosomas (suponiendo que todos los cromosomas son diferentes), el número de comprobaciones sería:

(20*20-20)/2=190

esto se confirma con esta comprobación

int  m_init[20]  = {1,2,3,4,5,6,6,7,8,9,9,10,11,12,13,14,15,16,17,18,19,20};

Si se detectan duplicados, habrá aún menos comprobaciones.

Gracias por su participación activa en el proyecto.

Se introducirán los cambios oportunos en la biblioteca. Aunque los cambios no afectarán a la capacidad de búsqueda del algoritmo, harán que su trabajo sea más racional.

 
joo:

¿Qué estamos viendo?

Resultado

Aunque los cambios no afectarán en nada a la capacidad de búsqueda del algoritmo

Toda la razón, la calidad del algoritmo no cambiará, aunque inicialmente lo dudaba, pero ahora me lo has demostrado, pero sobre estas dudas encontrado un método de optimización :)

 
Biblioteca UGA actualizada y ejemplos al artículo. Actual versión libre de autor 1.2.1.
Archivos adjuntos:
 
Actualizar Biblioteca UGA y ejemplos para este artículo. Versión actual de autoría libre 1.2.1.
Archivos adjuntos:
 

He estudiado el artículo y en el código he encontrado una incoherencia de este tipo, en dos funciones para obtener valores de rangos se utiliza la misma fórmula:

//Replicación
void Replication
...
    //Establezcamos los límites para crear un nuevo gen
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// Mutación artificial.
void ArtificialMutation
...
    //Establezcamos los límites para crear un nuevo gen
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

Es decir, se obtienen datos fuera de los valores de dos genes, lo cual es característico de la "mutación artificial". ¿Se trata de un error o hay otra explicación?

Me parece que para el método de replicación es necesario cambiar los signos:

Mínimo = C1+((C2-C1)*ReplicationOffset);

Máximo = C2-((C2-C1)*DesplazamientoDeReplicación);


 
Batohov:

He estudiado el artículo y he encontrado esta incoherencia en el código, dos funciones utilizan la misma fórmula para obtener valores de rango:

Es decir, se obtienen datos fuera de los valores de dos genes, lo que es característico de la "mutación artificial". ¿Se trata de un error o hay otra explicación?

Me parece que para el método de replicación es necesario cambiar los signos:

Mínimo = C1+((C2-C1)*ReplicationOffset);

Máximo = C2-((C2-C1)*DesplazamientoReplicación);

No hay ningún error ni incoherencia. Tanto en la replicación como en la mutación artificial los límites de aparición probable de un nuevo gen (las secciones de código que has citado) se definen de la misma manera.

Pero para la replicación el área de probabilidad se encuentra dentro de estos límites, y para la mutación artificial - más allá de estos límites.

La replicación sirve para transferir rasgos característicos de los genes de ambos progenitores (dentro de los límites).

La mutación artificial sirve para generar nuevos genes diferentes de los de los progenitores (fuera de los límites).

 
joo:

No hay error ni incoherencia. Tanto en la replicación como en la mutación artificial, los límites de la aparición probable de un nuevo gen (las secciones de código que has citado) se definen de la misma manera.

Pero para la replicación el área de probabilidad se encuentra dentro de estos límites, y para la mutación artificial - más allá de estos límites.

La replicación sirve para transferir rasgos característicos de los genes de ambos progenitores (dentro de los límites).

La mutación artificial sirve para generar nuevos genes diferentes de los de los padres (fuera de los límites).

Gracias por su rápida respuesta, comprendo su línea de pensamiento.
 
joo:

Por cierto, es muy agradable ser el destructor de uno de los mitos más famosos de los comerciantes relacionados con ZZ (la segunda tarea del artículo). :)

Por lo visto, no he entendido el enunciado de la tarea. Mi declaración:

Los puntos de entrada para el máximo beneficio con la condición de que el min. trade sea de N pips, se encuentran en las cimas del ZigZag con la condición de min. rodilla N + Spread pips.

 
joo:

He publicado algunas funciones de prueba interesantes en el hilo del foro MQL4 "Prueba de la función multiextrema multivariable", una de ellas se presenta en el artículo.

Si lo desea, puede tratar de encontrar extremos de las funciones propuestas utilizando otros algoritmos de optimización distintos de GA y publicar los resultados aquí. Le invitamos a hacerlo. Será interesante para todos y para mí en primer lugar.

Me doy cuenta de que es muy importante evaluar la validez del ajuste. Uno de los métodos consiste en añadir ruido a los datos originales.

Los códigos fuente de los métodos de optimización alternativos se encuentran aquí(http://alglib.sources.ru/optimization/) y aquí(http://ool.sourceforge.net/).

Obviamente, cada algoritmo de optimización funciona mejor con sus propias clases de funciones objetivo.

¿Qué funciones objetivo utiliza usted en la práctica?