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

 

И, собственно пример библиотеки участника. Рабочий алгоритм оптимизации, основанный на ГСЧ. Весьма неплохо (для ГСЧ) ищет максимум у функций с параметрами в количестве 1...5 штутк (может и больше, ограничений в коде нет, но результаты будут удручающими). Для чемпа слабоват, но для примера сгодится:

#property library
#property strict

//+------------------------------------------------------------------+
// тестовая фитнес функция чемпионата, не известна участникам
#import "ff.ex5"
int    GetParamCount (); 
void   GetParamProperties (double &min, double &max, double &step); 
int    GetCountRunsFF (); 
double FF (double &array []); 
#import
//+------------------------------------------------------------------+


///////////////////////////////////////////////////////////////////////////////| 
//  Здесь список экспортируемых функций библиотеки оптимизации, которые
//обязаны объявлены именно так как показано ниже, для того, что проверочный скрипт
//мог корректно обратится к библиотеке, содержимое этих функций на усмотрение
//участников 
/* 
//+------------------------------------------------------------------+
// алгоритм оптимизации участника
#import "ao.ex5"
// инициализация АО
void   InitAO (int paramCount, int maxFFruns);
// запуск АО 
void   StartAlgo (); 
// получить максимальное значение ФФ       
double GetMaxFF (); 
#import
//+------------------------------------------------------------------+
*/

//+------------------------------------------------------------------+
void InitAO (int paramCount, int maxFFruns) export
{ 
  G_MaxFFruns  = maxFFruns; 
  G_ParamCount = paramCount; // можно и так: G_ParamCount = GetParamCount ();
  GetParamProperties (G_MinParam, G_MaxParam, G_StepParam);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void StartAlgo () export
{ 
  bool   stopAlgo = false; 
  int    ffRuns   = 0; 
  double temp     = 0.0; 
  double param []; 
  ArrayResize (param, G_ParamCount); 
  
  //------------------------------------------------------------------
  while(!stopAlgo) 
  {
    GetOptParam (param); 
    temp = FF (param); 
    
    if(temp > G_BestResult) 
    {
      G_BestResult = temp; 
      Comment (G_BestResult);
    } 

    ffRuns++; 
    
    if(ffRuns == G_MaxFFruns) 
      stopAlgo = true; 
  }
  //-----------------------------------------------------------------
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
double GetMaxFF () export
{ 
  return (G_BestResult);
}
//+------------------------------------------------------------------+
///////////////////////////////////////////////////////////////////////////////| 


///////////////////////////////////////////////////////////////////////////////|
// Ниже - функции участников, объявление и содержимое на их усмотрение 

int    G_MaxFFruns  = 0; 
double G_BestResult = -DBL_MAX; 
int    G_ParamCount = 0; 
double G_MinParam   = -DBL_MAX; 
double G_MaxParam   = DBL_MAX; 
double G_StepParam  = 0.0; 

//+------------------------------------------------------------------+
void GetOptParam (double &param []) 
{ 
  int size = ArraySize (param); 
  for(int i = 0; i < size; i++) 
    param [i] = SeInDiSp (RNDfromCI (G_MinParam, G_MaxParam), 
                          G_MinParam, 
                          G_MaxParam, 
                          G_StepParam);
}
//+------------------------------------------------------------------+

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

Средний результат у алго на ГСЧ для ФФ из примера выше: -3.9699791274683918

Делал штук 5 запусков скрипта с параметром 1000 вызовов ФФ.

Компилируйте примеры и проверяйте. На месте тестового ao.ex5 на чемпе будет ваша библиотека.

Напомню:

На чемпионате скрипт останется тем же без изменений, содержимое ФФ в ff.ex5 будет другим, а библиотека участника должна быть ао.ex5, это видно по объявленным импортируемым функциям.

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

 
Andrey Dik:

Средний результат у алго на ГСЧ для ФФ из примера выше: -3.9699791274683918

Делал штук 5 запусков скрипта с параметром 1000 вызовов ФФ.

Компилируйте примеры и проверяйте. На месте тестового ao.ex5 на чемпе будет ваша библиотека.

Напомню:

На чемпионате скрипт останется тем же без изменений, содержимое ФФ в ff.ex5 будет другим, а библиотека участника должна быть ао.ex5, это видно по объявленным импортируемым функциям.

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

H Работает интерфейс. Перенес приведенные три кода на пятёрку.

1. Исполняемый скрипт обозвал как Ch Script.

2. Библиотеку фитнес функции назвал ff. Называть надо именно так. Иначе скрипт не увидит.

3. Библиотеку примера алгоритма участника назвал ao. Называть надо именно так. Иначе скрипт не увидит.

Запустил скрипт на графике. Перед этим поменял фитнесс функцию в библиотеке на double ffVolue = 2+exp(-MathAbs(x1+x2+x3)); Настоящий максимум равен трём. Получилось.


Как я понимаю нужно переписать свой алгоритм в формат примера алгоритма, переименовать свои функции в коде на названия, которые в примере и проверить работоспособность.

Изучать интерфейс подключения и приведенный пример ФФ не нужно.

Файлы:
ff.mq5  2 kb
ao.mq5  5 kb
 
Yuri Evseenkov:

H Работает интерфейс. Перенес приведенные три кода на пятёрку.

1. Исполняемый скрипт обозвал как Ch Script.

2. Библиотеку фитнес функции назвал ff. Называть надо именно так. Иначе скрипт не увидит.

3. Библиотеку примера алгоритма участника назвал ao. Называть надо именно так. Иначе скрипт не увидит.

Запустил скрипт на графике. Перед этим поменял фитнесс функцию в библиотеке на double ffVolue = 2+exp(-MathAbs(x1+x2+x3)); Настоящий максимум равен трём. Получилось.


Как я понимаю нужно переписать свой алгоритм в формат примера алгоритма, переименовать свои функции в коде на названия, которые в примере и проверить работоспособность.

Изучать интерфейс подключения и приведенный пример ФФ не нужно.

Замечательно! Вы всё правильно сделали.

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

Всё же просто, не так ли? ))

 
А, и да... Примеры будут работать и в МТ4. Не проверял, но там нет ничего, что могло бы не работать в МТ4. Это я сказал для тех, кто страдает аллергией (или эмтэпятьбоязнью) к МТ5, для них чемпионат тоже открыт. 
 
Andrey Dik:
А, и да... Примеры будут работать и в МТ4. Не проверял, но там нет ничего, что могло бы не работать в МТ4. Это я сказал для тех, кто страдает аллергией (или эмтэпятьбоязнью) к МТ5, для них чемпионат тоже открыт. 

Чтобы заработало в четверке нужно в исполняемом скрипте и в примере алгоритма участника заменить #import "ff.ex5" и #import "ао.ex5" на #import "ff.ex4" и #import "ао.ex4".

Писать можно и в четверке . У меня например когда скомпелировал MQL4 код в MQL5 ,была только одна ошибка. Поменял TRUE на true или на единицу и всё заработало. Нужно только писать  как указано в примере.  Ещё сам не переделал свой код. Попробую.


Файлы:
Ch_script.mq4  2 kb
ff.mq4  2 kb
ao.mq4  5 kb
 

Добрый день!

Готовлю площадку (сайт) посвящённую алгоритмам оптимизации, где будут конкурсы, полезная информация и много чего ещё интересного и полезного.

Каждый желающий сможет проверить свои силы в написании алгоритмов и протестировать их в сравнении с другими участниками. Участнику не потребуется отправка алгоритма на сервер, всё взаимодействие с FF, расположенной на сервере, происходит по REST, участник отправляет набор аргументов на сервер, а обратно получает результат FF, не требуется арбитр поскольку всё предельно прозрачно, при этом остаются в секрете алгоритмы участников.

Ждите новостей!

 
Andrey Dik:

...

Ждите новостей!

Ждём


 
Andrey Dik:

Добрый день!

Готовлю площадку (сайт) посвящённую алгоритмам оптимизации, где будут конкурсы, полезная информация и много чего ещё интересного и полезного.

Каждый желающий сможет проверить свои силы в написании алгоритмов и протестировать их в сравнении с другими участниками. Участнику не потребуется отправка алгоритма на сервер, всё взаимодействие с FF, расположенной на сервере, происходит по REST, участник отправляет набор аргументов на сервер, а обратно получает результат FF, не требуется арбитр поскольку всё предельно прозрачно, при этом остаются в секрете алгоритмы участников.

Ждите новостей!

Интересно!

Только не слушай форумных советчиков и критиков, делай что задумал, а то опять ничего не получится ))

 
Andrey F. Zelinsky:

Ждём

Sergey Chalyshev:

Интересно!

Только не слушай форумных советчиков и критиков, делай что задумал, а то опять ничего не получится ))

Спасибо!)