No para los desarrolladores de MT. ¿Por qué sustituir INIT_PARAMETERS_INCORRECT?

 

Me he encontrado con este problema: según la lógica del programa, es necesario cribar las llamadas a funciones no válidas. Para ello utilizo INIT_PARAMETERS_INCORRECT. Pero la optimización genética se detiene prácticamente de inmediato. Los promotores se enfadan con las preguntas relacionadas con esta situación. Aconsejan estudiar el análisis genético, etc.

¿Pero para qué lo necesito? Yo, como usuario, quiero obtener resultados y no me importa cómo funciona.

Así pues, he aquí un ejemplo sobre tres funciones 1, 2 y 3. El 0 no se debe utilizar.

En una cadena, las funciones no deben repetirse y no debe haber un 0 entre las funciones (de lo contrario puede haber repeticiones).

Un ejemplo de cadenas permitidas:

  • 100
  • 120
  • 130
  • 123
  • 132
  • 2..
  • 3..

Ejemplo de cadenas inaceptables:

  • 010
  • 001
  • 110
  • 101
  • 111
  • 121
  • 122
  • 131
  • 133
  • 112
  • 113
  • 102
  • 103
  • 2..
  • 3..
Como puede ver, hay un orden de magnitud más de cadenas inválidas que de cadenas válidas. ¿Cómo realizar un muestreo? ¿Cómo sustituir INIT_PARAMETERS_INCORRECT? ¿Dónde cavo?

 
Cancela los cálculos en las funciones de encendido si los parámetros son zurdos. Las ejecuciones serán más lentas queINIT_PARAMETERS_INCORRECT, pero no significativamente.
 
¿Cómo es eso? ¿Puedo darle un pequeño ejemplo?
 

¿Podría ser más explícito sobre los posibles conjuntos de parámetros de entrada, los conjuntos indeseables y por qué hay demasiados conjuntos indeseables?

Estoy totalmente de acuerdo con los desarrolladores en que no debería haber demasiados conjuntos indeseables. Lo óptimo es no superar el 10%.

 
Сергей Таболин:
¿Cómo es eso? ¿Puedo darle un pequeño ejemplo?

fxsaber tiene razón.

Si se introduce un conjunto incorrecto de parámetros - se devuelven todas las funciones OnTick() a la vez. Y onTester - devuelve el resultado mínimo.

 
Сергей Таболин:
¿Cómo es eso? ¿Puedo darle un pequeño ejemplo?
input int i = 0; 

bool Incorrect;
 
int OnInit()
{
  Incorrect = !i; // нулевое значение считается некорректным (пример)
  
//  return(Incorrect ? INIT_PARAMETERS_INCORRECT : INIT_SUCCEEDED); // Было
  return(INIT_SUCCEEDED);
}

void OnTick()
{
  if (Incorrect)
    return;
    
  // ...
}
 
No se trata de conjuntos de parámetros de entrada. Son un conjunto de funciones que no deben repetirse. En la optimización lenta, INIT_PARAMETERS_INCORRECT realmente ayuda a construir cadenas válidas para llamar a estas funciones, pero tengo 6 de ellas. Tengo 117649 variantes de cadena. Pero estas cadenas son inútiles sin algunos parámetros de entrada. Con ellos, ¡ya tenemos más de 38.000.000! No hay manera de evitarlo con la fuerza bruta lenta.
 
Сергей Таболин:
No se trata de conjuntos de parámetros de entrada. Es un conjunto de funciones que no debe repetirse. En la optimización lenta INIT_PARAMETERS_INCORRECT realmente ayuda a construir cadenas válidas para llamar a estas funciones, pero tengo 6 de ellas. Tengo 117649 variantes de cadena. Pero estas cadenas son inútiles sin algunos parámetros de entrada. Con ellos, ¡ya tenemos más de 38.000.000! No hay manera de evitarlo con la fuerza bruta lenta.

La genética morirá porque la superficie de optimización del criterio de optimización debe ser más o menos continua (suave). En tu caso, sin embargo, obtienes un gran número de picos (fallos).


Puedes configurar el siguiente experimento. Tome el Asesor Experto estándar y agregue algunos parámetros adicionales para la optimización allí - falsos. Haciendo que el 90% de sus conjuntos sean INCORRECTOS. GA morirá. Aunque lo hará bastante bien sin parámetros falsos.

 
fxsaber:

Lo tengo. Sólo es cuestión de seleccionar las funciones adecuadas y su orden en el optimizador. Y escribir manualmente todas las cadenas inadecuadas.... ¿Y cómo los encontrará entonces el optimizador?

 
fxsaber:

La genética morirá porque la superficie de optimización del criterio de optimización debe ser más o menos continua (suave). En tu caso, sin embargo, obtienes un gran número de picos (caídas).

Entiendo esto. No entiendo sólo cómo evitarlo?

 
Сергей Таболин:

Lo entiendo. Lo que no entiendo es cómo evitarlo.

Una receta es que los desarrolladores traten el resultado de las pasadas INCORRECTAS como la pasada CORRECTA más cercana calculada previamente. Esto igualará los agujeros en la superficie de optimización.

Razón de la queja: