English Русский Español Deutsch Português
preview
イルカエコーロケーションアルゴリズム(DEA)

イルカエコーロケーションアルゴリズム(DEA)

MetaTrader 5トレーディング |
16 0
Andrey Dik
Andrey Dik

内容

  1. はじめに
  2. アルゴリズムの実装
  3. テスト結果


はじめに

新しい記事を重ねるごとに、私たちの目標である「自動売買ロボットのための最適化問題を解く適切なアルゴリズムの発見」に一歩ずつ近づいています。本記事では、海洋生物のエコーロケーション能力に着想を得たもう一つの自然模倣型アルゴリズムを取り上げます。

暗い深海で獲物を探すイルカを想像してください。視界はほぼゼロですが、それでもイルカは正確に獲物を見つけることができます。その秘密は驚くべき能力にあります。イルカは一連のクリック音を発し、その反響を利用して周囲の空間を正確に把握します。興味深い点として、このクリックの頻度は状況によって変化します。広範囲を探索する際には低頻度で、獲物が近づくと高頻度になります。この独特な戦略がDEA(Dolphin Echolocation Algorithm、イルカのエコーロケーションアルゴリズム)の基礎となっています。

最適化の世界においても、私たちは同様の課題に直面します。すなわち、全体像が不明な広大な探索空間の中から最適解を見つけ出すという問題です。イルカが海中でおこなうように、まずは広く探索し、その後徐々に有望な領域へと焦点を絞っていきます。


アルゴリズムの実装

アルゴリズムの動作をより理解しやすくするために、次のような状況を想像してみましょう。あなたと友人たちが、金属探知機を手に広いビーチで金を探しているとします。探索の初期段階では、全体に散らばって行動するのが合理的です。そのほうが何か有望なものに偶然出会える確率が高くなるためです。しかし、誰かが強い信号を検知した瞬間、その情報は他のメンバーに共有され、チーム全体が徐々にその有望な地点へと集中していきます。最終的には全員が最も強い信号の周辺を掘っている状態になります。これがDEAの本質です。

アルゴリズムの中では、イルカの役割は探索エージェントによって担われます。これは解空間上の点です。それぞれの「イルカ」は問題の潜在的な解を表します。たとえば、単純な関数y = x²の最小値を探している場合、あるイルカはx = -3 (y = 9)に位置し、別のイルカは x = 1 (y = 1)に位置し、さらに別のイルカは偶然 x = 0 (y = 0)に到達します。この場合、それが最良解(チャンピオン)となります。

では、イルカ同士はどのように情報を共有するのでしょうか。ここで有効半径を表す「Re」の概念が登場します。これは懐中電灯の光の届く範囲を想像すると理解しやすくなります。Re = 1の場合、光は非常に狭い範囲しか照らしません。Re = 3ではより広い範囲をカバーし、Re = 5以上ではサーチライトのように広域を照らします。アルゴリズムにおいては、良い解に関する情報が近隣へ拡散し、その影響力は距離とともに減衰します。

これらすべての情報は「有望度マップ」として蓄積されます。アルゴリズムではこれを累積適応度(AF)と呼びます。これは都市のヒートマップのようなものと考えるとよいでしょう。「熱い」領域は活動が活発で良い解が見つかった場所を示します。ある領域で良い解が多く見つかるほど、その場所は「より熱く」なり、他のイルカを引き寄せます。

ただし、このアルゴリズムは単純なクラスタリングにとどまりません。「Predetermined Probability (PP)」と呼ばれるパラメータを用いて、探索と活用のバランスを制御します。初期段階ではPPは0.1程度と低く、アルゴリズムは広く探索をおこないます。その後PPが0.5付近になると既知の有望領域を重視し、さらにPPが1に近づくにつれて最も有効な方法のみを利用するようになります。

具体例として、丘陵地帯で最も高い地点を探す問題を考えます。探索の初期段階ではイルカたちはランダムに配置されており、谷、斜面、あるいは運よく山頂にいるものもいます。それぞれの位置の高さを評価した結果、最も高い位置にいるイルカが最良解を見つけたと判断されます。ここで興味深い現象が起こります。この優秀なイルカの周囲は他の個体にとって魅力的になりますが、重要なのは、そのイルカ自身の位置は一時的に「ゼロ化」される点です。これにより他のイルカは同一点に集中するのではなく、その周辺を探索するようになります。この仕組みにより早期収束を防ぎ、他の有望な解を見つけることができます。

アルゴリズムの進行に伴い状況は変化します。たとえば反復50回目では、イルカたちは丘陵地帯へ徐々に集まり始めますが、まだ多様性は維持されています。100回目では多くが最も高い地点に集中し、最終的にはすべてのイルカが大域的最大値へ収束します。アルゴリズムの性能はパラメータ設定に大きく依存します。

有効半径Reの設定は、局所探索と大域探索のバランスにおいて重要です。Re = 1の場合、非常に精密ですが局所的な探索になります。これは虫眼鏡で干し草の中の針を探すようなものです。Re = 3〜4はバランスの取れた設定で、懐中電灯で探索するような状態に相当します。Re > 5ではサーチライトのように広範囲をカバーしますが、その分精度は低下します。

Powerパラメータは、探索から活用への移行の急激さを制御します。Power = 1の場合、この遷移は滑らかで徐々に進行します。Power = 2(推奨値)の場合、より明確な遷移が生じます。Power = 3以上では非常に急激な切り替えとなり、特定の問題では有効に働くことがあります。

初期確率PP1は探索と活用の初期バランスを決定します。0.05のような低い値は空間の積極的探索を意味し、標準値0.1は良好なバランスを提供します。0.5のような高い値では、早い段階で既知の解に集中します。

DEAの主な利点は適応性にあります。アルゴリズムは新しい領域の探索と有望領域の活用のバランスを自動的に調整します。それにもかかわらず構造は比較的単純であり、必要な設定パラメータは4つだけです。累積適応度を通じた情報拡散の仕組みにより探索空間の情報を効率的に利用でき、最良解のAFをゼロ化することで局所最適への収束を回避します。

ただし、このアルゴリズムにも制限があります。すべての候補の累積適応度を保存するため追加メモリが必要であり、非常に大規模な探索空間では問題になる可能性があります。また、性能は有効半径Reの適切な選択に強く依存します。以下にアルゴリズムの模式図を示します。

dea_algorithm

図1:DEAアルゴリズムの動作

 図にはDEAの主要段階が示されています。

  1. 初期探索:イルカ(探索エージェント)が Re半径でランダムに配置される段階
  2. 累積適応度(AF)の分布:イルカの位置周辺にAFが蓄積される様子
  3. 収束過程:探索から活用への移行を示す3つのサブステージ

この図は、イルカがエコーロケーションを用いて最適解を見つける方法、累積適応度による情報伝播、有効半径Reが探索範囲に与える影響、そしてPPが探索と活用のバランスを制御する仕組みについての概念を理解するためのものです。 主な概念としては、PP(事前定義確率)およびAF(累積適応度)の計算式があります。 また、アルゴリズムのフローチャートでは、基本的なステップと反復的なサイクル構造が示されています。 さらに、Reパラメータの影響として、影響半径が「狭い」「中程度」「広い」場合の探索挙動が可視化されています。

図中の青は通常のイルカ、赤は最良解、青のグラデーションは累積適応度レベル、灰色は探索空間を表します。 

アルゴリズムの理解を深めるため、詳細な疑似コードを示します。 

入力パラメータ

  • イルカ(探索エージェント)の数
  • 有効エコーロケーション半径
  • 収束曲線の程度
  • 初期確率(事前定義)
  • 各次元の探索空間境界およびサンプリングステップ

初期化:

解候補空間の生成

  1. 各次元に対して可能な解候補集合を生成します。
  2. サンプリングステップが指定されている場合、その範囲で最小値から最大値まで生成します。
  3. ステップが指定されていない場合は500個の一様分布候補を生成します。
  4. 有効半径Reが候補数の4分の1を超えないように確認します。

イルカの初期配置

  1. すべてのイルカをランダムに配置します。
  2. 各イルカの位置の適合度を計算します。
  3. すべての候補の累積適応度を0で初期化します。

基本最適化ループ

指定された反復回数だけ繰り返します。

ステージ1:Predetermined Probabilityの計算

現在の反復における最良位置保持確率を計算します。初期は初期値と等しく、その後はべき関数に従って徐々に増加し、最終的に1へ収束します。

ステージ2:動的適応係数の計算

局所探索と大域探索のバランスを決定する係数を計算します。これは「最良解と最悪解の差」を「全個体の偏差合計」で割ったものとして定義されます。多様性が高い場合は係数が大きく、収束すると小さくなります。

ステージ3:適合度情報の蓄積

各イルカについて以下を実行します。

  • 現在の範囲に対して適合度を正規化する
  • 各座標についてイルカ位置に最も近い候補を見つける
  • その候補の周囲(エコーロケーション半径内)へ品質情報を拡散する
  • 距離に応じて影響力を線形に減衰させる
  • 境界での反射処理を適用し情報損失を防ぐ
  • ゼロ確率回避のため累積適応度に微小値を加算する

ステージ4:最良解の情報リセット

最良イルカを特定し、その座標に対応する候補の累積適応度をリセットします。これにより単一点への過度な集中を防ぎます。

ステージ5:新しい位置の選択

各イルカ・各座標について以下を実行します。

  • 最良イルカかつ位置保持確率がある場合、その座標を維持する
  • それ以外で累積情報がある場合、ルーレット選択で次の候補を選ぶ
  • 情報が不足している場合:
    • 動的係数に従って局所探索(Re内)
    • それ以外はランダムな大域探索
  • 探索空間制約と離散化を適用する

ステージ6:新位置の評価

新しい位置におけるすべてのイルカの解の品質を計算します。

ステージ7:大域情報更新

最良・最悪解を更新します。現在の大域最適より良い解が見つかった場合は保存します。

完了

すべての反復終了後、見つかった最良解とその評価値を返します。

それではDEAの実装に進みます。

まずS_Alternative構造体を定義します。これは最適化の意思決定プロセスにおける「候補」の情報を保持するためのものです。この構造体は、最適化における意思決定プロセスでの候補に関する情報を保持します。候補の値を表すvalueと、この候補に対する累積適応度を表すAFを保持します。

//————————————————————————————————————————————————————————————————————
struct S_Alternative
{
    double value;     // alternative value
    double AF;        // accumulated fitness for this alternative
};
//————————————————————————————————————————————————————————————————————

S_Coordinate構造体は、特定の座標に関連付けられた複数の候補を表現するために設計されています。altは候補の配列であり、それぞれの要素がその座標に対応する1つの候補を表します。countは現在alt配列に実際に格納されている候補の数を示す変数です。

//————————————————————————————————————————————————————————————————————
struct S_Coordinate
{
    S_Alternative alt [];  // array of alternatives for a given coordinate
    int           count;   // number of alternatives
};
//————————————————————————————————————————————————————————————————————

次に、最適化アルゴリズム(DEA)を直接実装するクラスの説明に移ります。C_AO_DEAクラスは基底クラスである C_AO を継承しています。このクラスオブジェクトを生成する際に、アルゴリズムの主要パラメータが初期化されます。

  • popSize:集団サイズ(「イルカ」または探索位置の数)を初期化
  • Re:有効探索半径の初期値
  • Power:収束曲線の次数
  • PP1:初期反復における事前定義確率を初期化
その後、params配列が初期化されます。この配列はユーザーが設定するアルゴリズムパラメータを格納するために使用されます。初期値としてのpopSize、Re、Power、PP1は、それぞれ対応する名前とともにparams配列へコピーされます。

SetParamsメソッドは、params配列に格納された値に基づいてアルゴリズムの内部パラメータを更新するために使用されます。popSize、Re、Power、PP1の各値を抽出した後、それらに対して妥当性チェックが実行されます。

メソッド

  • Init:アルゴリズムの初期化をおこないます。各パラメータの最小値・最大値・ステップ値、および総エポック数(反復回数)を受け取ります。
  • Moving:探索空間内で「イルカ」を移動させる処理を担当します。これはメインの最適化ループの一部です。
  • Revision:移動後の集団位置およびパラメータの調整をおこないます。

アルゴリズム実行のために内部で使用され、クラス外からはアクセスできないフィールドは以下の通りです。

  • PP:現在の反復における事前定義確率(確率的意思決定に使用される浮動小数)、currentEpoch:現在の反復回数(エポック)
  • totalEpochs:スケジュールされたエポックの総数
  • coeffA:位置選択に用いる動的係数
  • coordData:各座標ごとの S_Coordinate 構造体配(各座標に対する候補集合とその数を保持) 
メソッド
  • CalculatePP:現在の反復における PP(事前定義確率)を計算する
  • CalculateAccumulativeFitness:各候補に対する累積適応度を計算する
  • ResetAFforBestLocation:最良位置に対応する累積適応度をリセットする
  • SelectNextLocations:現在の状態に基づき、イルカの次の位置を選択する
  • FindNearestAlternative:与えられた座標と値に基づき、最も近い候補を検索する
  • CalculateCoefficientA:動的係数coeffAを計算する

全体としてC_AO_DEAクラスは、多次元空間における最適解探索のためにそのまま利用可能な構造になっています。公開メソッドを通じて初期化および主要な最適化ステップを実行できる一方で、内部メソッドとデータはアルゴリズムの中核ロジックを実装するためにカプセル化されています。

//————————————————————————————————————————————————————————————————————
class C_AO_DEA : public C_AO
{
  public: //----------------------------------------------------------
  ~C_AO_DEA () { }
  C_AO_DEA ()
  {
    ao_name = "DEA";
    ao_desc = "Dolphin Echolocation Algorithm";
    ao_link = "https://www.mql5.com/ja/articles/18495";

    popSize = 100;    // NL - number of locations (dolphins) 
    Re      = 2;      // effective search radius
    Power   = 2.0;    // convergence curve power
    PP1     = 1.0;    // first iteration convergence factor

    ArrayResize (params, 4);

    params [0].name = "popSize"; params [0].val = popSize;
    params [1].name = "Re";      params [1].val = Re;
    params [2].name = "Power";   params [2].val = Power;
    params [3].name = "PP1";     params [3].val = PP1;
  }

  void SetParams ()
  {
    popSize = (int)params [0].val;
    Re      = (int)params [1].val;
    Power   = params      [2].val;
    PP1     = params      [3].val;

    // Check the parameters validity
    if (Re < 0) Re = 0;
    if (PP1 < 0.0) PP1 = 0.0;
    if (PP1 > 1.0) PP1 = 1.0;
    if (Power < 0.1) Power = 0.1;
  }

  bool Init (const double &rangeMinP  [],  // minimum values
             const double &rangeMaxP  [],  // maximum values
             const double &rangeStepP [],  // step change
             const int     epochsP = 0);   // number of epochs

  void Moving   ();
  void Revision ();

  //------------------------------------------------------------------
  int    Re;           // effective search radius
  double Power;        // convergence curve power
  double PP1;          // first iteration convergence factor

  private: //---------------------------------------------------------
  double PP;           // predefined probability for the current iteration
  int    currentEpoch; // current epoch
  int    totalEpochs;  // total number of epochs
  double coeffA;       // dynamic coefficient used to select positions

  S_Coordinate coordData []; // coordinate data (alternatives and AF)

  void CalculatePP ();
  void CalculateAccumulativeFitness ();
  void ResetAFforBestLocation ();
  void SelectNextLocations    ();
  int  FindNearestAlternative (int coord, double value);
  void CalculateCoefficientA  ();
};
//————————————————————————————————————————————————————————————————————

C_AO_DEAクラスのInitメソッドは、DEAを初期化します。このメソッドは、各変数の最小値および最大値、各変数の変化ステップ、そして最適化の総エポック数(反復回数)を入力として受け取ります。まず、基底クラスのStandardInitメソッドが呼び出され、アルゴリズムに共通する標準的なパラメータの初期化がおこなわれます。この初期化が失敗した場合は、メソッドはfalseを返します。その後、アルゴリズムの現在エポックおよび総エポック数を管理する変数が初期化されます。

次に、探索空間の各座標(変数)に関する情報を保持するためにcoordDataデータ構造が生成されます。各座標について、取り得る候補値の数が決定されます。座標ごとにステップが指定されている場合は、境界値とステップ幅に基づいて候補数が計算されます。一方でステップが0の場合、その座標は連続変数として扱われ、固定数の候補が割り当てられます。

その後、探索半径パラメータであるReが確認され、必要に応じて調整されます。これは各座標における候補数の4分の1を超えないように制限されます。この制約により、情報拡散の範囲が過度に広がることを防ぎます。続いて、各座標ごとに候補値を格納するためのメモリが確保されます。

最後にループ処理が行われ、各座標の候補値配列が生成されます。候補値は最小値から最大値まで均等に分布するように設定されます。ステップが指定されている場合はそのステップ幅に従って値が計算され、ステップが指定されていない場合は境界内を離散化して候補が生成されます。また、各候補に対応する AF(累積適応度)は初期値としてゼロに設定されます。すべての初期化処理が正常に完了した場合、このメソッドはtrueを返します。

//————————————————————————————————————————————————————————————————————
//--- Initialization
bool C_AO_DEA::Init (const double &rangeMinP  [],
                     const double &rangeMaxP  [],
                     const double &rangeStepP [],
                     const int epochsP = 0)
{
  if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;

  //------------------------------------------------------------------
  currentEpoch = 0;
  totalEpochs  = epochsP;

  // Initialize the data structure for coordinates
  ArrayResize (coordData, coords);

  // Create alternatives for each coordinate
  for (int c = 0; c < coords; c++)
  {
    if (rangeStep [c] != 0)
    {
      coordData [c].count = (int)((rangeMax [c] - rangeMin [c]) / rangeStep [c]) + 1;
    }
    else
    {
      coordData [c].count = 500;
    }

    // Check that Re is not too large for the number of alternatives
    if (Re > coordData [c].count / 4) Re = coordData [c].count / 4;

    ArrayResize (coordData [c].alt, coordData [c].count);

    // Fill in the alternatives
    for (int i = 0; i < coordData [c].count; i++)
    {
      if (rangeStep [c] != 0)
      {
        coordData [c].alt [i].value = rangeMin [c] + i * rangeStep [c];
      }
      else
      {
        coordData [c].alt [i].value = rangeMin [c] + (rangeMax [c] - rangeMin [c]) * i / (coordData [c].count - 1);
      }
      coordData [c].alt [i].AF = 0.0;
    }
  }

  return true;
}
//————————————————————————————————————————————————————————————————————

Movingメソッドは、最適化プロセスにおける特定の反復に対応する、DEAアルゴリズムの主要ステップの1つを実装するものです。まず、これがrevisionフラグによって検出される初回反復である場合、初期のランダムな母集団座標が割り当てられます。各セクション(集団要素)および各変数の範囲に対してランダム値が生成されます。これらの値は、許容可能な解となるように、境界条件および変化ステップを考慮して調整されます。その後、初期化が完了したことを示すためにフラグが更新され、このループ処理は終了します。

初期化が完了すると、現在のエポック(反復)カウンタが1増加されます。続いてアルゴリズムの主要処理が実行されます。まず、現在の母集団内の各解について性能指標が算出され、各解が問題に対してどの程度適合しているかが評価されます。次に係数aが計算されます。これらの品質指標に基づき、各解の適応度を統合的に表す一般化指標が決定されます。また、各解に対してAFインデックスがリセットされることで、探索が最良解周辺領域へ集中するよう制御されます。その後、現在の情報および算出された係数を用いて、探索空間内で候補解を更新・移動させるための次の位置が決定されます。

総じて、MovingメソッドはDEAアルゴリズムの1回の反復サイクルを実装しており、最適解探索の過程において、解の更新と改善に関する主要ステップを順次実行する役割を担っています。

//————————————————————————————————————————————————————————————————————
//--- The main step of the algorithm (according to Algorithm 1)
void C_AO_DEA::Moving ()
{
  // Initial setup
  if (!revision)
  {
    for (int p = 0; p < popSize; p++)
    {
      for (int c = 0; c < coords; c++)
      {
        a [p].c  [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]);
        a [p].c  [c] = u.SeInDiSp (a [p].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
        a [p].cB [c] = a [p].c [c];
      }
    }

    revision = true;
    return;
  }

  // Increase the epoch counter
  currentEpoch++;

  // Steps of the DEA algorithm according to Algorithm 1:

  // 1. Calculate PP for the current iteration
  CalculatePP ();

  // 2. We calculate the 'a' dynamic coefficient
  CalculateCoefficientA ();

  // 3. Calculate accumulated fitness
  CalculateAccumulativeFitness ();

  // 4. Find the best location and reset AF for it
  ResetAFforBestLocation ();

  // 5. Select the next positions
  SelectNextLocations ();
}
//————————————————————————————————————————————————————————————————————

CalculatePPメソッドは、アルゴリズム内の意思決定プロセスで使用される事前定義確率(PP, predetermined probability)を計算するものです。エポック(反復回数)の総数が1以下である場合、確率は事前に設定された初期値(PP1)と等しく設定されます。この場合、それ以上の計算は不要であり、メソッドはその時点で終了します。

一方、エポック数が1より大きい場合、PP値は与えられた数式に基づいて計算されます。この計算では、現在のエポック数を用いた冪乗計算がおこなわれ、Powerパラメータに応じて累乗が適用されます。その後、同様に総エポック数についても冪乗計算がおこなわれます。

PP値は、エポックの進行度を反映しながら1に漸近するように更新されます。具体的には、現在の進捗に比例した項が計算され、それがPowerおよびtotalEpochsの影響を受けて調整された上で、初期値PP1に加算されます。最終的に、全体の指数項がゼロでない場合は除算が行われ、現在の確率が算出されます。そうでない場合は、PP値は初期値PP1のままとなります。

最終的にこのメソッドは、アルゴリズムの実行中に確率値を動的に変化させることで、初期状態の挙動と進行後の「より発展的な」挙動との間のバランスを確保する役割を担っています。

//————————————————————————————————————————————————————————————————————
//--- Calculate the predetermined probability (according to the formula 5)
void C_AO_DEA::CalculatePP ()
{
  if (totalEpochs <= 1)
  {
    PP = PP1;
    return;
  }

  // PP = PP1 + (1 - PP1) * ((Loop^Power - 1) / (LoopsNumber^Power - 1))
  double iterPower  = MathPow ((double)currentEpoch, Power) - 1.0;
  double totalPower = MathPow ((double)totalEpochs,  Power) - 1.0;

  if (totalPower != 0)
  {
    PP = PP1 + (1.0 - PP1) * iterPower / totalPower;
  }
  else
  {
    PP = PP1;
  }
}
//————————————————————————————————————————————————————————————————————

CalculateCoefficientAメソッドは、探索プロセスを制御するために使用される動的係数aを算出するものです。このメソッドでは、まず現在の解集合(集団)全体を走査し、各解について、最大可能な適応度fBとその解の現在の適応度a[i].fとの差分を計算します。これらの差分は逐次的に加算され、総和として蓄積されます。

すべての値の累積が完了した後、a係数は、fBと最小適応度fWの差を、先ほど求めた総和で割ることで算出されます。これにより、集団の状態に応じて変化する動的なスケーリング係数が定義されます。この係数は、探索空間における収束速度や探索の広がりのバランスを調整する役割を持ちます。

    すなわち、現在の解の分布状況を反映しながら、更新戦略および移動戦略に影響を与えるパラメータとして機能します。このメソッドは、適応度分布に基づくスケーリング因子を構築し、アルゴリズムの次の反復における解の更新挙動を制御する役割を担います。

    //————————————————————————————————————————————————————————————————————
    //--- Calculate the dynamic 'a' coefficient
    void C_AO_DEA::CalculateCoefficientA ()
    {
      double sumFitness = 0.0;
    
      for (int i = 0; i < popSize; i++)
      {
        sumFitness += fB - a [i].f;
      }
    
      coeffA = (fB - fW) / sumFitness;
    }
    //————————————————————————————————————————————————————————————————————
    

    FindNearestAlternativeメソッドは、与えられた値に対して、特定の座標内で最も近い候補を見つけるように設計されており、引数としてcoord(座標インデックス)とvalue(最も近い候補を求める値)を取ります。nearest(最も近い候補のインデックス)とminDist(最小距離)の初期値が初期化され、設定されます。

    ループは、与えられたcoordに関連付けられたすべての候補を走査します。各候補について、与えられたvalueと候補値coordData[coord].alt[i].valueとの間の距離が計算され、その計算された距離が現在の最小距離minDistより小さい場合、minDistはより小さい距離値に更新され、nearestは現在の候補のインデックスに更新されます。

    ループの完了後、与えられたcoord内でvalueに最も近い候補のインデックスが返されます。このようにして、このメソッドは指定された座標において、利用可能な候補の中から実数値に最も近いものを決定します。

    //————————————————————————————————————————————————————————————————————
    //--- Search for the closest alternative
    int C_AO_DEA::FindNearestAlternative (int coord, double value)
    {
      int nearest = 0;
      double minDist = DBL_MAX;
    
      for (int i = 0; i < coordData [coord].count; i++)
      {
        double dist = MathAbs (value - coordData [coord].alt [i].value);
        if (dist < minDist)
        {
          minDist = dist;
          nearest = i;
        }
      }
    
      return nearest;
    }
    //————————————————————————————————————————————————————————————————————
    

    CalculateAccumulativeFitnessメソッドは、アルゴリズム2に従って候補に対する累積適応度AFを計算するように設計されています。計算を開始する前に、各座標における各候補の累積適応度の値はすべてクリアされ、ゼロに設定されます。次に、現在の解の母集団における適応度の範囲が求められます。この範囲は、最大可能な適応度fBと最小適応度fWとの差として計算されます。

    その後、各エージェント(イルカ)について、その適応度が範囲に対して正規化されます。また、各探索座標において最も近い候補が決定され、その候補の周囲の半径Re内において、累積適応度が更新されます。この際、境界の反射特性が考慮されます。更新は重み付き加算によっておこなわれ、重みは最も近い候補からの距離に基づいて構成されます(境界の反射を考慮した距離)。さらに、その重みには半径Reにおける現在のステップに関連する係数が含まれます。

    このメソッドの処理結果として、各座標の各候補について、近隣候補の寄与を考慮した累積適応度の値が形成されます。

    //————————————————————————————————————————————————————————————————————
    //--- Calculate the accumulated fitness (according to Algorithm 2)
    void C_AO_DEA::CalculateAccumulativeFitness ()
    {
      // Clear the accumulated fitness for all alternatives
      for (int c = 0; c < coords; c++)
      {
        for (int i = 0; i < coordData [c].count; i++)
        {
          coordData [c].alt [i].AF = 0.0;
        }
      }
    
      double rangeFF = fB - fW;
      if (rangeFF == 0.0) rangeFF = DBL_EPSILON;
    
      // For each agent (dolphin)
      for (int i = 0; i < popSize; i++)
      {
        // Normalize 'fitness' for this agent
        double normalizedFitness = (a [i].f - fW) / rangeFF;
    
        for (int c = 0; c < coords; c++)
        {
          // Find the closest alternative for the current coordinate
          int nearestAlt = FindNearestAlternative (c, a [i].c [c]);
    
          // Update the accumulated fitness in Re radius
          // According to Algorithm 2: AF(A+k)j = (1/Re) * (Re - |k|) * fitness(i) + AF(A+k)j
          for (int k = -Re; k <= Re; k++)
          {
            int altIndex = nearestAlt + k;
    
            // Boundary check taking into account reflection (reflective characteristic)
            if (altIndex < 0)
            {
              altIndex = -altIndex; // reflection from the lower border
            }
            else if (altIndex >= coordData [c].count)
            {
              altIndex = 2 * (coordData [c].count - 1) - altIndex; // reflection from the upper border
            }
    
            if (altIndex >= 0 && altIndex < coordData [c].count)
            {
              double weight = (1.0 / (double)(Re + 1)) * (Re - MathAbs (k) + 1);
              coordData [c].alt [altIndex].AF += weight * normalizedFitness;
            }
          }
        }
      }
    
      // Add a small epsilon value to all AFs to avoid zero probabilities
      double epsilon = 0.0001;
      for (int c = 0; c < coords; c++)
      {
        for (int i = 0; i < coordData [c].count; i++)
        {
          coordData [c].alt [i].AF += epsilon;
        }
      }
    }
    //————————————————————————————————————————————————————————————————————
    
    

    ResetAFforBestLocationメソッドは、母集団における最良解(エージェント)の位置に対応する候補の累積適応度AFをリセットするように設計されています。まず、メソッドは現在の母集団における最良解のインデックスを決定します。すべての解を反復し、最も高い適応度値を持つ解を見つけます。最高適応度を持つ解のインデックスはbestIndex変数に格納されます。

    次に、最良解の各座標cについて、その座標における最良解の値に最も近い候補をFindNearestAlternative関数を用いて決定します。もしその候補が存在し(インデックスが許容範囲内にある場合)、その候補に対応する累積適応度AFの値はゼロにリセットされます。

    このようにして、このメソッドは最良解の座標に最も近い候補に対してのみAFをリセットします。これは、それらの候補がその後の探索段階に与える影響を低減し、探索空間の他の領域への探索を促進することを目的としています。

    結果として、最良解に最も対応する座標の適応度がゼロ化され、より良い、あるいは別の最適解の探索を促進するように機能します。

    //————————————————————————————————————————————————————————————————————
    //--- Reset AF for the best location (according to Algorithm 3)
    void C_AO_DEA::ResetAFforBestLocation ()
    {
      // Find the index of the best solution
      int bestIndex = 0;
      double bestFitness = a [0].f;
    
      // Search for a solution with maximum fitness (since we always maximize normalized fitness)
      for (int i = 1; i < popSize; i++)
      {
        if (a [i].f > bestFitness)
        {
          bestFitness = a [i].f;
          bestIndex = i;
        }
      }
    
      // Reset AF for ALL alternatives corresponding to the coordinates of the best solution
      for (int c = 0; c < coords; c++)
      {
        // Find the closest alternative to the coordinate of the best solution
        int nearestAlt = FindNearestAlternative (c, a [bestIndex].c [c]);
    
        // Reset AF only for this alternative
        if (nearestAlt >= 0 && nearestAlt < coordData [c].count)
        {
          coordData [c].alt [nearestAlt].AF = 0.0;
        }
      }
    }
    //————————————————————————————————————————————————————————————————————
    

    SelectNextLocationsメソッドは、集団内の各解(各イルカ)について、確率的な考慮と累積適応度(AF)および最良位置維持戦略の両方を踏まえて、次の位置を選択するように設計されています。まずメソッドは、現在の集団における適応度に基づいて最良解を決定します。最良解のインデックスは後続処理のために保存されます。

    各解およびその各座標について、以下の処理が行われます。現在の解が最良解であり、かつ乱数がPP確率より小さい場合、その解の現在の座標は変更されずに保持されます。これにより、これまでの最良解が維持されます。一方で、現在の解が最良解でない場合、またはPP条件によって位置が保持されない場合には、現在の座標におけるすべての候補のAF値が合計されます。その合計が小さな値(epsilon)より大きい場合、すなわち非ゼロの適応度値が存在する場合には、ルーレット選択が実行されます。乱数がAF総和に比例して生成され、累積AFに基づいて座標の候補が選択されることで、より高い適応度を持つ領域へ解が移動します。

    AFの合計がほぼゼロの場合には局所探索がおこなわれます。このとき、乱数が動的係数coeffAより小さい場合、現在値を基準として-Reから+Reの範囲でランダムなオフセットが選択され、その座標が更新されます。この際、境界条件が考慮されます。

    一方、乱数がcoeffA以上の場合には大域探索が行われ、完全にランダムな候補が座標として選択されます。最後に、得られた座標値は許容範囲rangeMinからrangeMaxに制限され、さらにrangeStep刻みで離散化されることで、値が許容された範囲内かつ許可された値集合に対応するよう調整されます。

    このメソッドは、累積適応度に基づく重み付き確率、PPによる最良解保持戦略、局所探索と大域探索の動的切り替えを組み合わせることで、探索空間を効率的に探索し、最適解を見つけるための役割を果たします。

    //————————————————————————————————————————————————————————————————————
    //--- Select next positions based on probabilities
    void C_AO_DEA::SelectNextLocations ()
    {
      // First we find the index of the best solution
      int bestIndex = 0;
      double bestFitness = a [0].f;
    
      for (int i = 1; i < popSize; i++)
      {
        if (a [i].f > bestFitness)
        {
          bestFitness = a [i].f;
          bestIndex = i;
        }
      }
    
      for (int i = 0; i < popSize; i++)
      {
        for (int c = 0; c < coords; c++)
        {
          // For the best agent, apply PP
          if (i == bestIndex && u.RNDprobab () < PP)
          {
            // Save the current value of the coordinate of the best solution with PP probability
            continue;
          }
    
          // Select based on accumulated fitness
          double totalAF = 0.0;
          for (int alt = 0; alt < coordData [c].count; alt++)
          {
            totalAF += coordData [c].alt [alt].AF;
          }
    
          if (totalAF > DBL_EPSILON) // Check that there are non-zero AFs
          {
            // Choose an alternative based on roulette
            double rnd = u.RNDprobab () * totalAF;
            double cumSum = 0.0;
    
            for (int alt = 0; alt < coordData [c].count; alt++)
            {
              cumSum += coordData [c].alt [alt].AF;
              if (cumSum >= rnd)
              {
                a [i].c [c] = coordData [c].alt [alt].value;
                break;
              }
            }
          }
          else
          {
            // If all AFs are almost zero, use random selection
            // with the dynamic coeffA coefficient for the local search probability
            if (u.RNDprobab () < coeffA) // Use the dynamic coefficient
            {
              // Local search - stay close to the current position
              int currentAlt = FindNearestAlternative (c, a [i].c [c]);
              int shift = u.RNDminusOne (2 * Re + 1) - Re; // random offset within Re
              int newAlt = currentAlt + shift;
    
              // Check boundaries
              if (newAlt < 0) newAlt = 0;
              if (newAlt >= coordData [c].count) newAlt = coordData [c].count - 1;
    
              a [i].c [c] = coordData [c].alt [newAlt].value;
            }
            else
            {
              // Global search - completely random selection
              int randAlt = u.RNDminusOne (coordData [c].count);
              a [i].c [c] = coordData [c].alt [randAlt].value;
            }
          }
    
          // Bounds checking and discretization
          a [i].c [c] = u.SeInDiSp (a [i].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
        }
      }
    }
    //————————————————————————————————————————————————————————————————————
    

    Revisionメソッドは、現在の母集団における最良解および最悪解に関する情報を更新するために使用されます。最良解のインデックスが指定され、最良適応度を格納する変数には現在の最悪値が代入されます。これにより、新たな極値を探索するための初期状態が形成されます。次に、現在の集団内のすべての解が探索され、最大の適応度値を持つ解(最良解)が決定されます。その値は保存され、対応するインデックスが更新されます。同時に、最小の適応度値を持つ解(最悪解)も探索されます。真の最良解が見つかった場合、その座標は現在の最良解を保存するために用意された特別な配列または変数にコピーされます。

    このメソッドの実行結果として、現在時点における母集団内の最良解および最悪解の座標が正確に把握されます。これによりアルゴリズムは探索の動的変化を追跡し、その情報を意思決定に利用して、より良い最適解の発見を行うことが可能になります。

    //————————————————————————————————————————————————————————————————————
    //--- Update the best solution
    void C_AO_DEA::Revision ()
    {
      int bestIND = -1;
      fW = fB;
    
      // Find the best and worst solutions in the current population
      for (int i = 0; i < popSize; i++)
      {
        // Update the best solution
        if (a [i].f > fB)
        {
          fB = a [i].f;
          bestIND = i;
        }
    
        // Update the worst solution
        if (a [i].f < fW)
        {
          fW = a [i].f;
        }
      }
    
      // Copy the coordinates of the best solution
      if (bestIND != -1)
      {
        ArrayCopy (cB, a [bestIND].c, 0, 0, WHOLE_ARRAY);
      }
    }
    //————————————————————————————————————————————————————————————————————
    


    テスト結果

    それでは結果を見ていきます。すぐに分かることとして、このアルゴリズムはさまざまな種類のタスクに対して良好かつ高速な収束を示しています。

    DEA|Dolphin Echolocation Algorithm|100.0|2.0|2.0|1.0|

    =============================
    5 Hilly's; Func runs:10000; result:0.7599517883429889
    25 Hilly's; Func runs:10000; result:0.6757192867862007
    500 Hilly's; Func runs:10000; result:0.34170057553968197
    =============================
    5 Forest's; Func runs:10000; result:0.8958173952258406
    25 Forest's; Func runs:10000; result:0.6422393144820473
    500 Forest's; Func runs:10000; result:0.23940903266305935
    =============================
    5 Megacity's; Func runs:10000; result:0.6153846153846154
    25 Megacity's; Func runs:10000; result:0.4403076923076923
    500 Megacity's; Func runs:10000; result:0.15115384615384736
    =============================
    All score:4.76168 (52.91%)

    可視化は、低次元関数(緑)では結果にばらつきが見られ、中次元関数(青)では良好な結果が得られていることを示しています。

    Hilly

    Hillyテスト関数におけるDEA

    Forest

    Forestテスト関数におけるDEA

    Megacity

    Megacityテスト関数におけるDEA

    その結果に基づくと、DEAアルゴリズムはランキング表において25位を占めています。

    # AO 詳細 Hilly Hilly
    ファイナル
    Forest Forest
    ファイナル
    Megacity(離散) Megacity
    ファイナル
    ファイナル
    結果
    最大値の
    10p(5F) 50p(25F) 1000p(500F) 10 p (5 F) 50p(25F) 1000p(500F) 10 p (5 F) 50p(25F) 1000p(500F)
    1 ANS across neighbourhood search 0.94948 0.84776 0.43857 2.23581 1.00000 0.92334 0.39988 2.32323 0.70923 0.63477 0.23091 1.57491 6.134 68.15
    2 CLA コードロックアルゴリズム(joo) 0.95345 0.87107 0.37590 2.20042 0.98942 0.91709 0.31642 2.22294 0.79692 0.69385 0.19303 1.68380 6.107 67.86
    3 AMOm 動物移動最適化m 0.90358 0.84317 0.46284 2.20959 0.99001 0.92436 0.46598 2.38034 0.56769 0.59132 0.23773 1.39675 5.987 66.52
    4 (P+O)ES (P+O)進化戦略 0.92256 0.88101 0.40021 2.20379 0.97750 0.87490 0.31945 2.17185 0.67385 0.62985 0.18634 1.49003 5.866 65.17
    5 CTA 彗星の尾アルゴリズム(joo) 0.95346 0.86319 0.27770 2.09435 0.99794 0.85740 0.33949 2.19484 0.88769 0.56431 0.10512 1.55712 5.846 64.96
    6 TETA 時間進化移動アルゴリズム(joo) 0.91362 0.82349 0.31990 2.05701 0.97096 0.89532 0.29324 2.15952 0.73462 0.68569 0.16021 1.58052 5.797 64.41
    7 SDSm 確率的拡散探索M 0.93066 0.85445 0.39476 2.17988 0.99983 0.89244 0.19619 2.08846 0.72333 0.61100 0.10670 1.44103 5.709 63.44
    8 BOAm ビリヤード最適化アルゴリズムM 0.95757 0.82599 0.25235 2.03590 1.00000 0.90036 0.30502 2.20538 0.73538 0.52523 0.09563 1.35625 5.598 62.19
    9 AAm アーチェリーアルゴリズムM 0.91744 0.70876 0.42160 2.04780 0.92527 0.75802 0.35328 2.03657 0.67385 0.55200 0.23738 1.46323 5.548 61.64
    10 ESG 社会集団の進化(joo) 0.99906 0.79654 0.35056 2.14616 1.00000 0.82863 0.13102 1.95965 0.82333 0.55300 0.04725 1.42358 5.529 61.44
    11 SIA 等方的焼きなまし(joo) 0.95784 0.84264 0.41465 2.21513 0.98239 0.79586 0.20507 1.98332 0.68667 0.49300 0.09053 1.27020 5.469 60.76
    12 BBO 生物地理学に基づく最適化 0.94912 0.69456 0.35031 1.99399 0.93820 0.67365 0.25682 1.86867 0.74615 0.48277 0.17369 1.40261 5.265 58.50
    13 ACS 人工協調探索 0.75547 0.74744 0.30407 1.80698 1.00000 0.88861 0.22413 2.11274 0.69077 0.48185 0.13322 1.30583 5.226 58.06
    14 DA 弁証法的アルゴリズム 0.86183 0.70033 0.33724 1.89940 0.98163 0.72772 0.28718 1.99653 0.70308 0.45292 0.16367 1.31967 5.216 57.95
    15 BHAm ブラックホールアルゴリズムM 0.75236 0.76675 0.34583 1.86493 0.93593 0.80152 0.27177 2.00923 0.65077 0.51646 0.15472 1.32195 5.196 57.73
    16 ASO 無政府社会最適化 0.84872 0.74646 0.31465 1.90983 0.96148 0.79150 0.23803 1.99101 0.57077 0.54062 0.16614 1.27752 5.178 57.54
    17 RFO ロイヤルフラッシュ最適化(joo) 0.83361 0.73742 0.34629 1.91733 0.89424 0.73824 0.24098 1.87346 0.63154 0.50292 0.16421 1.29867 5.089 56.55
    18 AOSm 原子軌道探索M 0.80232 0.70449 0.31021 1.81702 0.85660 0.69451 0.21996 1.77107 0.74615 0.52862 0.14358 1.41835 5.006 55.63
    19 TSEA 亀甲進化アルゴリズム(joo) 0.96798 0.64480 0.29672 1.90949 0.99449 0.61981 0.22708 1.84139 0.69077 0.42646 0.13598 1.25322 5.004 55.60
    20 DE 差分進化 0.95044 0.61674 0.30308 1.87026 0.95317 0.78896 0.16652 1.90865 0.78667 0.36033 0.02953 1.17653 4.955 55.06
    21 SRA レストラン経営達人アルゴリズム(joo) 0.96883 0.63455 0.29217 1.89555 0.94637 0.55506 0.19124 1.69267 0.74923 0.44031 0.12526 1.31480 4.903 54.48
    22 CRO 化学反応の最適化 0.94629 0.66112 0.29853 1.90593 0.87906 0.58422 0.21146 1.67473 0.75846 0.42646 0.12686 1.31178 4.892 54.36
    23 BIO 血液型遺伝最適化(joo) 0.81568 0.65336 0.30877 1.77781 0.89937 0.65319 0.21760 1.77016 0.67846 0.47631 0.13902 1.29378 4.842 53.80
    24 BSA 鳥群アルゴリズム 0.89306 0.64900 0.26250 1.80455 0.92420 0.71121 0.24939 1.88479 0.69385 0.32615 0.10012 1.12012 4.809 53.44
    25 DEA dolphin_echolocation_algorithm 0.75995 0.67572 0.34171 1.77738 0.89582 0.64223 0.23941 1.77746 0.61538 0.44031 0.15115 1.20684 4.762 52.91
    26 HS ハーモニー検索 0.86509 0.68782 0.32527 1.87818 0.99999 0.68002 0.09590 1.77592 0.62000 0.42267 0.05458 1.09725 4.751 52.79
    27 SSG 苗木の播種と育成 0.77839 0.64925 0.39543 1.82308 0.85973 0.62467 0.17429 1.65869 0.64667 0.44133 0.10598 1.19398 4.676 51.95
    28 BCOm 細菌走化性最適化M 0.75953 0.62268 0.31483 1.69704 0.89378 0.61339 0.22542 1.73259 0.65385 0.42092 0.14435 1.21912 4.649 51.65
    29 ABO アフリカ水牛の最適化 0.83337 0.62247 0.29964 1.75548 0.92170 0.58618 0.19723 1.70511 0.61000 0.43154 0.13225 1.17378 4.634 51.49
    30 (PO)ES (PO)進化戦略 0.79025 0.62647 0.42935 1.84606 0.87616 0.60943 0.19591 1.68151 0.59000 0.37933 0.11322 1.08255 4.610 51.22
    31 FBA フラクタルベースのアルゴリズム 0.79000 0.65134 0.28965 1.73099 0.87158 0.56823 0.18877 1.62858 0.61077 0.46062 0.12398 1.19537 4.555 50.61
    32 TSm タブーサーチM 0.87795 0.61431 0.29104 1.78330 0.92885 0.51844 0.19054 1.63783 0.61077 0.38215 0.12157 1.11449 4.536 50.40
    33 BSO ブレインストーム最適化 0.93736 0.57616 0.29688 1.81041 0.93131 0.55866 0.23537 1.72534 0.55231 0.29077 0.11914 0.96222 4.498 49.98
    34 WOAm 鯨最適化アルゴリズムM 0.84521 0.56298 0.26263 1.67081 0.93100 0.52278 0.16365 1.61743 0.66308 0.41138 0.11357 1.18803 4.476 49.74
    35 AEFA 人工電界アルゴリズム 0.87700 0.61753 0.25235 1.74688 0.92729 0.72698 0.18064 1.83490 0.66615 0.11631 0.09508 0.87754 4.459 49.55
    36 AEO 人工生態系ベースの最適化アルゴリズム 0.91380 0.46713 0.26470 1.64563 0.90223 0.43705 0.21400 1.55327 0.66154 0.30800 0.28563 1.25517 4.454 49.49
    37 CAm ラクダアルゴリズムM 0.78684 0.56042 0.35133 1.69859 0.82772 0.56041 0.24336 1.63149 0.64846 0.33092 0.13418 1.11356 4.444 49.37
    38 ACOm 蟻コロニー最適化M 0.88190 0.66127 0.30377 1.84693 0.85873 0.58680 0.15051 1.59604 0.59667 0.37333 0.02472 0.99472 4.438 49.31
    39 CMAES 共分散行列適応進化戦略 0.76258 0.72089 0.00000 1.48347 0.82056 0.79616 0.00000 1.61672 0.75846 0.49077 0.00000 1.24923 4.349 48.33
    40 BFO-GA 細菌採食の最適化:Ga 0.89150 0.55111 0.31529 1.75790 0.96982 0.39612 0.06305 1.42899 0.72667 0.27500 0.03525 1.03692 4.224 46.93
    41 SOA シンプル最適化アルゴリズム 0.91520 0.46976 0.27089 1.65585 0.89675 0.37401 0.16984 1.44060 0.69538 0.28031 0.10852 1.08422 4.181 46.45
    42 ABHA 人工蜂の巣アルゴリズム 0.84131 0.54227 0.26304 1.64663 0.87858 0.47779 0.17181 1.52818 0.50923 0.33877 0.10397 0.95197 4.127 45.85
    43 ACMO 大気雲モデルの最適化 0.90321 0.48546 0.30403 1.69270 0.80268 0.37857 0.19178 1.37303 0.62308 0.24400 0.10795 0.97503 4.041 44.90
    44 ADAMm 適応モーメント推定M 0.88635 0.44766 0.26613 1.60014 0.84497 0.38493 0.16889 1.39880 0.66154 0.27046 0.10594 1.03794 4.037 44.85
    45 CGO カオスゲーム最適化 0.57256 0.37158 0.32018 1.26432 0.61176 0.61931 0.62161 1.85267 0.37538 0.21923 0.19028 0.78490 3.902 43.35
    RW ランダムウォーク 0.48754 0.32159 0.25781 1.06694 0.37554 0.21944 0.15877 0.75375 0.27969 0.14917 0.09847 0.52734 2.348 26.09


    まとめ

    このアルゴリズムの主な利点は次の通りです。 適応的な探索制御では、事前定義確率が徐々に増加し、探索と活用のバランスが探索から活用へと移行します。動的適応では、アルゴリズムが現在の集団の状態に応じて挙動を変化させます。集団的記憶では、累積適応度が有望な領域に関する情報を保持し、それを拡散させます。多様性メカニズムでは、最良位置のリセットが新たな領域の探索を促進します。

    このアルゴリズムの強みは、その適応性にあります。動的係数によりアルゴリズムは母集団の状態に応答し、タスクの進行に合わせて調整されます。イルカが探索空間に分散している場合には局所探索を促進し、目的へ収束し始めると新たな方向へ押し出すことで、局所解にとどまることを防ぎます。

    累積適応度は群れの集合的記憶であり、すべての発見が解空間に痕跡を残します。ただし単純な蓄積とは異なり、このアルゴリズムは「忘却」することが可能であり、最良位置をゼロにリセットすることで、逆説的により良い発見を導きます。

    これは単なる比喩ではなく、最適化の哲学でもあり、エコーロケーションの一つ一つの反響が可能性の空間に関する情報を運んでいます。

    tab

    図2:対応するテストに応じたアルゴリズムのカラーグラデーション

    chart

    図3:アルゴリズムテスト結果のヒストグラム(0から100のスケール、高いほど良い)100は理論上の最大値であり、アーカイブには評価表を計算するためのスクリプトがあります。

    DEAの長所と短所

    長所

    1. 中次元および高次元関数における良好な収束性
    2. 外部パラメータの数が少ない

    短所

    1. 低次元問題では局所解に陥りやすい傾向がある
    2. 高次元関数におけるリソース消費量の高さ

    この記事には、最新版のアルゴリズムコードを含むアーカイブが添付されています。記事の著者は、古典的なアルゴリズムの説明の絶対的な正確さについて責任を負いません。探索性能を向上させるために、それらの多くに変更が加えられています。記事に示された結論と判断は、実験結果に基づいています。


    記事で使用されているプログラム

    # 名前 種類 詳細
    1 #C_AO.mqh
    インクルード
    集団最適化アルゴリズムの親クラス
    2 #C_AO_enum.mqh
    インクルード
    集団最適化アルゴリズムの列挙
    3 TestFunctions.mqh
    インクルード
    テスト関数のライブラリ
    4
    TestStandFunctions.mqh
    インクルード
    テストスタンド関数ライブラリ
    5
    Utilities.mqh
    インクルード
    補助関数のライブラリ
    6
    CalculationTestResults.mqh
    インクルード
    比較表の結果を計算するスクリプト
    7
    Testing AOs.mq5
    スクリプト すべての集団最適化アルゴリズムの統一テストスタンド
    8
    Simple use of population optimization algorithms.mq5
    スクリプト
    可視化せずに集団最適化アルゴリズムを使用する簡単な例
    9
    Test_AO_DEA.mq5
    スクリプト DEAテストスタンド

    MetaQuotes Ltdによってロシア語から翻訳されました。
    元の記事: https://www.mql5.com/ru/articles/18495

    添付されたファイル |
    DEA.zip (236.09 KB)
    EAのサンプル EAのサンプル
    一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。
    金融時系列のテクニカル分析におけるグレーモデルの応用 金融時系列のテクニカル分析におけるグレーモデルの応用
    本記事では、トレーダーの分析能力を拡張する有望なツールであるグレーモデルについて解説します。また、このモデルをテクニカル分析や取引戦略構築に応用するためのいくつかの方法についても検討します。
    エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
    この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
    機械学習を用いたフラクタルパターンの検出と分類 機械学習を用いたフラクタルパターンの検出と分類
    本記事では、フラクタル解析と機械学習を用いた市場予測という興味深いテーマを取り上げます。これらは、金融価格チャート上に形成される多様なフラクタル構造を探究するための第一歩に過ぎません。本記事では、相関を用いてパターンを検出し、CatBoostアルゴリズムでそれらを分類します。