Campeonato de Otimização de Algoritmos. - página 50

 
Andrey Dik:

Hoje parece que tenho tempo para mostrar exemplos.

Todos nós fazemos perguntas bobas (cada um em seu tempo) a partir da perspectiva daqueles que sabem mais sobre o assunto. Sem problemas).

Exemplos de testes, perdoe a tautologia).

 

Um exemplo de um FF muito simples, 2 parâmetros.

Você já pode testar seus algoritmos sobre esta simples função.

#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 você pode obter:3,1415926

Oriente-se para 1000 corridas, não mais do que isso.

O campeonato será FF com 500 parâmetros, não mais que 1000 corridas, o FF aceitará parâmetros na faixa de -10,0 a 10,0 com incrementos de 0,1, acima da faixa os parâmetros serão cortados para estes limites (no exemplo acima não há corte). Caros participantes, tenham isto em mente.

 

Roteiro de teste na primeira versão do 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 ("---------------------------------");
}
//+------------------------------------------------------------------+
 

O roteiro de teste me dá estes números agora mesmo:

2016.06.21 22:36:15.214 Variante 1 da OAC (GBPUSD,H1)

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

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

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

Concluo: nada a reclamar até agora, tudo funciona corretamente.

 

Você tem que assumir que a otimização é uma ferramenta para investigar um determinado filtro (a idéia que ele implementa), não uma busca por um extremo global. Caso contrário, você está lutando no campo, onde você está no meio do caminho, em comparação até mesmo com os recursos de uma empresa de investimento comum. Embora ninguém tenha cancelado a masturbação do software))

 

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

quedãoos melhoresresultados.Muitas vezesé descritoemtermos demaximização dafunçãoalvo.

 
Avals:

Você tem que assumir que a otimização é uma ferramenta para investigar um determinado filtro (a idéia que ele implementa), não uma busca por um extremo global. Caso contrário, você está lutando no campo, onde você está no meio do caminho, em comparação até mesmo com os recursos de uma empresa de investimento comum. Embora ninguém tenha cancelado a masturbação do software))

Exatamente - uma ferramenta. Anteriormente, na linha, foi demonstrado no exemplo de encontrar as raízes da equação como se pode usar o algoritmo de otimização. Você pode usá-lo para filtros, indicadores, redes neurais, ou qualquer outra coisa.

Algumas pessoas se masturbam, e algumas trabalham, e outras se masturbam enquanto trabalham. A cada um o seu. Temos um país livre))))

 

Roteiro de testepara a segunda versão do 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 ("---------------------------------");
}
//+------------------------------------------------------------------+
 

Verifiquei meu algoritmo para a segunda maneira de começar também - os resultados são semelhantes aos da primeira. Isto é, pessoalmente não me importa como chamar o FF, de dentro ou de fora do algoritmo - ele funciona da mesma forma.

Atenção: estes dois roteiros de teste serão usados no campeonato para os participantes, como são agora. Apenas a função de salvar os parâmetros otimizados em um arquivo será adicionada, para controle, talvez haja algumas pequenas mudanças, que serão refletidas antes do campeonato, com certeza.

 
Agora vou acrescentar exemplos dos próprios algoritmos para ambos os tipos de chamadas FF, no próprio HFC, nativo e amado. Por favor, amem e amem, especialmente para os iniciantes. Eles são fáceis de entender, um exemplo de como se pode construir um algoritmo elementar simples e, ao mesmo tempo, de otimização de trabalho.