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

 
Andrey Dik:

Parece que hoy tengo tiempo para mostrar ejemplos.

Todos hacemos preguntas tontas (cada uno en su momento) desde la perspectiva de los que más saben del tema. No hay problema).

Ejemplos de pruebas, perdón por la tautología).

 

Un ejemplo de un FF muy simple, 2 parámetros.

Ya puedes probar tus algoritmos con esta sencilla función.

#property library
#property strict

int  countRuns    = 0;

//+------------------------------------------------------------------+
int GetParamCountFF () export
{ 
  return (2);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
double FF (double &array []) export
{ 
  countRuns++;

  int sizeArray = ArraySize (array); 
  if(sizeArray != 2) 
    return (-DBL_MAX); 
  return (-(pow (2.4 + array [0], 2.0) + pow (array [1] - 2.3, 2.0))+3.1415926);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
int GetCountRunsFF () export
{ 
  return (countRuns);
}
//+------------------------------------------------------------------+

Valor máximo que puede obtener:3,1415926

Oriéntese a 1000 carreras, no más que eso.

El campeonato será FF con 500 parámetros, no más de 1000 ejecuciones, el FF aceptará parámetros en el rango de -10.0 a 10.0 con incrementos de 0.1, por encima del rango los parámetros se cortarán a estos límites (en el ejemplo anterior no hay corte). Estimados participantes, tengan esto en cuenta.

 

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

#property script_show_inputs
#property strict

//+------------------------------------------------------------------+
// алгоритм оптимизации участника
#import "\\Projects\\OAC\\lib\\ao_v1.ex5"
// инициализация АО
void   InitAO (int paramCount, int maxFFruns); 
// функции алгоритма перед началом оптимизации
void   ServiceFunc1 (); 
// функции алгоритма на каждой "эпохе" (итерации) вначале
void   ServiceFunc2 (); 
// функции алгоритма на каждой "эпохе" (итерации) вконце
void   ServiceFunc3 (); 
// запрос количества пакетной обрабобки (аналог колонии ГА)
int    GetReplaysCount (); 
// получение параметров  
void   GetOptParam (double &param []); 
// отправить в алгоритм значение ФФ соответствующее параметрам 
void   SendFFvolue (double volue); 
// этой функцией алгоритм по может остановить оптимизацию
bool   StopAlgo (); 
// получить максимальное значение ФФ       
double GetMaxFF (); 
#import
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "\\Projects\\OAC\\lib\\ff.ex5"
// запросить количество параметров ФФ 
int    GetParamCountFF (); 
// запуск ФФ, получеие значения соответствующее параметроам ФФ
double FF (double &array []); 
// произведённое количество запусков ФФ
int    GetCountRunsFF (); 
#import
//+------------------------------------------------------------------+

//--- input parameters
input int MaxFFruns_P = 1000; 


//+------------------------------------------------------------------+
void OnStart () 
{ 
  // узнаем, сколько параметров нужно оптимизировать
  int paramCount = GetParamCountFF (); 
  
  bool   stopAlgo = false; 
  int    ffRuns = 0; 
  double param []; 
  ArrayResize (param, paramCount); 
  
  ulong  startTime = GetMicrosecondCount (); 
  
  //------------------------------------------------------------------
  InitAO (paramCount, MaxFFruns_P);
  ServiceFunc1 (); 
  while(!stopAlgo) 
  {
    if(StopAlgo ()) 
      break; 
    
    ServiceFunc2 (); 
    
    for(int i = 0; i < GetReplaysCount (); i++) 
    {
      GetOptParam (param); 
      SendFFvolue (FF (param)); 
      ffRuns++; 
      if(ffRuns == MaxFFruns_P) 
      {
        stopAlgo = true; 
        break;
      }
    }
    
    ServiceFunc3 (); 
    
    if(StopAlgo () || stopAlgo) 
      break;
  }
  //-------------------------------------------------------------------
  
  startTime = GetMicrosecondCount () - startTime; 
  
  Print ("Макс: " + DoubleToString (GetMaxFF (), 8)); 
  Print ("Запусков ФФ: " + (string)GetCountRunsFF ()); 
  Print ("Время: " + (string)startTime + " мкс; " + DoubleToString ((double)startTime/1000000.0, 8) + " c"); 
  Print ("---------------------------------");
}
//+------------------------------------------------------------------+
 

El script de prueba me da estos números ahora mismo:

2016.06.21 22:36:15.214 OAC variante 1 (GBPUSD,H1) ---------------------------------

2016.06.21 22:36:15.214 OAC variante 1 (GBPUSD,H1) Tiempo: 1119 µs; 0.00111900 c

2016.06.21 22:36:15.214 OAC variante 1 (GBPUSD,H1) FF Runs: 1000

2016.06.21 22:36:15.213 OAC variante 1 (GBPUSD,H1) Max: 3.14159260

Concluyo: nada de lo que quejarse hasta ahora, todo funciona correctamente.

 

Hay que asumir que la optimización es una herramienta para investigar un filtro concreto (la idea que implementa), no una búsqueda de un extremo global. De lo contrario, estarás luchando en el campo, donde eres mediocre comparado incluso con el doctorado y los recursos de una empresa de inversión ordinaria. Aunque nadie ha cancelado la masturbación del software))

 

ОПТИМИЗАЦИЯ(optimization) Выбор из всех возможных вариантов использования ресурсов тех

Sesueledescribirentérminos demaximización delafunciónobjetivo.

 
Avals:

Hay que asumir que la optimización es una herramienta para investigar un filtro concreto (la idea que implementa), no una búsqueda de un extremo global. De lo contrario, estarás luchando en el campo, donde eres mediocre comparado incluso con el doctorado y los recursos de una empresa de inversión ordinaria. Aunque nadie ha cancelado la masturbación del software))

Exactamente: una herramienta. Anteriormente en el hilo se demostró en el ejemplo de encontrar las raíces de la ecuación cómo se puede utilizar el algoritmo de optimización. Puedes utilizarlo para filtros, indicadores, redes neuronales o cualquier otra cosa.

Algunas personas se masturban, y otras trabajan, y otras se masturban mientras trabajan. A cada uno lo suyo. Tenemos un país libre)))

 

Script de pruebapara la segunda versión del algoritmo:

#property script_show_inputs
#property strict

//+------------------------------------------------------------------+
// алгоритм оптимизации участника
#import "\\Projects\\OAC\\lib\\ao_v2.ex5"
// инициализация АО
void   InitAO (int paramCount, int maxFFruns); 
void   StartAlgo (); 
// получить максимальное значение ФФ       
double GetMaxFF (); 
#import
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "\\Projects\\OAC\\lib\\ff.ex5"
// запросить количество параметров ФФ 
int    GetParamCountFF (); 
// запуск ФФ, получеие значения соответствующее параметроам ФФ
double FF (double &array []); 
// произведённое количество запусков ФФ
int    GetCountRunsFF (); 
#import
//+------------------------------------------------------------------+

//--- input parameters
input int MaxFFruns_P = 1000; 


//+------------------------------------------------------------------+
void OnStart () 
{ 
  // узнаем, сколько параметров нужно оптимизировать
  int    paramCount = GetParamCountFF (); 

  ulong  startTime = GetMicrosecondCount (); 
  
  //------------------------------------------------------------------
  InitAO (paramCount, MaxFFruns_P);
  StartAlgo ();
  //------------------------------------------------------------------
  
  startTime = GetMicrosecondCount () - startTime; 
  
  Print ("Макс: " + DoubleToString (GetMaxFF (), 8)); 
  Print ("Запусков ФФ: " + (string)GetCountRunsFF ()); 
  Print ("Время: " + (string)startTime + " мкс; " + DoubleToString ((double)startTime / 1000000.0, 8) + " c"); 
  Print ("---------------------------------");
}
//+------------------------------------------------------------------+
 

He comprobado mi algoritmo para la segunda forma de empezar también - los resultados son similares a la primera. Es decir, a mí personalmente me da igual cómo llamar al FF, desde dentro o fuera del algoritmo - funciona igual.

Nota: estos dos guiones de prueba se utilizarán en el campeonato para los participantes, tal y como están ahora. Sólo se añadirá la función de guardar los parámetros optimizados en un archivo, para su control, quizá haya algunos cambios menores, que se reflejarán antes del campeonato, seguro.

 
Ahora añadiré ejemplos de los propios algoritmos para ambos tipos de llamadas FF, en el propio, nativo y querido HFC. Por favor, amémoslos y adorémoslos, especialmente a los principiantes. Son fáciles de entender, un ejemplo de cómo se puede construir un algoritmo de optimización elemental sencillo y a la vez funcional.