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

 
shurick:

¡Muchas gracias al autor por la biblioteca!

Añade la línea "cnt++;" en el bucle de la función de búsqueda padre, ¡de lo contrario puede entrar en un bucle eterno!

De hecho, en algunos casos puede haber una situación en la que el bucle puede llegar a ser infinito - cuando sólo hay un individuo en la población.

Gracias por el post, haré los cambios en breve.

PS Lo más probable es que me olvidé de insertar cnt + +, después de todo, es por eso que he introducido esta variable. :)

Recuerdo el deseo de hacer el bucle con el operador for(), para que fuera posible regular la "persistencia" de la búsqueda de diferentes padres, pero luego cambié de opinión, no viendo mucho sentido en ello.

Документация по MQL5: Основы языка / Операторы / Оператор цикла for
Документация по MQL5: Основы языка / Операторы / Оператор цикла for
  • www.mql5.com
Основы языка / Операторы / Оператор цикла for - Документация по MQL5
 
@joo ¿Es posible utilizar su biblioteca para compilar los parámetros de los indicadores Ishimoku, MAKD, etc.?
 
Graff:
@joo ¿Es posible utilizar su biblioteca para la selección de parámetros de los indicadores Ishimoku, MAKD, etc.?

Si preguntas: "¿Para qué tareas de optimización del trader es imposible utilizar la biblioteca?". - entonces no sabría que responder.

Por supuesto que sí.

 
joo:

Si me preguntaras: "¿Para qué tareas de optimización del operador es imposible utilizar la biblioteca?". - entonces no sabría qué responder.

Por supuesto que sí.

Lo siento por una pregunta tonta, yo no soy un programador. Si es posible, por favor, comparta el código, donde su biblioteca se utiliza para que coincida con varios parámetros a un indicador (por ejemplo, Ishimoku, MAKD) para hacer su trabajo claro.
 
Graff:
Lo siento por una pregunta estúpida, no soy un programador. Si es posible, por favor comparta el código, donde su biblioteca se utiliza para seleccionar varios parámetros a un indicador (por ejemplo, Ishimoku, MAKD) para la claridad de su trabajo.

La pregunta no es estúpida en absoluto.

Utilice el segundo ejemplo del artículo. En lugar del indicador ZZ, sustituya cualquier otro. En el lugar de la lectura de los tops ZZ, es necesario escribir sus propias condiciones (MACD, por ejemplo, obtendrá el mismo zigzag alternativo, pero de acuerdo con las reglas que establezca). No hay nada complicado. Pruébalo, escribe el código. Si fallas, haz preguntas, demostrando lugares problemáticos en el código. Los interesados verán formas de resolver sus tareas, tú y todos saldremos beneficiados. Si no quieres aprender el lenguaje, ponte en contacto con"Trabajo".

 

2joo:

¿Podría explicarme la esencia de la función RemovalDuplicates()? La pregunta es la siguiente: Si tenemos dos cromosomas idénticos, ¿deben marcarse ambos como duplicados, o uno de ellos debe permanecer sin marcar como duplicado para su uso posterior?

Además, para acelerar esta función, sugiero que el bucle Ch2 empiece con el valor Ch+1, ya que no tiene sentido que Ch2 empiece desde cero:

      //Выбираем второй из пары...

      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)

y si la respuesta a mi pregunta es que ambos cromosomas se marcan como duplicados, entonces en lugar de:

          if(cnt==GeneCount)
            chromosomeUnique[Ch2]=0;

do:

          if (cnt==GeneCount) {
            chromosomeUnique[Ch]=0;
            chromosomeUnique[Ch2]=0;
          }

Y si la respuesta es que hay que dejar un cromosoma NO marcado como duplicado, entonces el bucle Ch2 debería empezar con el valor Ch+1 de todas formas.

 
shurick:

2joo:

¿Podría explicarme la esencia de la función RemovalDuplicates()? La pregunta es: Si tenemos dos cromosomas idénticos, ¿deben marcarse ambos como duplicados, o uno de ellos debe permanecer sin marcar como duplicado para su uso posterior?

El algoritmo de esta función es el siguiente:

Marcamos todos los cromosomas con la característica de unicidad "1". Pensamos que todos los cromosomas son únicos.

Comprobamos si hay cromosomas idénticos. Para ello, duplicamos virtualmente la población y comparamos todos los cromosomas entre sí, omitiendo los pares con el mismo número de secuencia. Los duplicados encontrados se marcan con la característica de duplicado "0".

A continuación, copiamos todos los cromosomas restantes no marcados como "0" en la matriz temporal. Obtenemos una matriz temporal llena sin huecos, y ya sabemos cuántos cromosomas únicos quedan en la población.

A continuación, lo único que queda por hacer es copiar los cromosomas de nuevo en la población. Como puedes ver, no hay borrado de cromosomas, los cromosomas únicos sólo se desplazan al principio de la población.


Para probar esta función, escriba un script e intente alimentar manualmente combinaciones complicadas de matrices rellenas. Comprobará la eficiencia/ineficiencia de la función. Calcule el menor número posible de comprobaciones de columnas en la matriz y compárelo con el número de veces que la función RemovalDuplicates() comprueba las columnas.

 
joo:

ZY Para probar esta función, escriba un script e intente alimentar manualmente combinaciones complicadas de matrices rellenas. Verá lo efectiva/inefectiva que es la función. Calcule el menor número posible de comprobaciones de columnas en la matriz y compárelo con el número de veces que la función RemovalDuplicates() comprueba las columnas.

Cuando inicie el bucle "for (Ch2=Ch+1)", el número de iteraciones necesarias y suficientes disminuirá en un factor de 2 y medio y uno de los duplicados no se marcará como duplicado. ¡Aquí me preguntaba cuánto más correcto sería dejar un cromosoma de los duplicados como único! Es decir, la tarea de la función es eliminar cromosomas idénticos, pero una copia de los cromosomas duplicados me parece mejor devolverla a la población, porque la presencia de sus duplicados no prueba su vitalidad. Por ejemplo: si hay una matriz de cromosomas {1,3,4,7,7,7,6,7,8,8}, creo que la eliminación óptima de duplicados sería este resultado: {1,3,4,7,6,8}. Así que los cromosomas 7 y 8 serán considerados más adelante.
 
shurick:
Al principio del bucle "for (Ch2=Ch+1)" el número de iteraciones necesarias y suficientes se reducirá 2 veces y uno de los cromosomas duplicados no se marcará como duplicado. ¡Aquí me preguntaba cuánto más correcto sería dejar un cromosoma de los duplicados como único! Es decir, la tarea de la función es eliminar cromosomas idénticos, pero una copia de los cromosomas duplicados me parece mejor devolverla a la población, porque la presencia de sus duplicados no prueba su vitalidad. Por ejemplo: si hay una matriz de cromosomas {1,3,4,7,7,7,6,7,8,8}, creo que la eliminación óptima de duplicados sería este resultado: {1,3,4,7,6,8}. Así que los cromosomas 7 y 8 serán considerados más adelante.

Su comentario anterior sobre cnt ++ era justo. Pero esta vez se equivoca. Te sugiero que no especules sobre "¿Qué pasaría si...?" sino que escribas un script, pruebes la función y demuestres el resultado.

Queda un solo cromosoma único, el resto de sus copias exactas serán reconocidas como duplicados y "borradas".

Esta es probablemente una de las funciones más moscovitas de todo el algoritmo UGA. Es la que más tiempo me ha llevado. Pero no tiene errores.


PD Lo principal es que no se repitan comprobaciones de los mismos cromosomas - esto se hace.

El número de comprobaciones de unicidad es el mínimo necesario. Si te refieres al número de ejecuciones en el operador for(), puedes reducirlas (mientras que el número de comprobaciones de unicidad seguirá siendo el mismo - el mínimo posible) introduciendo una variable adicional, cada vez aumentando en uno en la anidada. Esto ralentizará la función.

PPS Si hace hincapié en:

shurick:

....

¡cuánto más correcto sería dejar un cromosoma de los duplicados único! Es decir, la tarea de la función es eliminar cromosomas idénticos, pero una copia de los cromosomas duplicados me parece mejor devolverla a la población, porque la presencia de sus duplicados no prueba su vitalidad.

El trabajo de la función es eliminar duplicados. Eso es lo que se llama. No se trata de eliminar cromosomas idénticos. ¿Ve la diferencia? Esta función no distingue entre cromosomas basándose en su viabilidad. Como resultado, sólo los cromosomas únicos permanecen en una sola copia sin duplicados.

PPPS Haré una aclaración más por si acaso.

Supongamos que tenemos una población formada por 20 cromosomas (por simplicidad y claridad con un gen entero), problema de maximización:

|7|2|3|9|2|4|5|3|3|5|6|2|4|3|5|10|6|7|7|2|

Es decir, en una población de cromosomas que contiene el gen

2 - 4 piezas

3 - 4 piezas

4 - 2 piezas

5 - 3 piezas

6 - 2 piezas

7 - 3 piezas

9 - 1 pieza

10 - 1 pieza.

Total - 20 piezas de cromosomas.

Después de eliminar los duplicados, la población se verá así, con 8 cromosomas restantes:

|7|2|3|9|4|5|6|10|

Así que queda un cromosoma único, el resto son duplicados y serán "borrados"

después de la llamada a la función.

PopulationRanking();

al final de la función.

RemovalDuplicates()

La población se verá así:

|10|9|7|6|5|4|3|2|

 
joo:

PPPS Voy a hacer otra aclaración por si acaso.

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 donde se muestra la función original y la optimizada, donde se 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. Muchas gracias de nuevo por la biblioteca y por las explicaciones de la función.

Resultado del script de comprobación de optimización de funciones

Archivos adjuntos: