算法优化锦标赛。 - 页 50

 
Andrey Dik:

我今天似乎有时间来展示例子。

我们都从那些对问题有更多了解的人的角度来问一些愚蠢的问题(每个人都在自己的时间)。没问题)。

测试试验的例子,请原谅我的同义词)。

 

一个非常简单的FF的例子,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个参数的FF,不超过1000次运行,FF将接受-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) Time: 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 OAC variant 1 (GBPUSD,H1) Max: 3.14159260

我的结论是:到目前为止,没有什么可抱怨的,一切工作都正常。

 

你必须假设优化是一个研究特定过滤器(它实现的想法)的工具,而不是寻找一个全局极值。否则,你就是在战场上作战,与普通投资公司的博士和资源相比,你也是中游水平。虽然没有人取消软件自慰))

 

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

通常被描述目标函数最大化

 
Avals:

你必须假设优化是一个研究特定过滤器(它实现的想法)的工具,而不是寻找一个全局极值。否则,你就是在战场上作战,与普通投资公司的博士和资源相比,你也是中庸的。虽然没有人取消软件的自慰))。

没错--一个工具。在主题的早些时候,在寻找方程根的例子上演示了如何使用优化算法。你可以把它用于过滤器、指标、神经网络 或其他任何东西。

有些人手淫,有些人工作,有些人边工作边手淫。每个人都有自己的想法。我们有一个自由的国家))))。

 

第二版算法测试脚本

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

也检查了我的第二种启动方式的算法--结果与第一种方式相似。也就是说,我个人并不关心如何调用FF,从算法内部或外部--它的工作方式是一样的。

请注意:这两个测试脚本将在冠军赛中用于参赛者,就像现在这样。只增加了将优化后的参数保存到文件中的功能,用于控制,也许会有一些小的变化,这将在冠军赛前反映出来,这是肯定的。

 
现在,我将补充这两种类型的FF调用的算法本身的例子,在非常,原生和心爱的HFC上。请爱护他们,特别是对初学者来说。它们很容易理解,是一个如何建立一个基本的简单的同时又能工作的优化算法的例子。