English Русский 中文 Español Deutsch Português
preview
母集団最適化アルゴリズム:電磁気的アルゴリズム(ЕМ)

母集団最適化アルゴリズム:電磁気的アルゴリズム(ЕМ)

MetaTrader 5 | 29 5月 2023, 11:04
207 0
Andrey Dik
Andrey Dik

内容:

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


1.はじめに

過去数十年、世界中の研究者が複雑な大域的最適化問題を解くためのメタヒューリスティック探索手法とその改善方法を数多く考え出してきました。

電磁気的(ЕМ)アルゴリズムは、物理空間における電磁粒子の挙動のシミュレーションに基づく比較的新しいメタヒューリスティクス探索アルゴリズムで、2003年にI. BirbilとS.С.Fang によって紹介されました。荷電粒子間の相互作用の電磁力に基づく集団とランダムなノイズを持つ進化型アルゴリズムと説明されています。

本アルゴリズムは、電磁気学の理論における電荷の引力と斥力のメカニズムに着想を得て、連続領域において制限のない非線形最適化問題を解くものです。EMは複雑な大域的最適化問題を解くことができるため、最適化ツールとして様々な分野で広く利用されています。

以下は、電磁気学と電荷に関する興味深い事実です。

  • 電荷には、プラスとマイナスの2種類があります。すべての電荷は、プラスかマイナスのどちらかです。
  • 電磁界を利用すると、電波の形で情報を伝達することができます。ラジオを聴くとき、テレビを見るとき、私たちは毎日この機能を使っています。
  • 地球には磁場があり、太陽風や宇宙線から私たちを守ってくれます。
  • 磁気を帯びることのできる素材はさまざまで、それによって電磁石を作ることができます。電磁石は、発電機などさまざまな用途に使われています。
  • 電磁気学を基にした応用例は数多くあります。例えば、パソコンや携帯電話などには、電磁波の技術が使われています。
  • すべての発光体(例えば、電球や車のライト)は、電磁波を発しています。
  • また、電磁気学は医療においても重要な役割を担っています。MRIやCTなどの医療機器は、電磁場を利用して体内を画像化するものです。
  • サメや電気ウナギなど、電磁気を使って水中を移動できる動物もいます。
  • 電磁気学は、重力、弱い力、強い力とともに、自然界の4つの基本的な力の1つです。


2.アルゴリズム

電磁気学の理論に基づき、電荷の引力・斥力のメカニズムをシミュレーションし、限られた変数で大局的最適解を導き出します。アルゴリズムでは、すべての解を探索空間における荷電粒子とみなし、各粒子の荷電は目的関数の値に関連付けられます。目的出力が良い粒子は引力、目的値が悪い粒子は斥力を他の粒子に加えることになります。目的関数の値が良いほど、粒子間の引力や斥力が高くなります。

アルゴリズムの原理は、初期段階でランダムな解の集団が形成され、各解は電磁粒子の電荷に対応する座標のベクトルで表現されることです。さらに、アルゴリズムの各反復において、これらの電荷の空間における運動が、電磁力の作用の下でシミュレートされます。移動中、各電荷は他の電荷と相互作用し、移動方向や速度を変化させます。その結果、目的関数の最適値への解の収束が徐々に進むことになります。

EMアルゴリズムの主な構成要素は以下の通りです。

  1. 解(電荷)の初期集団の形成。各電荷は座標ベクトルで表され、最適化問題の特定の解に対応します。
  2. 電荷間の相互作用による電磁力の計算。この計算はアルゴリズムの各反復でおこなわれ、電荷(解)間の距離に依存します。
  3. 相互作用の電磁力の作用を受けた、空間内の電荷の移動。
  4. 各反復での解の母集団の目的関数による更新。目的関数は、例えば、機械学習問題における損失関数とすることができます。
  5. アルゴリズムを停止する条件の決定(目的関数の値がある値に達した場合など)。

粒子は互いに影響し合い、電荷や距離によって引き合ったり反発したりします。このアルゴリズムは何度か繰り返され、そのたびに粒子の座標と電荷が更新され、適性関数の新しい値が計算されます。

EM最適化アルゴリズムの論理的な単位は粒子で、探索空間のエージェントであるS_Particle構造体で記述できます。各粒子は、探索空間での位置を決めるc []座標と、他の粒子との相互作用に影響を与えるC電荷を持っています。各粒子について、与えられた座標に対応する解の品質を評価する適合度関数fの値が計算されます。また、各粒子について、他の粒子との距離Rと、探索空間における粒子の運動方向を決定する力ベクトルFが算出されます。

//——————————————————————————————————————————————————————————————————————————————
struct S_Particle
{
  double c  [];   //coordinates
  double C;       //charge
  double f;       //fitness
  double R  [];   //euclidean distance to other particles
  double F  [];   //force vector
};
//——————————————————————————————————————————————————————————————————————————————

C_AO_EMクラスは、電磁最適化アルゴリズムを実装したクラスで、ある実数の集合で与えられた関数の最適値を求めるのに使われます。このアルゴリズムは、物理システムにおける磁性粒子と電気粒子の相互作用のプロセスをシミュレートすることに基づいています。

このクラスには、以下のフィールドがあります。

  • S_Particle p[]:最適化問題の潜在的な解を表す粒子の配列
  • double rangeMax[]:各座標の検索範囲の最大値を表す配列
  • double rangeMin[]:各座標の検索範囲の最小値を表す配列
  • double rangeStep[]:各座標に対する探索ステップの配列
  • double cB[]:最適解の座標の配列
  • double fB:最良解関数の値

クラスは以下のメソッドを含みます。

  • void Init():アルゴリズムを初期化し、座標数、粒子数、環境定数、移動ステップを設定
  • void Moving(int iter):磁場と電場の相互作用の規則に従って粒子を移動させるアルゴリズムを繰り返し実行
  • void Revision():粒子が検索範囲を越えていないか確認し、必要に応じて位置を修正

また、このクラスにはprivateフィールドがあります。

  • int coordinatesNumber:座標の数
  • int particlesNumber:粒子の数
  • double envConstant:環境定数
  • double movConstant:移動ステップ
  • double exponent:距離指数
  • double vect[]:ベクトルの配列
  • bool revision:粒子のリビジョンが必要であることを示すフラグ

このクラスには、privateメソッドがあります。

  • double SeInDiSp(double In, double InMin, double InMax, double Step):一様なグリッド上に点を分布させる
  • double RNDfromCI(double min, double max):与えられた範囲内の乱数を生成する
//——————————————————————————————————————————————————————————————————————————————
class C_AO_EM
{
  //----------------------------------------------------------------------------
  public: S_Particle p     []; //particles
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //minimum search range
  public: double rangeStep []; //step search
  public: double cB        []; //best coordinates
  public: double fB;           //FF of the best coordinates

  public: void Init (const int    coordinatesNumberP, //coordinates number
                     const int    particlesNumberP,   //particles number
                     const double envConstantP,       //environmental constant
                     const double movConstantP,       //movement step
                     const double exponentP);         //exponent

  public: void Moving   ();
  public: void Revision ();

  //----------------------------------------------------------------------------
  private: int    coordinatesNumber; //coordinates number
  private: int    particlesNumber;   //particles number
  private: double envConstant;       //environmental constant
  private: double movConstant;       //movement step
  private: double exponent;          //exponent
  private: double vect    [];        //vector
  private: bool   revision;

  private: double SeInDiSp  (double In, double InMin, double InMax, double Step);
  private: double RNDfromCI (double min, double max);
};
//——————————————————————————————————————————————————————————————————————————————

EM最適化アルゴリズムの初期化メソッドは、まず乱数発生器をリセットし、いくつかの変数に初期値を設定します。そして、座標の数、粒子の数、環境の値、移動ステップといういくつかのパラメータを入力として受け取ります。次に、必要なサイズの配列を複数作成し、初期値で埋めます。

配列には、各座標の範囲の最大値と最小値、座標を変更するステップ、ベクトル、各粒子の現在位置が格納されています。次に、このメソッドは粒子の配列を作成し、各粒子について、その座標、他の粒子との距離の行列、力ベクトル、関数の現在の最適値を格納する配列を作成します。最後に、すべての粒子の最適な座標を保存するための配列を作成します。このように、このメソッドはEM最適化アルゴリズムが動作するために必要な変数や配列をすべて初期化します。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_EM::Init (const int    coordinatesNumberP, //coordinates number
                    const int    particlesNumberP,   //particles number
                    const double envConstantP,       //environmental constant
                    const double movConstantP,       //movement step
                    const double exponentP)          //exponent
{
  MathSrand ((int)GetMicrosecondCount ()); // reset of the generator
  fB       = -DBL_MAX;
  revision = false;

  coordinatesNumber = coordinatesNumberP;
  particlesNumber   = particlesNumberP;
  envConstant       = envConstantP;
  movConstant       = movConstantP;
  exponent          = exponentP;

  ArrayResize (rangeMax,  coordinatesNumber);
  ArrayResize (rangeMin,  coordinatesNumber);
  ArrayResize (rangeStep, coordinatesNumber);
  ArrayResize (vect,      coordinatesNumber);

  ArrayResize (p,  particlesNumber);

  for (int i = 0; i < particlesNumber; i++)
  {
    ArrayResize (p [i].c,  coordinatesNumber);
    ArrayResize (p [i].R,  particlesNumber);
    ArrayResize (p [i].F,  coordinatesNumber);
    p [i].f  = -DBL_MAX;
  }

  ArrayResize (cB, coordinatesNumber);
}
//——————————————————————————————————————————————————————————————————————————————

Moving()メソッドは、各反復で最初に実行される必要があります。これは、解探索空間における粒子の移動を担当します。まず、粒子がすでに初期化されているかどうかをチェックします。もしそうでなければ、各粒子は与えられた範囲内でランダムな座標を受け取り、現在の推定値と電荷をゼロにリセットします。また、探索空間の各次元における最大値と最小値の差分ベクトルvect []が算出されます。

//----------------------------------------------------------------------------
if (!revision)
{
  fB = -DBL_MAX;

  for (int obj = 0; obj < particlesNumber; obj++)
  {
    for (int c = 0; c < coordinatesNumber; c++)
    {
      p [obj].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]);
      p [obj].c [c] = SeInDiSp (p [obj].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      p [obj].C     = 0.0;
      p [obj].f     = -DBL_MAX;
    }
  }

  for (int c = 0; c < coordinatesNumber; c++)
  {
    vect [c] = rangeMax [c] - rangeMin [c];
  }

  revision = true;
}

初期化が既に実施されている場合、このメソッドは、全粒子のグローバル最大値からの偏差の合計に正規化されたグローバル最大値からの偏差に基づいて、各粒子の電荷を計算します。差分の和を以下のように計算します。

//calculate the sum of the differences of the fitness of the particles with the global value
for (int obj = 0; obj < particlesNumber; obj++)
{
  sumDiff += fB - p [obj].f;
}

粒子電荷は、次の式で計算されます。

p [obj].C = exp (-particlesNumber * ((fB - p [obj].f) / sumDiff));
ご覧の通り、式中の電荷の値は正です。電荷の符号は、後のアルゴリズムで考慮されます。最大値からのずれの差の和がゼロであれば、粒子の電荷はゼロと仮定されます。算出された粒子の電荷は、力計算ステップにおいて、粒子から他の関連する粒子に作用する力の振幅を決定することになります。粒子の電荷を計算するコードは、次のようになります。

//calculating the charge of particles=======================================
for (int obj = 0; obj < particlesNumber; obj++)
{
  if (sumDiff == 0.0)
  {
    p [obj].C = 0.0;
  }
  else
  {
    p [obj].C = exp (-particlesNumber * ((fB - p [obj].f) / sumDiff));
  }
}

粒子間の距離の計算を始める前に、粒子から他の粒子までの距離の配列をリセットし、また粒子に作用する力のベクトルをリセットする必要があります。

//calculation of Euclidean distances between all particles==================
for (int obj = 0; obj < particlesNumber; obj++)
{
  ArrayInitialize (p [obj].R, 0.0);
  ArrayInitialize (p [obj].F, 0.0);
}

そして、すべてのペアの粒子間の距離と、粒子間に働く力を計算します。これは、荷電粒子間の相互作用を記述するクーロンの法則に基づく計算式を使用しています。各粒子に作用する力は、他の粒子から作用するすべての力のベクトル和として計算されます。

電磁気学の理論によれば、ある粒子が他の粒子に作用する力は、2つの粒子間の距離に反比例し、その電荷の積に正比例します。目的値の低い粒子は、目的値の相対的に高い粒子に反発力を与えます。同様に、目的値が悪い領域から良い粒子を押し退けます。一方、目的値の高い粒子は、相対的に低い粒子に吸引力を発揮します。

他のすべての粒子によって発生する関連するすべての力を考慮して、粒子のための合計力ベクトルが計算されます。この合力ベクトルが、粒子運動フェーズにおける粒子の移動方向を決定します。アルゴリズムの著者は、粒子の力ベクトルを全粒子間の力ベクトルに正規化することを推奨しています。私の実験では、正規化しない方が結果が良いという結果が出ましたので、正規化せずにコードを掲載しています。

どちらの粒子の目的関数の値が大きいかによって、力の方向を設定します(電荷の符号を真似ます)。

for (int obj = 0; obj < particlesNumber; obj++)
{
  for (int obj2 = 0; obj2 < particlesNumber; obj2++)
  {
    if (obj != obj2)
    {
      if (p [obj].R [obj2] == 0.0)
      {
        for (int c = 0; c < coordinatesNumber; c++)
        {
          diffDist = p [obj].c [c] - p [obj2].c [c];
          p [obj].R [obj2] += diffDist * diffDist;
        }

        p [obj].R [obj2] = sqrt (p [obj].R [obj2]);
        p [obj2].R [obj] = p [obj].R [obj2];

        //calculation of the force------------------------------------------
        Fp = p [obj].C * p [obj2].C / (4.0 * M_PI * envConstant * pow (p [obj].R [obj2], exponent));

        for (int c = 0; c < coordinatesNumber; c++)
        {
          if (p [obj].f > p [obj2].f)
          {
            p [obj ].F [c] += (p [obj2].c [c] - p [obj].c [c]) * Fp;
            p [obj2].F [c] -= (p [obj2].c [c] - p [obj].c [c]) * Fp;

          }
          else
          {
            p [obj ].F [c] -= (p [obj2].c [c] - p [obj].c [c]) * Fp;
            p [obj2].F [c] += (p [obj2].c [c] - p [obj].c [c]) * Fp;
          }
        }
      }
    }
  }
}

最後に、各粒子の現在位置とそれに作用する力に基づいて、新しい座標を計算します。粒子は質量を持たないので、加速度は発生しません。GSA重力探索アルゴリズムとは対照的に、粒子は瞬時に新しい場所に移動します。移動座標は検索範囲と変化のステップで制限されます。

コメントアウトされたコードは、粒子が範囲外である場合に、対応する座標から距離のある反対側の粒子を返します。

//calculation of particle motions===========================================
for (int obj = 0; obj < particlesNumber; obj++)
{
  for (int c = 0; c < coordinatesNumber; c++)
  {
    r = RNDfromCI (0.0, 1.0);
    p [obj].c [c] = p [obj].c [c] + r * p [obj].F [c] * vect [c] * movConstant;

    //if (p [obj].c [c] > rangeMax [c]) p [obj].c [c] = rangeMin [c] + (p [obj].c [c] - rangeMax [c]);
    //if (p [obj].c [c] < rangeMin [c]) p [obj].c [c] = rangeMax [c] - (rangeMin [c] - p [obj].c [c]);

    p [obj].c [c] = SeInDiSp (p [obj].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
  }
}

Revision()メソッドは、EM最適化アルゴリズムにおいて、各反復で実行しなければならない2番目のメソッドで、現在の反復における粒子の最適位置を確認する役割を担っています。メソッド内部では、すべての粒子をループし、その適応度関数の値を現在のベスト値であるfBと比較します。現在の粒子の適応度関数の値がfBより大きい場合、fBが更新され、粒子の位置がcB配列にコピーされます。

このように、Revision()メソッドは、アルゴリズムの各反復における粒子の最良の位置を追跡し、cB配列に格納することができます。これにより、最適解を求めるプロセスを最適化し、アルゴリズムの効率を高めることができます。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_EM::Revision ()
{
  for (int s = 0; s < particlesNumber; s++)
  {
    if (p [s].f > fB)
    {
      fB = p [s].f;
      ArrayCopy (cB, p [s].c, 0, 0, WHOLE_ARRAY);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

EM最適化アルゴリズムのSeInDiSp()メソッドは、In変数の値を所定の範囲[InMin, InMax]内にStepで制限するために使用されます。InがInMin以下である場合、メソッドはInMinを返します。InがInMax以上である場合、メソッドはInMaxを返します。ステップがゼロの場合、メソッドは元のIn値を返します。そうでない場合、メソッドは、InMin + Step * (In - InMin) / Stepを使用して新しいIn値を計算します。ここでMathRound()は数値を最も近い整数に丸めるためのメソッドです。

このように、SeInDiSp()メソッドは、In変数の値の変化を指定した範囲内で、指定したステップで制御することができ、より効率的かつ迅速に関数を最適化するのに役立ちます。

//——————————————————————————————————————————————————————————————————————————————
// Choice in discrete space
double C_AO_EM::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));
}
//——————————————————————————————————————————————————————————————————————————————


3.テスト結果

SSGテストスタンドの結果:

2023.03.26 18:27:39.259 C_AO_EM:50;0.1;0.8
2023.03.26 18:27:39.259 =============================
2023.03.26 18:27:43.215    5 Rastrigin's; Func runs 10000 result:59.939529106561224
2023.03.26 18:27:43.215    Score:0.74268
2023.03.26 18:27:52.960    25 Rastrigin's; Func runs 10000 result:59.780143424645416
2023.03.26 18:27:52.960    Score:0.74071
2023.03.26 18:29:22.856    500 Rastrigin's; Func runs 10000 result:63.94951378068386
2023.03.26 18:29:22.856    Score:0.79237
2023.03.26 18:29:22.856 =============================
2023.03.26 18:29:28.901    5 Forest's; Func runs 10000 result:0.28698617113254693
2023.03.26 18:29:28.901    Score:0.16233
2023.03.26 18:29:38.103    25 Forest's; Func runs 10000 result:0.1571444033424823
2023.03.26 18:29:38.103    Score:0.08889
2023.03.26 18:30:53.341    500 Forest's; Func runs 10000 result:0.11734383105881332
2023.03.26 18:30:53.341    Score:0.06638
2023.03.26 18:30:53.341 =============================
2023.03.26 18:30:58.108    5 Megacity's; Func runs 10000 result:1.3599999999999999
2023.03.26 18:30:58.108    Score:0.11333
2023.03.26 18:31:08.897    25 Megacity's; Func runs 10000 result:0.776
2023.03.26 18:31:08.897    Score:0.06467
2023.03.26 18:32:23.199    500 Megacity's; Func runs 10000 result:0.34320000000000006
2023.03.26 18:32:23.199    Score:0.02860
2023.03.26 18:32:23.199 =============================
2023.03.26 18:32:23.199    All score:2.79996

テスト関数でのMEアルゴリズムのアニメーションに注目すると、検索空間フィールドのある種の「電化」を想像することができます。粒子は、テスト関数の表面の特徴に追随して高電荷のグループを形成します。残念ながら収束の質の低さは目立ちますが、映像の美しさは紛れもない事実です。

rastrigin

  Rastriginテスト関数のEM

forest

  Forestテスト関数のEM

megacity

  Megacityテスト関数のEM

それでは、EM最適化アルゴリズムのテスト結果に移りましょう。EMのパフォーマンスは、最終スコア22と平均以下でした。このアルゴリズムは、ほぼすべてのテストで悪い結果を示しました。例外は1000個のパラメータを持つRastrigin関数テストで、EMはSSGやBAといった強力なアルゴリズムよりも優れていることが判明しました。さらに、1000パラメータでの関数の絶対値は、10パラメータや50パラメータでのテストよりも高いことが判明しました。

最適化されたパラメータが増えることで、検索結果が改善されるのは、このときが初めてです。この現象は、EM検索ストラテジー自体の特殊性に関連している可能性が高いです。EMは、勾配の有無や、学習した関数定義の全領域にわたる微分可能性に敏感であることに注意する必要があります。

AO

詳細

Rastrigin

Rastrigin最終

Forest

Forest最終

Megacity(discrete)

Megacity最終

最終結果

10パラメータ(5F)

50パラメータ(25F)

1000パラメータ(500F)

10パラメータ(5F)

50パラメータ(25F)

1000パラメータ(500F)

10パラメータ(5F)

50パラメータ(25F)

1000パラメータ(500F)

SSG

苗木の播種と育成

1.00000

1.00000

0.55665

2.55665

0.72740

0.94522

1.00000

2.67262

0.76364

0.85977

1.00000

2.62340

100.000

HS

ハーモニーサーチ

0.99676

0.95282

0.48178

2.43136

1.00000

0.98931

0.44806

2.43736

1.00000

1.00000

0.41537

2.41537

92.329

ACOm

蟻コロニー最適化M

0.34611

0.17985

0.17044

0.69640

0.86888

1.00000

0.77362

2.64249

1.00000

0.88930

0.05606

1.94536

65.347

IWO

侵入雑草最適化

0.95828

0.67083

0.29807

1.92719

0.70773

0.46349

0.31773

1.48896

0.80000

0.42067

0.33289

1.55356

61.104

COAm

カッコウ最適化アルゴリズムM

0.92400

0.46794

0.26004

1.65199

0.58378

0.34034

0.16526

1.08939

0.72727

0.33025

0.17083

1.22835

47.612

FAm

ホタルアルゴリズムM

0.59825

0.33980

0.17135

1.10941

0.51073

0.42299

0.49790

1.43161

0.34545

0.28044

0.35258

0.97847

41.537

ABC

人工蜂コロニー

0.78170

0.32715

0.20822

1.31707

0.53837

0.21455

0.13344

0.88636

0.56364

0.26569

0.13926

0.96858

36.849

GSA

重力探索法

0.70167

0.45217

0.00000

1.15384

0.31660

0.36416

0.33204

1.01280

0.59395

0.35054

0.00000

0.94448

36.028

BA

コウモリアルゴリズム

0.40526

0.63761

0.84451

1.88738

0.20841

0.17477

0.25989

0.64308

0.29698

0.09963

0.17371

0.57032

35.888

BFO

細菌採餌の最適化

0.67203

0.30963

0.11813

1.09979

0.39702

0.26623

0.20652

0.86976

0.52122

0.33211

0.18932

1.04264

34.693

ゆうようびせいぶつぐん

電磁気学的アルゴリズム

0.12235

0.46278

1.00000

1.58513

0.00000

0.03498

0.34880

0.38377

0.00000

0.00000

0.10924

0.10924

22.091

MA

モンキーアルゴリズム

0.33192

0.33451

0.14644

0.81287

0.10012

0.07891

0.08932

0.26836

0.21818

0.04243

0.10720

0.36781

13.603

FSS

魚群検索

0.46812

0.25337

0.11302

0.83451

0.12840

0.05013

0.06516

0.24369

0.16971

0.04796

0.08283

0.30050

12.655

PSO

粒子群最適化

0.20449

0.08200

0.07160

0.35809

0.18895

0.10486

0.21738

0.51119

0.23636

0.05903

0.01957

0.31496

10.031

RND

ランダム

0.16826

0.09743

0.08019

0.34589

0.13496

0.04810

0.04715

0.23021

0.16971

0.03875

0.04922

0.25767

5.302

GWO

灰色オオカミオプティマイザ

0.00000

0.00000

0.02256

0.02256

0.06570

0.00000

0.00000

0.06570

0.32727

0.07378

0.02557

0.42663

1.000


まとめ

  1. EMアルゴリズムは、様々な最適化問題、特に滑らかな関数の大量データや高次元の処理に関連する問題を解くことができる効率的な最適化手法です。
  2. このアルゴリズムは、物理空間における電磁粒子の挙動のシミュレーションに基づいており、複雑な多次元関数を扱う場合でも高い精度の結果を得ることが可能です。
  3. EMアルゴリズムは勾配計算を必要としないため、汎用性が高く様々な問題に適用しやすい反面、最適化する関数に勾配があると敏感に反応します。
  4. また、特定の最適化問題に応じてアルゴリズムを変更・カスタマイズできるため、様々な関数の最適化に柔軟に対応することが可能です。
  5. EMアルゴリズムには、基本バージョンよりも改良され、特定の最適化問題に適応させることができる様々な修正版があります。
  6. EMアルゴリズムは、機械学習、人工知能、金融市場の最適化など、様々な分野で活用することができます。

EMアルゴリズムの主な利点は、結果の精度を高く保ちながら、多次元空間や大きな次元での最適化問題を解くことができることです。

このように、EMアルゴリズムは様々な関数の最適化に有効なツールであり、特に大量のデータや高次元の処理をおこなう場合に、幅広い最適化問題で使用することができます。

この評価は、特定の最適化問題を解くのに最適なアルゴリズムを選択するのに有効です。しかし、アルゴリズムの効率は、問題の大きさ、関数の種類、変数の数など、多くの要因に依存します。したがって、アルゴリズムの選択は、特定の問題を徹底的に分析した上でおこなう必要があります。


図1は、アルゴリズムのテスト結果です。

チャート

図1:アルゴリズムのテスト結果のヒストグラム

電磁波アルゴリズム(EM)の長所と短所:

長所:
1.簡単に実装できる
2.滑らかな関数で印象的なスケーラビリティを実現できる
3.外部パラメータの数が少ない

短所:
1.計算量が多い
2.離散関数での結果が悪い
3.水平方向に平らな「プラットフォーム」を持つ関数で動きがとれなくなる

各記事には、過去の記事のアルゴリズムコードを最新版に更新したアーカイブが用意されています。本記事は、著者の蓄積された経験に基づくものであり、個人的な意見を述べたものです。結論や判断は、実験に基づくものです。

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

添付されたファイル |
MQL5の圏論(第5回)等化子 MQL5の圏論(第5回)等化子
圏論は、数学の多様かつ拡大を続ける分野であり、最近になってMQL5コミュニティである程度取り上げられるようになりました。この連載では、その概念と原理のいくつかを探索して考察することで、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
MQL5の圏論(第4回):スパン、実験、合成 MQL5の圏論(第4回):スパン、実験、合成
圏論は数学の一分野であり、多様な広がりを見せていますが、MQL5コミュニティでは今のところ比較的知られていません。この連載では、その概念のいくつかを紹介して考察することで、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
MQL5を使用してローソク足パターンを検出する方法 MQL5を使用してローソク足パターンを検出する方法
MQL5によって価格のローソク足パターンを自動的に検出する方法を学ぶ新しい記事です。
自動で動くEAを作る(第12回):自動化(IV) 自動で動くEAを作る(第12回):自動化(IV)
自動化されたシステムをシンプルだと思う方はおそらく、それを作るために必要なことを十分に理解していないのでしょう。今回は、多くのエキスパートアドバイザー(EA)を死に至らしめる問題点についてお話します。この問題を解決するために、無差別に注文をトリガーすることが考えられます。