アルゴリズム最適化選手権。 - ページ 53

 
Andrey Dik:

アルゴリズムの最初のバージョンに関する テストスクリプト。

これだけシンプルな機能なのに、インターフェイスを複雑にしすぎましたね。必要なものが欠けている一方で、不必要な輸出が多い。私はあなたのコードをすぐに理解することはできません、私はプログラミングが得意でない人々の気持ちを想像することができます。

そこで、私なりに考えて、簡略化したエクスポートとテストスクリプトの運用を提案します。

 

FF式のパラメーターの値を求める「進化的」アプローチは、値を求める効率を上げるためというより、進化の過程をソフトウェアでモデリングするためのものなのかもしれませんね。

まあ、進化は科学者に代表されるように...。

このアプローチは、すべての進化論的規範に適合しているという点で、非常に一貫している...

 

命題です。

1. 適性関数は double 型のパラメータの配列を受け取り、大きい数ほど良いパラメータが選ばれていることを返します。フィットネス関数のプロトタイプは以下の通りである。

double FF(double &array[]);

2. フィットネス関数はいくつかのパラメータを持っており、それらはFitnessParams構造体で指定される。以下に、その構造を説明する。

//+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int      limit_runs;          // Максимально допустимое количество вызовов FF
   int      count_params;        // Количество параметров, которое необходимо оптимизировать
   int      current_runs;        // Текущее количество вызовов функции
   double   current_max_value;   // Текущее найденное максимальное значение
   double   step_value;          // Минимальный шаг изменения параметра. 
   double   max_value;           // Максимальное значение, которое может принимать параметр
   double   min_value;           // Минимальное значение, которое может принимать параметр
   FitnessParams(void);
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams(void) : limit_runs(1000),
                                   count_params(2),
                                   step_value(0.1),
                                   max_value(10.0),
                                   min_value(-10.0),
                                   current_runs(0)
                                   
{
   current_max_value = min_value;
}

3. フィットネス関数とそのパラメータは外部からの影響から保護され、独立したライブラリ...■に 格納されています。 フィットネス関数とそのアルゴリズムのパラメータ自体の値は、独立したレフリーによってコンパイル時に設定され、もはや誰も変更することができないのです。

4. カスタム最適化アルゴリズムとチェックスクリプトにより、フィットネス関数のパラメータを求めることができます。このため、ファイルExport.mqhには、この関数の必要なプロトタイプとそのパラメータが含まれています。FFパラメータを取得するために、同じく ...■■.ex5 にあるexport関数を使用します。

void   GetFitnessParams(FitnessParams& params);

5. ユーザー最適化アルゴリズムは、独立したクローズドユーザーライブラリ..■UserFindExtremum.ex5 にあり、ユーザー側で個別にコンパイルされます。FindExtremum 関数は、ユーザーライブラリにエクスポート する必要があります。この関数は、チェックスクリプトから呼び出されます。この関数の完全なプロトタイプを以下に示す。

//+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum(void);
#import

6. チェックスクリプトは、fitness functionのライブラリ...Ⓐとそのパラメータ、Find Extremumメンバーのライブラリ...Ⓐをアドレス空間にロードし、FindExtremumメンバー関数をコールします。

7. 参加者関数が実行された後、チェックスクリプトは、参加者関数が見つけた最大値とその最大値を見つけるために要した呼び出し回数を含むフィットネス関数のパラメータを照会する。このデータをもとに、参加者の結果を表形式でレポートとして作成する。

2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      ———————————————————————————————————————————
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Максимальное найденное значение: 3.1
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Досрочное выполнение алгритма: НЕТ
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Вызовов фитнес-функции потребовалось: 1001
2016.06.22 13:09:48.583 TestFF (EURUSD,H1)      Поиск экстремума выполнен за 0 мсек.

次の投稿で、必要なファイルと使用例を追記 します。

 

Export.mqhファイル - 利用可能な機能のリストと全参加者に共通のパラメータ構造

//+------------------------------------------------------------------+
//|                                                       Export.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "https://www.mql5.com/ru/users/c-4"
//+------------------------------------------------------------------+
//| Параметры фитнес-функции (FF)                                    |
//+------------------------------------------------------------------+
struct FitnessParams
{
   int      limit_runs;          // Максимально допустимое количество вызовов FF
   int      count_params;        // Количество параметров, которое необходимо оптимизировать
   int      current_runs;        // Текущее количество вызовов функции
   double   current_max_value;   // Текущее найденное максимальное значение
   double   step_value;          // Шаг значений или дискретность. 
   double   max_value;           // Максимальное значение, которое может принимать ff-функция
   double   min_value;           // Минимальное значение, которое может принимать ff-функция
   FitnessParams(void);
};
//+------------------------------------------------------------------+
//| Инициализация параметров фитнес-функции (FF) по-умолчанию        |
//+------------------------------------------------------------------+
FitnessParams::FitnessParams(void) : limit_runs(1000),
                                   count_params(2),
                                   step_value(0.1),
                                   max_value(10.0),
                                   min_value(-10.0),
                                   current_runs(0)
                                   
{
   current_max_value = min_value;
}
//+------------------------------------------------------------------+
//| Экспорт библиотеки фитнесс-функций                               |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\FF.ex5"
   double FF(double &array[]);                       // Фитнес-функция, возвращающая значение тем больше, чем лучше подобраны значения в массиве array
   void   GetFitnessParams(FitnessParams& params);   // Возвращает параметры фитнесс-функции в виде структуры FitnessParams
#import
//+------------------------------------------------------------------+
//| Экспорт пользовательской библиотеки поиска экстремума            |
//+------------------------------------------------------------------+
#import "..\\Scripts\\FF\\UserFindExtremum.ex5"
   void FindExtremum(void);
#import

FF.mq5ファイル - ライブラリとしてのフィットネス関数の例です。

//+------------------------------------------------------------------+
//|                                                           FF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "https://www.mql5.com/ru/users/c-4"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Параметры фитнесс-функции, с которыми необходимо ознакомится     |
//| алгоритму поиска до начала работы. Получить эти параметры можно  |
//| с помощью функции GetFitnessParams                               |
//+------------------------------------------------------------------+
static FitnessParams FParams;
//+------------------------------------------------------------------+
//| Фитнес-функция, возвращающая значение тем больше, чем лучше      |
//| подобраны значения в массиве array                               |
//+------------------------------------------------------------------+
double FF(double &array[]) export
{ 
   if(FParams.current_runs > FParams.limit_runs)
      return FParams.min_value;
   FParams.current_runs++;
   if(ArraySize (array) < FParams.count_params)
      return FParams.min_value; 
   double ff_value = (-(pow (2.4 + array [0], 2.0) + pow (array [1] - 2.3, 2.0))+3.1415926);
   if(ff_value > FParams.current_max_value)
      FParams.current_max_value = ff_value;
   return ff_value;
}
//+------------------------------------------------------------------+
//| Возвращает параметры фитнесс-функции                             |
//+------------------------------------------------------------------+
void GetFitnessParams(FitnessParams& params)export
{
   params = FParams;
}
//+------------------------------------------------------------------+

TestFF.mq5ファイル - アルゴリズムをスクリプトでチェックする。

//+------------------------------------------------------------------+
//|                                                       TestFF.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
#property version   "1.00"
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   uint begin_tiks = GetTickCount();
   // Вызываем пользовательскую функцию поиска экстремума фитнес-функции
   FindExtremum();            
   uint end_tiks = GetTickCount();
   // Получаем результаты поиска в качестве комплексного параметра
   FitnessParams params;      
   GetFitnessParams(params);
   // Подготавливаем отчет
   string yesno_count = params.current_runs >= params.limit_runs ? "НЕТ" : "ДА";
   printf("Поиск экстремума выполнен за " + (string)(end_tiks - begin_tiks) + " мсек.");
   printf("Вызовов фитнес-функции потребовалось: " + (string)params.current_runs);
   printf("Досрочное выполнение алгритма: " + yesno_count);
   printf("Максимальное найденное значение: " + DoubleToString(params.current_max_value, 1));
   printf("——————————————————————");
}
//+------------------------------------------------------------------+

UserFindExtremum.mq5ファイル - ライブラリ形式の極値検索のためのカスタム関数です。ランダム検索を例とする

//+------------------------------------------------------------------+
//|                                             UserFindExtremum.mq5 |
//|                                 Copyright 2016, Vasiliy Sokolov. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Vasiliy Sokolov."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property library
#property strict
#include "Export.mqh"
//+------------------------------------------------------------------+
//| Алгоритм поиска экстремума, который будет вызван проверяющим    |
//| скриптом                                                         |
//+------------------------------------------------------------------+
void FindExtremum(void)export
{
   FitnessParams params;
   while(params.current_runs < params.limit_runs)
   {
      GetFitnessParams(params);
      if(params.current_max_value >= params.max_value)
         break;
      double values[];
      ArrayResize(values, params.count_params);
      for(int i = 0; i < params.count_params; i++) 
      {
        double random = RandomDouble(params.min_value, params.max_value);
        values[i] = SeInDiSp (random, params.min_value, params.max_value, params.step_value);
      }
      FF(values);
   }
}
//+------------------------------------------------------------------+
//| Выбор в дескретном пространстве                                  |
//+------------------------------------------------------------------+
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 RandomDouble(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)));
}
ファイル:
Export.mqh  3 kb
FF.mq5  2 kb
TestFF.mq5  2 kb
 
Vasiliy Sokolov:

Export.mqhファイル - 利用可能な機能のリストと全参加者に共通のパラメータ構造

FF.mq5ファイル - ライブラリとしてのフィットネス関数の例です。

TestFF.mq5ファイル - アルゴリズムをスクリプトでチェックする。

UserFindExtremum.mq5ファイル - ライブラリ形式の極値検索のためのカスタム関数です。ランダム検索を例とする

どの例も非常にわかりやすく、理解しやすい。お疲れ様でした。)
 
Vasiliy Sokolov:

これだけシンプルな機能なのに、インターフェイスを複雑にしすぎましたね。不要な輸出が多く、逆に必要なものが抜けている。私は、あなたのコードを一回で理解できなかったので、プログラミングが苦手な人の気持ちはよくわかります。

私なりに考えて、簡略化したエクスポートとテストスクリプトを提案するつもりです。

なぜ必要ないのか?

どのようなものが足りないのでしょうか?

結局のところ、参加者の生活をできるだけ困難にするためだけでなく、だから私はそれをすべてやった、そして、私はそれをすべて考えた最初の日ではなく、2番目でもない。

 
Andrey Dik:

なぜ、正しいものでないのか?

どのようなものが欠けているのでしょうか?

結局のところ、参加者の生活をできるだけ困難にするためだけでなく、だから私はすべてをやったし、最初の日ではなく、2日目も考えなかったのです。

アンドリュー 他の人はどうかわかりませんが、個人的にはヴァシリーの例の方が好きでした。悪気はないんです。これはあくまで私の主観です。

公平を期すために、接続インターフェース(あなたのものとVasiliyのもの)の選択に関する質問を投票にかけることを提案します。

いかがでしょうか?

 
Реter Konow:

アンドリュー 他の人はどうかわかりませんが、個人的にはヴァシリーの例の方が好きでしたね。悪気はないんです。あくまで私の主観ですが...。

公平を期すために、接続インターフェース(あなたかVasiliyか)を選択する問題を投票にかけることを提案します。

いかがでしょうか?

具体的にはどのような点が良いのでしょうか?
そして、Vassilyの例は2番目のタイプの接続で、1番目のタイプではどこに?
 
Andrey Dik:

なぜ、正しいものでないのか?

どのようなものが欠けているのでしょうか?

参加者の生活をできるだけ苦しくすることだけが私のやり方ではないし、そう考えたのは1日目でも、2日目でもないんです。

この例では、検索というタスクの一部がチェッカースクリプトに委ねられています。これは誤りです。チェッカースクリプトは、検索を呼び出してその結果をチェックし、それ以外のことは行わないようにします。

すべてのFFパラメータを使用できるわけではありません。例えば、パラメータのステップ(値0.1)、可能な最大値、最小値はどのように取得するのですか?もちろん、すべてのユーザーがこのフォーラムを読んで、ステップが0.1、最小値が-10.0、最大値が+10.0であることを理解し、これらの定数を自分のコードに入力して、FF関数が同じように考えることを期待するのは素晴らしいことです。しかし、これでは良い意味で、やりきれない。

ServiceFunc1 のような多くのエクスポート関数は、特定の検索アルゴリズムでのみ使用されます。例えば、ランダム検索には使用しないでください。では、なぜユーザーライブラリはそれらをエクスポートする必要があるのでしょうか?テストと検索を切り離すだけで、このような複雑なエクスポート機能の組み合わせは不要であることがわかるのです。

アドオンを不要とするものは、他にもたくさんあります。

 
Andrey Dik:
具体的にはどのような点が良いのでしょうか?
そして、バジルの例は2番目のタイプの接続で、1番目のタイプはどこにあるのでしょうか?
2台目、3台目、110番接続タイプは必要ない。1つでいいのですが、ユニバーサル接続タイプ。無駄な構文を使わず誰もServiceFunc1関数の省略された意味について困惑したくはないでしょう。その代わり、フィットネス関数とそのパラメータを埋めるルールを与える必要があります。そして、それ以外には何もない。