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

 

Зачем в примере по второму варианту импорт?

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

Ну я тоже так могу написать - чо непонятного в моем вопросе?

Это скорее риторический был вопрос, потому что я уверен - тебе всё понятно.

Dmitry Fedoseev:
Почему один вопрос надо по 10 раз задавать?

Сложный вопрос, я то же задаюсь часто этим вопросом.)

Dmitry Fedoseev:

Зачем в примере по второму варианту импорт? 

 Для того, что бы проконтролировать алгоритм из скрипта, сколько раз на самом деле алгоритм вызывал ФФ.

Для первого варианта это четко видно, потому что скрипт сам делает вызовы, а вот для второго варианта это не видно, поэтому и нужна возможность обращения к библиотеке ФФ из скрипта. 

 

Сейчас, хочу обратится ко всем участникам, которые причисляют себя к категории "новичков" в данной тематике и всерьез не расчитывают на победу.

Если отбросить всю несусветную "теорию" о множестве измерений пространства, дико запутывающую и без того непонятную задачу и обратиться к чистой математике, то мы увидим, что ФФ - это уравнение.

Аналитической функцией это уравнение становится только если его применить по отношению к графу.

Но есть вопрос, - А НУЖНО ЛИ ЭТО?   -  Граф просто помогает визуализировать закономерности связи параметров уравнения.

После 158 - ми страниц обсуждения, можно уже сформулировать суть поставленной задачи:

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

Цель - постараться сделать это более эффективно, чем полным перебором.

Все.

Далее:

Для решения данной задачи, была изобретена "Эволюционная" технология поиска значений. Были построены аналогии и методы берущие истоки от дарвинизма.

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

Моя практика доказывает, - общепринятые подходы не всегда бывают самыми эффективными.

Уверен, "эволюционистов" мы вполне можем обойти...

Давайте попробуем!

 

Пример алгоритма участника по второму варианту вызова ФФ:

#property library
#property strict

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

//+------------------------------------------------------------------+
void InitAO (int paramCount, int maxFFruns) export
{
  params = paramCount;
  maxFFrunsPossible = maxFFruns;
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
void StartAlgo () export
{
  double param []; 
  ArrayResize (param, params);
  double ffVolue = 0.0; 
  
  //------------------------------------------------------------------
  for(int i=0; i< maxFFrunsPossible; i++) 
  {
    GenerateParam (param);
    ffVolue = FF(param);
    if(ffVolue > maxFFvolue) 
      maxFFvolue = ffVolue;
  }
  //------------------------------------------------------------------
}
//+------------------------------------------------------------------+

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

//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Все функции выше этой строки - обязательны! Именно они будут импортированы 
// и использованы тестовым скриптом. Они нужны для доступа к алгоритму оптимизации.
// Содержимое - произвольное, на усмотрение участника
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!



//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// Ниже этой строки пример алгоритма оптимизации участника
//————————————————————————————————————————————————————————————————————
int    params     = 0;
int    maxFFrunsPossible = 0;
double maxFFvolue = - DBL_MAX;
double minParam   = -10.0;
double maxParam   = 10.0;
double stepParam  = 0.1;
//————————————————————————————————————————————————————————————————————

//————————————————————————————————————————————————————————————————————
// Генерация значений оптимизируемых параметров
void GenerateParam (double &param[])
{
  int size = ArraySize (param);
  double paramVolue = 0.0;
  for(int i = 0; i < size; i++) 
  {
    paramVolue = RNDfromCI (minParam, maxParam);
    param [i] = SeInDiSp (paramVolue, minParam, maxParam, 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)));
}
//————————————————————————————————————————————————————————————————————

 Основной код алгоритма тот же самый, что и в первом варианте, но с вызовом ФФ из алгоритма а не из скрипта.

Результаты, естественно, похожие, как и для первого варианта:

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) Время: 135 мкс; 0.00013500 c

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) Запусков ФФ: 1000

2016.06.22 11:47:45.321 OAC variant 2 (GBPUSD,M30) Макс: 2.94159260

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) Время: 136 мкс; 0.00013600 c

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) Запусков ФФ: 1000

2016.06.22 11:47:41.404 OAC variant 2 (GBPUSD,M30) Макс: 3.10159260

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) Время: 133 мкс; 0.00013300 c

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) Запусков ФФ: 1000

2016.06.22 11:47:37.309 OAC variant 2 (GBPUSD,M30) Макс: 3.06159260

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) Время: 133 мкс; 0.00013300 c

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) Запусков ФФ: 1000

2016.06.22 11:47:32.933 OAC variant 2 (GBPUSD,M30) Макс: 3.10159260

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) ---------------------------------

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) Время: 180 мкс; 0.00018000 c

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) Запусков ФФ: 1000

2016.06.22 11:47:07.584 OAC variant 2 (GBPUSD,M30) Макс: 3.04159260

 

то есть - весьма не плохие.

 

Итак, на примерах выше показан способ подключения алгоритмов участников к тестовым скриптам через импортирование функций.

Напомню, для чего организован именно такой способ работы с алгоритмами участников: необходимо, с одной стороны, скрыть алгоритм участника для защиты интеллектуальной собственности, а с другой - возможность контроля и проверки как членами жюри, так и зрителями. 

 

Сегодня протестирую

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

 
Реter Konow:

Сейчас, хочу обратится ко всем участникам, которые причисляют себя к категории "новичков" в данной тематике и всерьез не расчитывают на победу.

Если отбросить всю несусветную "теорию" о множестве измерений пространства, дико запутывающую и без того непонятную задачу и обратиться к чистой математике, то мы увидем, что ФФ - это уравнение.

Аналитической функцией это уравнение становится только если его применить по отношению к графу.

Но есть вопрос, - А НУЖНО ЛИ ЭТО?   -  Граф просто помогает визуализировать закономерности связи параметров уравнения.

После 158 - ми страниц обсуждения, можно уже сформулировать суть поставленной задачи:

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

Цель - постараться сделать это более эффективно, чем полным перебором.

Все.

Далее:

Для решения данной задачи, была изобретена "Эволюционная" технология поиска значений. Были построены аналогии и методы берущие истоки от дарвинизма.

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

Моя практика доказывает, - общепринятые подходы не всегда бывают самыми эффективными.

Уверен, "эволюционистов" мы вполне можем обойти...

Давайте попробуем!

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

Насчет "несусветных теорий" - я дал в этой ветке четкие наводки на принципы алгоритма оптимизации, которые не используются нигде больше и ни когда раньше не использовались (по крайней мере в доступных источниках). А выбор всегда за исследователем - как и что он будет использовать в алгоритме. В примере выше алгоритм, который не имеет к Дарвину даже косвенного отношения. Существует масса методов оптимизации и никто, я по крайней мере, не утверждал, что "берущие истоки от дарвина" лучше.

Ну и, успехов Новичкам! Вперёд, к победе! 

 
Я не кодил на пятерке а также не имею опыта экспортно-импортных операций. Прошу сказать правильно ли я понимаю Ваш пример. Я поставил свои комментарии в код. Ещё вопрос . Если ФФ будет задаваться формулой то будут ли там операции деления или извлечения корня.  Нулевое или отрицательное значение приведет к критической ошибке и остановки программы.
// -- данный код находится на стороне жюри (организатора)---------------------
#property library    //EX5-файл будет являться библиотекой
#property strict
int  countRuns    = 0;  // число обращений к ФФ. Фитнес функции это, как я понимаю неизвестная никому функция у которой 500 параметров
 // и нужно найти такие значения параметров при которой значение фф= максимальному 
//+------------------------------------------------------------------+
int GetParamCountFF () export //функция задачи участникам количества параметров фф  модификатор export указывает что функция доступна
// алгоритму участника  
{ 
  return (2);// возвращает количество параметров участнику 2 для данного примера 
  // участник в своём коде прописывает  int NumberParam=GetParamCountFF();
}

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);
 //--------------вероятно нужно так --------------
    if(sizeArray != 2){ // возвращает минимальное double ( или может лучше ошибку)
    // если количество элементов в массиве пользователя не равно заданному)
    return (-DBL_MAX);
    } 
    else{ // возвращает значение функции
  return (-(pow (2.4 + array [0], 2.0) + pow (array [1] - 2.3, 2.0))+3.1415926);
  }
  //------------------------------------------------------------------
}

int GetCountRunsFF () export
{ 
  return (countRuns);// возвращает кол. обращений к фф
}
 
Yuri Evseenkov:
Я не кодил на пятерке а также не имею опыта экспортно-импортных операций. Прошу сказать правильно ли я понимаю Ваш пример. Я поставил свои комментарии в код. Ещё вопрос . Если ФФ будет задаваться формулой то будут ли там операции деления или извлечения корня.  Нулевое или отрицательное значение приведет к критической ошибке и остановки программы.

Да, Вы верно понимаете работу ФФ чемпионата.

Единственная поправочка на счет возвращения результата в случае неверного размера массива параметров - алгоритм участника знает о количестве параметров ФФ и если он передаст в ФФ массив не правильного размера, то это проблема алгоритма участника, а не ФФ. Вдумайтесь в этот момент, если взять как пример рынок - рынок никогда не сообщит Вам о том, что Вы используете "не то" количество параметров стратегии в своей торговле, Вы просто получите отрицательный торговый результат и всё, без объяснения со стороны рынка причин Ваших ошибок.

Слово Ваш можно заменить на слово Наш, а слово Вы можно заменить на слова Мы - ничего от этого не изменится и останется правдой. 

 
Igor Volodin:

Сегодня протестирую

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

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

Да, так и сделаю. 

Причина обращения: