Campionato di ottimizzazione degli algoritmi. - pagina 50

 
Andrey Dik:

Sembra che oggi abbia il tempo di mostrare degli esempi.

Tutti facciamo domande stupide (ognuno con i suoi tempi) dal punto di vista di chi ne sa di più sulla questione. Nessun problema).

Esempi di test, scusate la tautologia).

 

Un esempio di un FF molto semplice, 2 parametri.

Potete già testare i vostri algoritmi su questa semplice funzione.

#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);
}
//+------------------------------------------------------------------+

Valore massimo che puoi ottenere:3.1415926

Orientati a 1000 corse, non di più.

Il campionato sarà FF con 500 parametri, non più di 1000 corse, il FF accetterà parametri nell'intervallo da -10.0 a 10.0 con incrementi di 0.1, sopra l'intervallo i parametri saranno tagliati a questi limiti (nell'esempio sopra non c'è nessun taglio). Cari partecipanti, tenete a mente questo.

 

Script di test sulla prima versione dell'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 ("---------------------------------");
}
//+------------------------------------------------------------------+
 

Lo script di test mi dà questi numeri in questo momento:

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

2016.06.21 22:36:15.214 OAC variant 1 (GBPUSD,H1) Tempo: 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 Max: 3.14159260

Concludo: niente di cui lamentarsi finora, tutto funziona correttamente.

 

Devi assumere che l'ottimizzazione è uno strumento per studiare un filtro particolare (l'idea che implementa), non una ricerca di un estremo globale. Altrimenti si combatte sul campo, dove si è mediocri rispetto anche al phd e alle risorse di una società di investimento ordinaria. Anche se nessuno ha cancellato la masturbazione del software))

 

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

Vienespessodescrittointermini dimassimizzazione dellafunzioneobiettivo.

 
Avals:

Devi assumere che l'ottimizzazione è uno strumento per studiare un filtro particolare (l'idea che implementa), non una ricerca di un estremo globale. Altrimenti si combatte sul campo, dove si è mediocri rispetto anche al phd e alle risorse di una società di investimento ordinaria. Anche se nessuno ha cancellato la masturbazione del software))

Esattamente - uno strumento. All'inizio del thread è stato dimostrato sull'esempio di trovare le radici dell'equazione come si può usare l'algoritmo di ottimizzazione. Potete usarlo per filtri, indicatori, reti neurali o qualsiasi altra cosa.

C'è chi si masturba, e chi lavora, e chi si masturba mentre lavora. A ciascuno il suo. Abbiamo un paese libero)))

 

Script di testper la seconda versione dell'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 ("---------------------------------");
}
//+------------------------------------------------------------------+
 

Ho controllato il mio algoritmo anche per il secondo modo di partire - i risultati sono simili al primo. Cioè, personalmente non mi interessa come chiamare il FF, da dentro o fuori l'algoritmo - funziona allo stesso modo.

Nota: questi due script di prova saranno utilizzati nel campionato per i partecipanti, come lo sono ora. Solo la funzione di salvare i parametri ottimizzati in un file sarà aggiunta, per il controllo, forse ci saranno alcuni cambiamenti minori, che si rifletteranno prima del campionato, di sicuro.

 
Ora aggiungerò esempi degli algoritmi stessi per entrambi i tipi di chiamate FF, sul molto, nativo e amato HFC. Per favore, amali e amali, specialmente per i principianti. Sono facili da capire, un esempio di come si può costruire un algoritmo di ottimizzazione elementare semplice e allo stesso tempo funzionante.
Motivazione: