Campeonato de optimización de algoritmos. - página 53

 
Andrey Dik:

Script de prueba en la primera versión del algoritmo:

Para una función tan sencilla, han complicado demasiado la interfaz. Un montón de exportaciones innecesarias, mientras que las cosas necesarias están ausentes. No puedo entender su código de inmediato, puedo imaginar cómo se sienten las personas que no son tan buenas en la programación.

Ahora pensaré y propondré mi propia versión de exportación simplificada y operación de script de prueba.

 

Tal vez el enfoque "evolutivo" de la búsqueda de valores de los parámetros de la ecuación FF no tenga por objeto mejorar la eficacia de la búsqueda de valores, sino más bien modelar por software el proceso de evolución.

Bueno, como la evolución está representada por los científicos...

El enfoque es muy consistente en su conformidad con todos los cánones evolutivos...

 

Propuesta:

1. una función de aptitud toma una matriz de parámetros de tipo double y devuelve un número cuanto mayor sea la elección de los parámetros. El prototipo de la función de aptitud es el siguiente:

double FF(double &array[]);

2. La función de fitness tiene algunos parámetros, que se especifican en la estructura FitnessParams. A continuación se describe la estructura:

//+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int      limit_runs;          // Максимально допустимое количество вызовов FF
   int      count_params;        // Количество параметров, которое необходимо оптимизировать
   int      current_runs;        // Текущее количество вызовов функции
   double   current_max_value;   // Текущее найденное максимальное значение
   double   step_value;          // Минимальный шаг изменения параметра. 
   double   max_value;           // Максимальное значение, которое может принимать параметр
   double   min_value;           // Минимальное значение, которое может принимать параметр
   FitnessParams(void);
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams(void) : limit_runs(1000),
                                   count_params(2),
                                   step_value(0.1),
                                   max_value(10.0),
                                   min_value(-10.0),
                                   current_runs(0)
                                   
{
   current_max_value = min_value;
}

3. La función de aptitud y sus parámetros están protegidos de influencias externas y se almacenan en una biblioteca independiente..\NScripts\\FF\\FF.ex5. Los valores de los parámetros de la función de aptitud y su algoritmo en sí se establecen en el momento de la compilación por un árbitro independiente y ya no pueden ser modificados por nadie.

4. Un algoritmo de optimización personalizado y un script de comprobación pueden encontrar los parámetros de una función de aptitud. Para ello, el archivo Export.mqh contiene los prototipos necesarios de esta función y sus parámetros. Para obtener los parámetros FF, se utiliza la función de exportación, que también se encuentra en ...\NScripts\\FF\FF.ex5:

void   GetFitnessParams(FitnessParams& params);

5. El algoritmo de optimización del usuario se encuentra en una librería de usuario separada y cerrada..\N-Scripts\N-EncontrarExtremo.ex5 y se compila por separado, en el lado del usuario. La función FindExtremum debe exportarse a la biblioteca del usuario. Esta función será llamada por el script de comprobación. El prototipo completo de la función se indica a continuación:

//+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum(void);
#import

6. El script de comprobación carga en su espacio de direcciones la librería de la función de fitness ..\Scripts\\FF\FF.ex5 con sus parámetros, y la librería del miembro Find Extremum..\Scripts\FF\UserFindExtremum.ex5. Después llama a la función miembro FindExtremum.

7. una vez ejecutada la función participante, la secuencia de comandos de comprobación consulta los parámetros de la función de aptitud, que contienen el valor máximo encontrado por la función participante y el número de llamadas que ha necesitado para encontrar ese máximo. A partir de estos datos, se genera un informe del resultado del participante en forma de tabla:

2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      ———————————————————————————————————————————
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Максимальное найденное значение: 3.1
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Досрочное выполнение алгритма: НЕТ
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Вызовов фитнес-функции потребовалось: 1001
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Поиск экстремума выполнен за 0 мсек.

Enel siguiente post se adjuntarán los archivos necesarios y un ejemplo de uso

 

Archivo Export.mqh: lista de funciones disponibles y estructura de parámetros común a todos los participantes

//+------------------------------------------------------------------+
//|                                                       Export.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "https://www.mql5.com/ru/users/c-4"
//+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int      limit_runs;          // Максимально допустимое количество вызовов FF
   int      count_params;        // Количество параметров, которое необходимо оптимизировать
   int      current_runs;        // Текущее количество вызовов функции
   double   current_max_value;   // Текущее найденное максимальное значение
   double   step_value;          // Шаг значений или дискретность. 
   double   max_value;           // Максимальное значение, которое может принимать ff-функция
   double   min_value;           // Минимальное значение, которое может принимать ff-функция
   FitnessParams(void);
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams(void) : limit_runs(1000),
                                   count_params(2),
                                   step_value(0.1),
                                   max_value(10.0),
                                   min_value(-10.0),
                                   current_runs(0)
                                   
{
   current_max_value = min_value;
}
//+------------------------------------------------------------------+
//| Экспорт библиотеки фитнесс-функций                               |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\FF.ex5"
   double FF(double &array[]);                       // Фитнес-функция, возвращающая значение тем больше, чем лучше подобраны значения в массиве array
   void   GetFitnessParams(FitnessParams& params);   // Возвращает параметры фитнесс-функции в виде структуры FitnessParams
#import
//+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum(void);
#import

Archivo FF.mq5 - ejemplo de una función de aptitud como biblioteca.

//+------------------------------------------------------------------+
//|                                                           FF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "https://www.mql5.com/ru/users/c-4"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Параметры фитнесс-функции, с которыми необходимо ознакомится     |
//| алгоритму поиска до начала работы. Получить эти параметры можно  |
//| с помощью функции GetFitnessParams                               |
//+------------------------------------------------------------------+
static FitnessParams FParams;
//+------------------------------------------------------------------+
//| Фитнес-функция, возвращающая значение тем больше, чем лучше      |
//| подобраны значения в массиве array                               |
//+------------------------------------------------------------------+
double FF(double &array[]) export
{ 
   if(FParams.current_runs > FParams.limit_runs)
      return FParams.min_value;
   FParams.current_runs++;
   if(ArraySize (array) < FParams.count_params)
      return FParams.min_value; 
   double ff_value = (-(pow (2.4 + array [0], 2.0) + pow (array [1] - 2.3, 2.0))+3.1415926);
   if(ff_value > FParams.current_max_value)
      FParams.current_max_value = ff_value;
   return ff_value;
}
//+------------------------------------------------------------------+
//| Возвращает параметры фитнесс-функции                             |
//+------------------------------------------------------------------+
void GetFitnessParams(FitnessParams& params)export
{
   params = FParams;
}
//+------------------------------------------------------------------+

Archivo TestFF.mq5 - comprobación del algoritmo en forma de script

//+------------------------------------------------------------------+
//|                                                       TestFF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uint begin_tiks = GetTickCount();
   // Вызываем пользовательскую функцию поиска экстремума фитнес-функции
   FindExtremum();            
   uint end_tiks = GetTickCount();
   // Получаем результаты поиска в качестве комплексного параметра
   FitnessParams params;      
   GetFitnessParams(params);
   // Подготавливаем отчет
   string yesno_count = params.current_runs >= params.limit_runs ? "НЕТ" : "ДА";
   printf("Поиск экстремума выполнен за " + (string)(end_tiks - begin_tiks) + " мсек.");
   printf("Вызовов фитнес-функции потребовалось: " + (string)params.current_runs);
   printf("Досрочное выполнение алгритма: " + yesno_count);
   printf("Максимальное найденное значение: " + DoubleToString(params.current_max_value, 1));
   printf("——————————————————————");
}
//+------------------------------------------------------------------+

Archivo UserFindExtremum.mq5 - función personalizada para la búsqueda de un extremo en forma de biblioteca. Se utiliza como ejemplo una búsqueda aleatoria

//+------------------------------------------------------------------+
//|                                             UserFindExtremum.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Алгоритм поиска экстремума, который будет вызван проверяющим    |
//| скриптом                                                         |
//+------------------------------------------------------------------+
void FindExtremum(void)export
{
   FitnessParams params;
   while(params.current_runs < params.limit_runs)
   {
      GetFitnessParams(params);
      if(params.current_max_value >= params.max_value)
         break;
      double values[];
      ArrayResize(values, params.count_params);
      for(int i = 0; i < params.count_params; i++) 
      {
        double random = RandomDouble(params.min_value, params.max_value);
        values[i] = SeInDiSp (random, params.min_value, params.max_value, params.step_value);
      }
      FF(values);
   }
}
//+------------------------------------------------------------------+
//| Выбор в дескретном пространстве                                  |
//+------------------------------------------------------------------+
double SeInDiSp (double in, double inMin, double inMax, double step) 
{ 
  if(in <= inMin) 
    return (inMin); 
  if(in >= inMax) 
    return (inMax); 
  if(step == 0.0) 
    return (in); 
  else 
    return (inMin + step * (double)MathRound ((in - inMin) / step));
}

//+------------------------------------------------------------------+
//| ГСЧ в заданном интервале                                         |
//+------------------------------------------------------------------+
double RandomDouble(double min, double max) 
{ 
   if(min == max) 
     return (min); 
   double Min, Max; 
   if(min > max) 
   {
     Min = max; 
     Max = min;
   }
   else 
   {
     Min = min; 
     Max = max;
   }
   return (double(Min + ((Max - Min) * (double)MathRand () / 32767.0)));
}
Archivos adjuntos:
Export.mqh  3 kb
FF.mq5  2 kb
TestFF.mq5  2 kb
 
Vasiliy Sokolov:

Archivo Export.mqh: lista de funciones disponibles y estructura de parámetros común a todos los participantes

Archivo FF.mq5 - ejemplo de una función de aptitud como biblioteca.

Archivo TestFF.mq5 - comprobación del algoritmo en forma de script

Archivo UserFindExtremum.mq5 - función personalizada para la búsqueda de un extremo en forma de biblioteca. Se utiliza como ejemplo una búsqueda aleatoria

Todos los ejemplos son muy claros y comprensibles. Muchas gracias por su trabajo. )
 
Vasiliy Sokolov:

Para una función tan sencilla, han complicado demasiado la interfaz. Un montón de exportaciones innecesarias, mientras que las cosas necesarias por el contrario faltan. No he entendido tu código a la primera, me imagino lo que siente la gente que no es tan buena programando.

Lo pensaré y propondré mi propia versión de exportación simplificada y script de prueba.

¿Por qué no es necesario?

¿Qué tipo de cosas faltan?

Después de todo, no sólo para hacer la vida lo más difícil posible para los participantes, así que lo hice todo, y no el primer día pensé en todo, y ni siquiera el segundo.

 
Andrey Dik:

¿Por qué no las correctas?

¿Cuáles son los que faltan?

Después de todo, no sólo para hacer la vida lo más difícil posible para los participantes por lo que hice todo, y no el primer día que pensé en todo, y ni siquiera el segundo.

Andrew, no sé los demás, pero personalmente me ha gustado más el ejemplo de Vasily. No te ofendas. Esto es sólo mi percepción subjetiva.

Para ser justos, propongo someter a votación la cuestión de la elección de una interfaz de conexión (la tuya o la de Vasiliy).

¿Qué te parece?

 
Реter Konow:

Andrew, no sé los demás, pero personalmente me ha gustado más el ejemplo de Vasily. No te ofendas. Es sólo mi percepción subjetiva...

Para ser justos, propongo someter a votación la cuestión de la elección de una interfaz de conexión (la tuya o la de Vasiliy).

¿Qué te parece?

¿Qué le gusta más exactamente?
Y el ejemplo de Vassily al segundo tipo de conexión, ¿y dónde en el primero?
 
Andrey Dik:

¿Por qué no las correctas?

¿Cuáles son los que faltan?

No se trata de complicar la vida al máximo a los participantes, así lo hice yo, y no fue el primer día que lo pensé, ni siquiera el segundo.

En su ejemplo, la tarea de búsqueda se delega parcialmente en el script de comprobación. Esto es incorrecto. El script de comprobación debe llamar a la búsqueda y comprobar su resultado y nada más.

No todos los parámetros FF están disponibles. Por ejemplo, ¿cómo obtener el paso del parámetro (valor 0,1), el máximo y el mínimo posibles? Es genial, por supuesto, que cada usuario lea este foro y entienda que el paso resulta ser 0,1, el mínimo -10,0 y el máximo +10,0, luego introduzca estas constantes en su código y espere que la función FF piense lo mismo. Pero esta no es la manera de hacerlo de forma correcta.

Muchas funciones de exportación, como ServiceFunc1, sólo se utilizan en algoritmos de búsqueda específicos. Por ejemplo, no deben utilizarse en la búsqueda aleatoria. Entonces, ¿por qué una biblioteca de usuarios debería exportarlos? Basta con separar la tarea de comprobación de la de búsqueda para darse cuenta de que toda esta complicada combinación de funciones de exportación es innecesaria.

Hay muchas más cosas que hacen innecesarios los complementos.

 
Andrey Dik:
¿Qué le gusta más exactamente?
Y el ejemplo de Basil del segundo tipo de conexión, ¿y dónde en el primero?
No necesitas el segundo, tercer y 110 tipo de conexión. Sólo se necesita uno, pero de tipo de conexión universal. Sin utilizar construcciones sintácticas innecesarias. Nadie quiere descifrar el significado abreviado de la función ServiceFunc1. En su lugar, se debe dar una función de aptitud y las reglas de llenado de sus parámetros. Y nada más.