Чемпионат Алгоритмов Оптимизации. - страница 50

 
Andrey Dik:

Вроде успеваю сегодня показать примеры.

Все мы задаем тупые вопросы (каждый в своё время) с точки зрения тех, кто знает в вопросе больше. Проблем нет.)

Тестирую тестовые примеры, простите за тавтологию.) 

 

Пример очень простой ФФ, 2 параметра.

Можете уже проверить свои алгоритмы на этой простой функции.

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

 Максимальное значение, которое можно получить: 3.1415926

Ориентируйтесь на 1000 запусков, не более.

На чемпионате будет ФФ с 500 параметров, не более 1000 запусков, приниматься ФФ-ей будут параметры в диапазоне от -10.0 до 10.0 с шагом 0.1, сверх диапазона параметры будут обрезаться до этих границ (в примере выше нет обрезки). Ув. участники, имейте это ввиду.

 

Тестовый скрипт по первому варианту исполнения алгоритма:

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

Тестовый скрипт выдает такие цифры у меня сейчас:

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

2016.06.21 22:36:15.214 OAC variant 1 (GBPUSD,H1) Время: 1119 мкс; 0.00111900 c

2016.06.21 22:36:15.214 OAC variant 1 (GBPUSD,H1) Запусков ФФ: 1000

2016.06.21 22:36:15.213 OAC variant 1 (GBPUSD,H1) Макс: 3.14159260

Делаю вывод: пока не к чему придраться, работает всё верно. 

 

Надо исходить из того, что оптимизация  есть инструмент для исследования конкретного фильтра (идеи которую он реализует), а не поиск глобального экстремума. Иначе вы сражаетесь на поле, где вы сошки по сравнению даже с phd и ресурсами даже рядовой инвест компании. Хотя программный онанизм  никто не отменял))

 

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

которые дают наилучшие результатыЧасто описывается в виде максимизации целевой функции

 

 
Avals:

Надо исходить из того, что оптимизация  есть инструмент для исследования конкретного фильтра (идеи которую он реализует), а не поиск глобального экстремума. Иначе вы сражаетесь на поле, где вы сошки по сравнению даже с phd и ресурсами даже рядовой инвест компании. Хотя программный онанизм  никто не отменял))

Именно - инструмент. Ранее в ветке было продемонстрировано на примере нахождения корней уравнения как можно использовать алгоритм оптимизации. Можно использовать и для фильтров, индикаторов, нейронных сетей, да вообще чего угодно.

Кто то онанирует, а кто то работает, а кто то онанирует во время работы. Каждому своё. У нас свободная страна.))) 

 

Тестовый скрипт по второму варианту исполнения алгоритма:

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

Проверил свой алгоритм и по второму варианту запуска - результаты аналогичные первому. То есть, мне лично без разницы, как вызывать ФФ, изнутри алгоритма или снаружи - работает одинаково.

Прошу обратить внимание: именно эти два тестовых скрипта будут использоваться на чемпионате для участников в том виде, как они есть сейчас. Будут добавлены только функции сохранения оптимизируемых параметров в файл, для контроля, возможно будут мелкие изменения которые будут отражены перед чемпионатом, обязательно. 

 
Теперь добавлю примеры собственно самих алгоритмов обоих типов вызова ФФ, на том самом, родном и любимом ГСЧ. Прошу любить и жаловать, особенно новичкам. В них просто разобраться, пример того, как можно построить элементарно простой и в тоже время рабочий алгоритм оптимизации.
Причина обращения: