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

 
Alexey_74:

Andrew, una pregunta más.

¿Podemos decir que esos valores de las variables son adecuados para la mayoría de los problemas de optimización?

Sí.

Los valores se toman con cierta "reserva" para aumentar la buscabilidad (cobertura del campo de búsqueda). Para obtener valores más precisos (pero se reduce la probabilidad de encontrar un extremo global), se pueden reducir los parámetros de mutación y el coeficiente de desplazamiento del límite del intervalo.

 
Alexey_74:

Andrew, una pregunta más.

¿Podemos decir que tales valores de estas variables son adecuados para la mayoría de los problemas de optimización? Como dicen en algunas fuentes "... el 90% de los problemas se pueden resolver con un perceptrón convencional".

ZAGASTE GA :)

El algoritmo es single-threaded, puede ser fácilmente integrado en un Expert Advisor, ejecutarlo en un tester y organizar competiciones entre GAs boo-gah-gah.

 

Maravilloso.

Andrei, sabes, me sorprende mi descaro, pero tengo que expresar algunas "críticas" ))

La función ServiceFunction() se llama en tres sitios en el código UGA. Pero esto no sirve de nada. Por supuesto, se puede ver la dinámica en la pantalla, pero es tan rápida que no se puede ver y evaluar de todos modos. Puedes eliminar su llamada en el cuerpo de UGA(). Basta con llamarlo una vez después de llamar a UGA().

"... y el violinista es innecesario, sólo consume combustible extra" (kin dza dza (c))

  ts=GetTickCount();
  UGA( ... );
  ts=GetTickCount()-ts;
  ServiceFunction();
 
De nuevo, no es crucial. por eso es una función de servicio, puedes usarla para depuración, visualización u otra cosa, o puedes no usarla en absoluto, a quien le guste. :)
 

Hice un experimento. Hice una suma de tres sinusoides con "frecuencias" 47, 81, 187. Obtuve lo siguiente

Luego inicié la búsqueda por enumeración directa (3 ciclos, 2 anidados), aunque con interrupción cuando el valor del coeficiente de correlación = 1,0. Sin esta condición, toda esta tontería habría llevado mucho más tiempo. Pero así se hizo en 375 segundos (algo más de 6 minutos).

El AG lo hizo en 2 segundos. ))

Pero hay una pregunta. Aquí está el resultado.

Últimos 2 dígitos: 2747 - número de llamadas FF; 506 - número de "estados" cuando el coeficiente de correlación r era igual a 1,0. Resulta que el algoritmo podría haber funcionado aún más rápido, porque r no puede ser mayor que 1,0 y después del primer alcance de r=1 la tarea se considera completada. Pero el algoritmo alcanzó el estado r=1,0 506 veces.

Estos fueron los parámetros

parámetros

Y este FF.

void FitnessFunction(int chromos)
{
  int cnt = 1;

  while(cnt<=GeneCount)
  {
    F1=Colony[cnt][chromos]; cnt++;
    F2=Colony[cnt][chromos]; cnt++;
    F3=Colony[cnt][chromos]; cnt++;

    Fill(sum);
    r=Pirson(sin,sum,nobs);
    if(r>0.99999999) count++;
  }
  AmountStartsFF++;

  Colony[0][chromos]=r;
}

Pregunta - ¿hay alguna manera de explicar al algoritmo que (a veces) es posible (necesario) terminar antes. ¿O no hay que hacerlo categóricamente y esperar a que se alcance la convergencia?

 

Hace tiempo que quería saber la respuesta a la pregunta "cuántos". Esta vez he cogido un impulso y le he puesto 50 sinusoides. El rango de valores es 1-500. Así que, si no me equivoco, la búsqueda directa da como resultado 500^50, es decir, 8,88178419700121252323333890533447266e+134 iteraciones (si mi calculadora no me ha mentido). Está claro que no es posible convertir a segundos (minutos, horas, días, años). Sólo los descendientes lejanos verían el resultado. El AG lo hizo en 1 hora. 20 minutos. Vaya. Además, resultó que el coeficiente de correlación de la suma de 50 sinusoides con el impulso es 0,5275. ¿Por qué"además"? Porque no he tenido ni una sola oportunidad de comprobar este punto antes. Y en algunos casos, sugiere algunos pensamientos.....

No me he fijado en las sinusoides, es que lo tengo todo a mano. Además, como el objetivo es conseguir la máxima similitud de las señales continuas, el resultado es esta misma similitud, es decir, el resultado es inequívoco, además de fácilmente verificable.

Andrey, muchas gracias por tu Producto. Me gustaría leer otro artículo tuyo en un futuro próximo. GA con selección de élite. ))

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Alexey_74:
...

Pregunta - ¿hay alguna manera de explicar al algoritmo que (a veces) es posible terminar antes. ¿O no se debe hacer categóricamente, y hay que esperar hasta que se alcance la convergencia?

Es posible. E incluso necesario. Si sabes algo sobre la función en estudio (como en tu problema: FF<=1), deberías utilizar activamente esta información para evitar cálculos innecesarios y reducir así el tiempo de búsqueda.

En esta implementación no hay palancas para controlar el algoritmo desde el exterior, pero basta con añadir una función para controlar la bandera de parada forzada.

En la próxima generación del algoritmo, sobre la que se está preparando un artículo secuela, hay muchas más posibilidades de controlar el algoritmo desde el exterior (en general, funciona en la iniciación y bajo el control desde el exterior, y no como ahora - FF es iniciado por el propio algoritmo, por lo que no hay posibilidad de utilizarlo en búhos de auto-optimización sin modificación).

 
Alexey_74:

....

Andrew, muchas gracias de nuevo por tu producto. Me gustaría acreditar otro de sus artículos en un futuro próximo. GA con la selección de élite. ))

Gracias por el agradecimiento. :)

Habrá una secuela, seguro.

Y, ¡buena suerte en la búsqueda del óptimo! En la vida, en el trabajo, en l... Todo.

 
Tengo miedo de preguntar.... )) ¿Lo he entendido bien? ¿La próxima generación del algoritmo puede formalizarse como una DLL?