アルゴリズム最適化選手権。 - ページ 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本を目安に、それ以上は無理。

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

結論から言うと、今のところ何も不満はなく、すべて正常に動作しています。

 

最適化は、ある特定のフィルター(を実装したアイデア)を調べるためのツールであって、大域的な極限を探すためのものではないことを前提にする必要があります。そうでなければ、普通の投資会社のPHDやリソースにさえも及ばない、中途半端なフィールドで戦うことになるのです。ソフトオナニーをキャンセルした人はいないけれども))

 

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

ターゲット関数の最大化という言葉で表現 されることが 多い

 
Avals:

最適化は、ある特定のフィルター(を実装したアイデア)を調べるためのツールであって、大域的な極限を探すためのものではないことを前提にする必要があります。そうでなければ、普通の投資会社のPHDやリソースにさえも及ばない、中途半端なフィールドで戦うことになるのです。ソフトのオナニーをキャンセルした人はいないけれども))

その通り、ツールです。このスレッドの前の方で、方程式の根を求める例で、最適化アルゴリズムをどのように使うかが示されました。フィルター、インジケーター、ニューラルネットワークなど、何にでも使えます。

オナニーをしながら仕事をする人もいれば、仕事をしながらオナニーをする人もいる。人それぞれです。自由な国があるんだから)))

 

第2バージョンの アルゴリズムのテストスクリプト

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

2番目の開始方法についてもアルゴリズムを確認したところ、1番目の開始方法と同様の結果が得られました。つまり、個人的にはFFをどう呼び出そうが、アルゴリズムの内側からだろうが外側からだろうが、同じように機能する。

注意:この2つのテストスクリプトは、現在と同様に参加者向けのチャンピオンシップで使用されます。最適化されたパラメータをファイルに保存する機能だけが追加され、制御のために、もしかしたらマイナーチェンジがあるかもしれませんが、チャンピオンシップまでには確実に反映されるでしょう。

 
では、両方のタイプのFFコールのアルゴリズム自体の例を、まさに、ネイティブで愛されているHFC上で追加してみます。特に初心者の方は、ぜひ愛用してください。初歩的でシンプル、かつ実用的な最適化アルゴリズムを構築できる例として、理解しやすいと思います。