English Русский 中文 Español Deutsch Português
preview
母集団最適化アルゴリズム:ハーモニーサーチ(HS)

母集団最適化アルゴリズム:ハーモニーサーチ(HS)

MetaTrader 5 | 17 5月 2023, 09:23
215 0
Andrey Dik
Andrey Dik

内容:

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


1.はじめに

作曲は、リズム、メロディ、ハーモニーといういくつかの要素で構成されています。リズムとメロディが曲全体を形成しているのに対して、ハーモニーはそれを飾るものです。ハーモニーのない劇や歌は、絵本の色がついていない絵のようなものです。描かれてはいるが、色もなく、明るさもなく、表現力もありません。正しく選ばれたハーモニーは耳に快く響き、音に高貴さを与え、私たちはピアノやギターなどの楽器の素晴らしい音色を存分に楽しめるようになります。メロディーは歌えますが、ハーモニーは演奏するしかありません。音楽のハーモニーとは、和音の集合体であり、これがなければ、どんな歌も音楽も、本格的で充実したものになりません。

ハーモニーは、2つの音を1つずつ、または同時につなげた瞬間に現れます。もっと包容力がある対義語は「組み合わせ」でしょう。ある音が別の音とつながった後、組み合わせができ、その中で階層はすでにそれなりに並ぼうとしています。音楽学校や大学、音楽院では、和声(ハーモニー)という特別な学問があり、音楽理論にあるすべての和音を学び、実践で応用することを学び、ハーモニーの問題を解決することもあります。

即興演奏では、音楽家は楽器のピッチを調整して、心地よいハーモニー(最良の条件)を得ようとします。自然界では、周波数の異なる複数の音波が特別な関係を持つことでハーモニーが決まります。即興ハーモニーの良し悪しは、美的評価で決まります。音楽家は、美的感覚を高め、最良のハーモニーを見つけるために、練習に練習を重ねます。アドリブと最適化には似ているところがあります。

ハーモニーサーチ(HS)法は、過去10年間、数多くの複雑な問題を解決するために使用されてきた、新しいメタヒューリスティック最適化アルゴリズムです。ハーモニーサーチ(HS)アルゴリズムは、2001年にZ.W. Geemによって初めて提案されました。HS法は、即興演奏の創設理念と音楽的調和の探求にインスパイアされています。音の完全な調和の組み合わせは、多次元最適化問題の大域的極限と一致し、即興演奏の過程は極限の探索と一致します。

即興演奏では、各楽器が曲の任意の小節の音を(楽器の性能の範囲内で)再現し、その小節のオーケストラ全員の音が1つのハーモニーのベクトルを形成することになります。「良い」ハーモニーを形成する音の組み合わせは、各音楽家に記憶され、その後の曲の小節でさらに良いハーモニーを形成するために使用されることができます。

即興演奏では、原則として、利用可能な音の範囲から絶対的にランダムな音を形成する、ハーモニーの記憶から任意の音を再生する、同じ記憶から隣接するハーモニーベクトルを再生するという3つの条件のいずれかを満たす必要があります。HSアルゴリズムの主な特徴は、連続および離散の両方の最適化問題を解くために使用できるということです。

HSの特徴は、アルゴリズムの単純さと探索の効率の良さです。そのため、このアルゴリズムは研究者の大きな関心を集め、理論的にも実用的にも急速に発展しています。HSは、探索過程における探索フェーズと利用フェーズの間で高い安定性を実現するメタヒューリスティクス技術です。HSは人間の創造性に着想を得ており、与えられた問題に対して完璧な解決策を見つける方法は、音楽家が心地よいハーモニーを見つけようとするのと似ています。適応度関数の値を求める方法は、各楽器のピッチを使ってリファレンスを取得する方法と同様です。


2.アルゴリズム

HSロジックの仕事は、完璧なハーモニーを生み出す音楽家の仕事と似ています。音楽家は、完璧なハーモニーを見つけるまで、音色を色々変化させようとします。その後、見つかったハーモニーのコレクションはメモリに保存されます。最適化問題において、ハーモニーは様々な変化を遂げます。変化の結果が好ましいものであれば、メモリにハーモニーを追加し、好ましくない要素を取り除くことでメモリを更新します。これだけだと、かなりわかりにくいかもしれません。ハーモニーとは何でしょうか。音色とは何でしょうか。自分たちの言葉でアルゴリズムを理解してみましょう。

曲とは何でしょうか。もちろん、私は音楽家ではなく(これは残念なことですが)、プログラマーです。しかし、アルゴリズム検出のためには、「音符」という概念を適用すれば十分でしょう。曲は、音符(和音)で構成されています。図1は、曲を構築するための「仕組み」を模式的に示したものです。音符の選択は曲になっており、音楽のセンスがなくても音楽教育を受けていなくても容易に特定できます。当てたい方は、以下のコメント欄にご記入ください。

HSアルゴリズムの最適化は、音符が描かれた緑のバーを曲自体の青いバーを横切って移動させることにあります。緑色のバーの範囲は1オクターブで、個々の音で構成されています。プロダクト(青色のバー)は、最適化ソリューションの1つに相当します。緑色のバーの音符は、問題の最適化パラメータに対応するものです。音楽家の記憶(メモリ)には、曲のいくつかのバージョン(青いバーのいくつかのバリエーション)が保存されています。これがアルゴリズム母集団です。



HSachord

図1:曲の音符の選択(ハーモニーの探索)。青色のバーが曲、緑色のバーが音符のセット

図1の例は、離散問題の解に相当し、パラメータが8段階あります。アルゴリズムの動作を理解しやすくするために、例を挙げています。しかし、任意のタスクでは、最適化されたパラメータの任意の段階が存在し、中間音である半音も存在する可能性があります。問題を解くための正しいパラメータは、曲中の正しい音符に対応しています。

つまり、楽器の再現可能な周波数の範囲にある楽器の音をランダムに並べるところから、作曲の過程が始まるのです。バリエーション音符の個々のセクションを組み合わせることができるようにするには、曲のいくつかのバリエーションを作成する必要があります。次のステップは、これらのバリエーションの音符を変えることです。そのためには、3つの方法が考えられます。

1.曲中の音符のうち、楽器の音域にある1つの音をランダムに変更する
2.他のバージョンの曲から、対応するシリアル番号の音符を取る
3.別のバージョンから音符を取ってきて、調を高くしたり低くしたりと少し変える

こうして得られた新しい曲のバリアントのセットを、音の調和の観点から評価し、新しいバリアントが前のバリエーションよりも優れている場合に、バリエーションをメモリ内の元の位置に格納します。このアルゴリズムの特徴は、母集団(この場合、プロダクトの集合)を並び替える必要がないことです。それぞれの新しい最良の選択肢は、同じ場所にある古い最悪の選択肢を置き換えます。この過程は、適性な個体が生き残るという進化を模した遺伝的アルゴリズムの働きと少し似ています。また、染色体内の遺伝子の組み合わせでも類似性が見られます。

以上のことから、HSアルゴリズムの擬似コードを予備的に構成することができます。

1.ランダムなハーモニーを生成する
2.ハーモニーの質を測定する(適応度関数を算出する)
3.Ehの確率でランダムに選ばれたハーモニーのコード選択を使用する
  3.1 Epの確率でいくつかのハーモニーからコードが選択された場合、式に従ってコードを変更する
    3.1.1 選択したコードをそのままにする
  3.2 式に従った新しいコード
4.ハーモニーの質を測定する(適応度関数を算出する)
5. 停止条件が満たされるまで、3から繰り返す

次に、アルゴリズムの入力パラメータの説明に移りますが、数は少なく、直感的に理解できるものです。

input int Population_P = 50; //母集団の大きさ
input double Eh_P = 0.9; //ランダム選択頻度
input double Ep_P = 0.1; //ステップバイステップの調整頻度
input double Range_P = 0.2; //範囲

  • Population_P:音楽家の記憶(メモリ)の中にある曲のバリエーションの数(母集団の大きさ)
  • Eh_P:曲の変形を記憶(メモリ)から選択する頻度が、音を借りるために他のバリエーションを参照する頻度に影響します。値が大きいほど、アルゴリズムの組み合せ特性が高いことを意味します
  • Ep_P:音符が曲の別のバージョンから選択されたものである場合、音符を高くしたり低くしたりと、わずかに変更する必要がある頻度
  • Range_P:他のバージョンから選択されていない場合、曲の編集されたバージョンの音符の音域(例:0.2は楽器の音域の20%)

HSアルゴリズムは、S_Harmony構造体で記述されるハーモニー(曲)を操作します。ハーモニーは音符(和音)で構成されており、最適化したいパラメータをc[]で表現した配列です。曲の最良のコードはcB []配列に格納されます。成功した作曲が送られるのはこの配列で、この作曲(ハーモニー)から音を借りて組み合わせ順列をおこなうのです。ハーモニーの質はh変数に格納され、最良のハーモニーはhB変数に格納されます。

//——————————————————————————————————————————————————————————————————————————————
struct S_Harmony //musical composition
{
  double c  []; //chords
  double cB []; //best chords
  double h;     //harmony quality
  double hB;    //best harmony quality
};
//——————————————————————————————————————————————————————————————————————————————

ハーモニー構造体の配列は、C_AO_HSクラスで使用されます。このアルゴリズムは極めて簡潔で計算量が少ないため、メソッドやメンバークラスの宣言はコンパクトにまとめられています。ここでは、他の多くの最適化アルゴリズムで使用されている並び替えを見ることはありません。最適化されるパラメータの最大値、最小値、ステップを設定する配列(これらは和音の範囲とステップの役割を果たす)と、アルゴリズムの外部パラメータをそれらに転送する定数変数が必要です。それでは、HSの主要なロジックを含むメソッドの解説に移ります。

//——————————————————————————————————————————————————————————————————————————————
class C_AO_HS
{
  //----------------------------------------------------------------------------
  public: S_Harmony h      []; //harmonies matrix
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search
  public: double cB        []; //best chords
  public: double hB;           //best harmony quality

  public: void Init (const int    chordsNumberP,      //chords number
                     const int    harmoniesNumberP,   //harmonies number
                     const double EhP,                //random selection frequency
                     const double EpP,                //frequency of step-by-step adjustment
                     const double rangeP,             //range
                     const int    maxIterationsP);    //max Iterations

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

  //----------------------------------------------------------------------------
  private: int    chordsNumber;      //chords number
  private: int    harmoniesNumber;   //harmonies number
  private: double Eh;                //random selection frequency
  private: double Ep;                //frequency of step-by-step adjustment
  private: double range;             //range
  private: int    maxIterations;
  private: double frequency [];      //frequency range
  private: bool   revision;

  private: double SeInDiSp  (double In, double InMin, double InMax, double Step);
  private: double RNDfromCI (double min, double max);
  private: double Scale     (double In, double InMIN, double InMAX, double OutMIN, double OutMAX,  bool revers);
};
//——————————————————————————————————————————————————————————————————————————————

Init() publicメソッドは、アルゴリズムを初期化します。ここでは、配列の大きさを設定します。見つかった最良のハーモニーの品質指標を、可能な限り最小のdouble値で初期化します。ハーモニー構造体の配列の対応する変数についても同様とします。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_HS::Init (const int    chordsNumberP,      //chords number
                    const int    harmoniesNumberP,   //harmonies number
                    const double EhP,                //random selection frequency
                    const double EpP,                //frequency of step-by-step adjustment
                    const double rangeP,             //range
                    const int    maxIterationsP)     //max Iterations
{
  MathSrand ((int)GetMicrosecondCount ()); // reset of the generator
  hB       = -DBL_MAX;
  revision = false;

  chordsNumber    = chordsNumberP;
  harmoniesNumber = harmoniesNumberP;
  Eh              = EhP;
  Ep              = EpP;
  range           = rangeP;
  maxIterations   = maxIterationsP;

  ArrayResize (rangeMax,  chordsNumber);
  ArrayResize (rangeMin,  chordsNumber);
  ArrayResize (rangeStep, chordsNumber);
  ArrayResize (frequency, chordsNumber);

  ArrayResize (h, harmoniesNumberP);

  for (int i = 0; i < harmoniesNumberP; i++)
  {
    ArrayResize (h [i].c,  chordsNumber);
    ArrayResize (h [i].cB, chordsNumber);
    h [i].h  = -DBL_MAX;
    h [i].hB = -DBL_MAX;
  }

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

最初のpublicメソッドMoving()は、各反復で実行する必要があり、入力はiter(現在の反復)です。最初の繰り返しで、revisionフラグがfalseのとき、ハーモニーを楽器の範囲のランダムな値で初期化する必要があり、これは音楽家がランダムにコードを演奏するのと同じです。繰り返し操作を減らすために、対応する和音(最適化されたパラメータ)の音域をfrequency[]配列に格納することにしましょう。

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

  for (int har = 0; har < harmoniesNumber; har++)
  {
    for (int c = 0; c < chordsNumber; c++)
    {
      h [har].c [c] = RNDfromCI (rangeMin [c], rangeMax [c]);
      h [har].c [c] = SeInDiSp  (h [har].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
      h [har].h     = -DBL_MAX;
      h [har].hB    = -DBL_MAX;

      frequency [c] = rangeMax [c] - rangeMin [c];
    }
  }

  revision = true;
}

2回目以降の繰り返しでは、即興演奏がおこなわれ、コードやその組み合わせが順次変更されます。いくつかのハーモニーが記憶にあり、それを変化させたり組み合わせたりします。新しいハーモニーを作るごとに、コードを順次整理していきます。各コードに対して、ハーモニーの記憶からランダムに選ばれる確率があります。つまり、ハーモニーはランダムに選ばれます(すべてのハーモニーに対して等価に)。ハーモニーの記憶からコードを取り出した場合、その変化の確率も式で確認することができます。

h [har].c [c] = h [har].c [c] + r * B * frequency [c];

ここで

r:-1 から 1 の間の乱数
frequency:測定器の周波数範囲
B:式により算出される係数

B = ((maxIterations - iter) / (double)maxIterations) * (maxB - minB) + minB;

ここで

maxIterations:反復回数の最大値
iter:現在のイテレーション
maxB:係数の最大値
minB:係数の下限値

図2は、アルゴリズムのチューニングパラメータと現在の反復に対する係数Bの依存性を示しています。

FSb

図2:maxB, minBアルゴリズムチューニングパラメータと現在の繰り返しに対する係数Bの依存性

係数Bの計算式では、反復するごとに係数Bが減少していくことがわかります。このように、見つかった極限は、最適化が終了するまでに洗練されます。
ハーモニーメモリーからコードが選択されていない場合は、その時点ですでに存在するコードが変更されます。コード変更の前の変更との差は、音波の値の固定範囲になります。


コードを変える作業が終わったら、出来上がったコードが楽器の許容値を超えていないことを確認してみましょう。

//----------------------------------------------------------------------------
else
{
  double r         = 0.0;
  int    harAdress = 0;
  double minB      = 0.0;
  double maxB      = 0.3;
  double B = ((maxIterations - iter) / (double)maxIterations) * (maxB - minB) + minB;

  for (int har = 0; har < harmoniesNumber; har++)
  {
    for (int c = 0; c < chordsNumber; c++)
    {
      r = RNDfromCI (0.0, 1.0);

      if (r <= Eh)
      {
        r = RNDfromCI (0.0, harmoniesNumber - 1);
        harAdress = (int)MathRound (r);
        if (harAdress < 0) harAdress = 0;
        if (harAdress > harmoniesNumber - 1) harAdress = harmoniesNumber - 1;

        h [har].c [c] = h [harAdress].cB [c];

        r = RNDfromCI (0.0, 1.0);

        if (r < Ep)
        {
          r = RNDfromCI (-1.0, 1.0);
          h [har].c [c] = h [har].c [c] + r * B * frequency [c];
        }
      }
      else
      {
        r = RNDfromCI (-1.0, 1.0);
        h [har].c [c] = h [har].cB [c] + r * range * frequency [c];
      }

      h [har].c [c] = SeInDiSp (h [har].c [c], rangeMin [c], rangeMax [c], rangeStep [c]);
    }
  }
}

Revision()は、適応度関数が計算された後、各反復で呼び出される2番目のpublicメソッドです。その目的は、見つかったグローバルな解を更新することです。ハーモニーがその最良バージョンh>hBよりも優れている場合は、このハーモニーの最良バージョンを更新します。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_HS::Revision ()
{
  for (int har = 0; har < harmoniesNumber; har++)
  {
    if (h [har].h > hB)
    {
      hB = h [har].h;
      ArrayCopy (cB, h [har].c, 0, 0, WHOLE_ARRAY);
    }
    if (h [har].h > h [har].hB)
    {
      h [har].hB = h [har].h;
      ArrayCopy (h [har].cB, h [har].c, 0, 0, WHOLE_ARRAY);
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

コードを注意深く調べた結果、ハーモニーサーチアルゴリズムに根本的な新しいアイデアはないことがわかりました。ハーモニーサーチアルゴリズムは、大域的均一組換え、均一突然変異、ガウス突然変異、毎世代最悪の個体を置き換えるなど、これまで使われてきた進化的アルゴリズムのアイデアを借用しています。記憶の中の最悪のハーモニーを新しいものに置き換える必要性を示す資料もありますが、私たちのアルゴリズムでは、ハーモニーはその最良の解を置き換えることしかできません。これは古典的なバージョンとは少し違いますが、私の研究では、このアルゴリズムの実装こそが、より生産的であることが示されているからです。

ハーモニーサーチアルゴリズムの貢献は、このアルゴリズムにおけるこれらのアイデアの組み合わせが斬新であることと、ハーモニーサーチアルゴリズムの音楽的動機が斬新であることの2点にあると言えるでしょう。ハーモニーサーチに関する出版物の中で、音楽のモチーフやハーモニーサーチアルゴリズムの拡張について論じているものはほとんどありません。出版物の多くは、ハーモニーサーチアルゴリズムと他の進化的アルゴリズムとのハイブリッド化、ハーモニーサーチパラメータの調整、または特定の問題へのハーモニーサーチアルゴリズムの適用をテーマにしています。もし、HSアルゴリズムにもっと音楽的な条件の拡張を加えることができれば、別の進化的アルゴリズムとして区別することができるでしょう。このような研究には、音楽理論の研究、作曲・編曲の過程の研究、音楽の教育理論の研究、そしてこれらの理論をハーモニーサーチアルゴリズムに独創的に適用することが必要です。


3.テスト結果

HSテストスタンドの結果は以下のようになります。

2023.02.08 17:30:05.710    Test_AO_HS (EURUSD,M1)    C_AO_HS:50;0.9;0.1;0.2
2023.02.08 17:30:05.711    Test_AO_HS (EURUSD,M1)    =============================
2023.02.08 17:30:07.919    Test_AO_HS (EURUSD,M1)    5 Rastrigin's; Func runs 10000 result:80.62868417575105
2023.02.08 17:30:07.919    Test_AO_HS (EURUSD,M1)    Score:0.99903
2023.02.08 17:30:11.563    Test_AO_HS (EURUSD,M1)    25 Rastrigin's; Func runs 10000 result:75.85009280972398
2023.02.08 17:30:11.563    Test_AO_HS (EURUSD,M1)    Score:0.93983
2023.02.08 17:30:45.823    Test_AO_HS (EURUSD,M1)    500 Rastrigin's; Func runs 10000 result:50.26867628386793
2023.02.08 17:30:45.823    Test_AO_HS (EURUSD,M1)    Score:0.62286
2023.02.08 17:30:45.823    Test_AO_HS (EURUSD,M1)    =============================
2023.02.08 17:30:47.878    Test_AO_HS (EURUSD,M1)    5 Forest's; Func runs 10000 result:1.7224980742302596
2023.02.08 17:30:47.878    Test_AO_HS (EURUSD,M1)    Score:0.97433
2023.02.08 17:30:51.546    Test_AO_HS (EURUSD,M1)    25 Forest's; Func runs 10000 result:1.0610723369605124
2023.02.08 17:30:51.546    Test_AO_HS (EURUSD,M1)    Score:0.60020
2023.02.08 17:31:31.229    Test_AO_HS (EURUSD,M1)    500 Forest's; Func runs 10000 result:0.13820341163584177
2023.02.08 17:31:31.229    Test_AO_HS (EURUSD,M1)    Score:0.07817
2023.02.08 17:31:31.229    Test_AO_HS (EURUSD,M1)    =============================
2023.02.08 17:31:34.315 Test_AO_HS (EURUSD,M1) 5 Megacity's; Func runs 10000 result:7.959999999999999
2023.02.08 17:31:34.315    Test_AO_HS (EURUSD,M1)    Score:0.66333
2023.02.08 17:31:42.862 Test_AO_HS (EURUSD,M1) 25 Megacity's; Func runs 10000 result:5.112
2023.02.08 17:31:42.862    Test_AO_HS (EURUSD,M1)    Score:0.42600
2023.02.08 17:32:25.172    Test_AO_HS (EURUSD,M1)    500 Megacity's; Func runs 10000 result:0.6492
2023.02.08 17:32:25.172    Test_AO_HS (EURUSD,M1)    Score:0.05410

テスト関数の数値の高さには目を見張るものがあり、テスト全体のスコアの結果も抜群に良くなるのではと期待させます。視覚化におけるHSの特徴は、これまでのいくつかのアルゴリズムのように、座標のグループのような構造的な形成が見られないことです。視覚的には、探索空間におけるエージェントの動きにパターンがありません。これは、RND最適化アルゴリズムの挙動と似ていますが、収束グラフは非常に自信に満ちた挙動を示し、最適化問題の解に徐々に近づいていくことがわかります。極値から抜け出せなくなることは、このアルゴリズムでは典型的なことではありません。

rastrigin

  Rastriginテスト関数のHS

forest

  Forestテスト関数のHA

megacity

  Megacityテスト関数のHA

表の結果を分析し、記事タイトルに設定された質問に答える時です。以前の記事で、離散関数で評価表のリーダーを迂回するようなアルゴリズムが見えてくるのか、疑問を呈しました。見た目はランダムなアルゴリズムですが、離散関数(3つのテストで最高)だけでなく、他のテスト関数でもリーダーとなることができ、最終的には9つのテストのうち6つで最高となりました。

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)

HS

ハーモニーサーチ

1.00000

1.00000

0.57048

2.57048

1.00000

0.98931

0.57917

2.56848

1.00000

1.00000

1.00000

3.00000

100.00000

ACOm

蟻コロニー最適化M

0.34724

0.18876

0.20182

0.73782

0.85966

1.00000

1.00000

2.85966

1.00000

0.88484

0.13497

2.01981

68.094

IWO

侵入雑草最適化

0.96140

0.70405

0.35295

2.01840

0.68718

0.46349

0.41071

1.56138

0.75912

0.39732

0.80145

1.95789

67.087

COAm

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

0.92701

0.49111

0.30792

1.72604

0.55451

0.34034

0.21362

1.10847

0.67153

0.30326

0.41127

1.38606

50.422

FAm

ホタルアルゴリズムM

0.60020

0.35662

0.20290

1.15972

0.47632

0.42299

0.64360

1.54291

0.21167

0.25143

0.84884

1.31194

47.816

BA

コウモリアルゴリズム

0.40658

0.66918

1.00000

2.07576

0.15275

0.17477

0.33595

0.66347

0.15329

0.06334

0.41821

0.63484

39.711

ABC

人工蜂コロニー

0.78424

0.34335

0.24656

1.37415

0.50591

0.21455

0.17249

0.89295

0.47444

0.23609

0.33526

1.04579

38.937

BFO

細菌採餌の最適化

0.67422

0.32496

0.13988

1.13906

0.35462

0.26623

0.26695

0.88780

0.42336

0.30519

0.45578

1.18433

37.651

GSA

重力探索法

0.70396

0.47456

0.00000

1.17852

0.26854

0.36416

0.42921

1.06191

0.51095

0.32436

0.00000

0.83531

35.937

FSS

魚群検索

0.46965

0.26591

0.13383

0.86939

0.06711

0.05013

0.08423

0.20147

0.00000

0.00959

0.19942

0.20901

13.215

PSO

粒子群最適化

0.20515

0.08606

0.08448

0.37569

0.13192

0.10486

0.28099

0.51777

0.08028

0.21100

0.04711

0.33839

10.208

RND

ランダム

0.16881

0.10226

0.09495

0.36602

0.07413

0.04810

0.06094

0.18317

0.00000

0.00000

0.11850

0.11850

5.469

GWO

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

0.00000

0.00000

0.02672

0.02672

0.00000

0.00000

0.00000

0.00000

0.18977

0.03645

0.06156

0.28778

1.000


まとめてみましょう。本稿執筆時点では、HSアルゴリズムは、テスト結果のヒストグラムにおいて、他の最適化アルゴリズムと比較して圧倒的にリードした位置を占めています。このことは、このアルゴリズムの強さと力、そして様々な複雑さを持つ問題を解決する過程の最適化の分野における可能性を示しています。

私見ですが、非常に複雑なものを含む様々な種類のテスト関数で素晴らしい結果を示すことができる非常に重要な要因は、他の最適化アルゴリズムに存在するいくつかの手法(テクニック)を継承していることだと思います。HSは解のプールソートを持たず、各解はその局所的な決定だけを更新します。これはカッコウ探索最適化アルゴリズムの典型で、決定枝の展開のための新しい経路は、卵が巣の中のものより優れている場合にのみ発生します。また、HSの手法は遺伝的アルゴリズムで用いられる手法、つまり解の要素の組み合わせ論に近いものがあります。

非常に高い性能を持つ強力なHS最適化アルゴリズムは、滑らかなスケーリング関数や複雑な離散組合せ問題など、多変数の様々な複雑な問題の解決に安心してお勧めできます。HSアルゴリズムは、すでに工学(構造物のトポロジーや部品の最適形状の最適化)、エレクトロニクス、ロジスティクスなどの多くの分野で応用され、成功を収めています。

HSアルゴリズムの実装が簡単なため、、研究の余地があり、さまざまな最適化戦略を追加および組み合わせることができます。このことは、アルゴリズムの能力が十分に発揮されていないことを示唆しています。

アルゴリズムテスト結果のヒストグラムは以下の通りです。

チャート

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


HS(ハーモニックサーチ)アルゴリズムの長所と短所は次の通りです。

長所:
1.簡単に実装できる
2.あらゆる種類の関数において、例外なく優れた収束性を発揮する
3.圧倒的なスケーラビリティ
4.とても速い
5.外部パラメータの数が少ない

短所:
なし

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

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

添付されたファイル |
MQL5行列を使用した誤差逆伝播法によるニューラルネットワーク MQL5行列を使用した誤差逆伝播法によるニューラルネットワーク
この記事では、行列を使用してMQL5で誤差逆伝播法(バックプロパゲーション)アルゴリズムを適用する理論と実践について説明します。スクリプト、インジケータ、エキスパートアドバイザー(EA)の例とともに、既製のクラスが提示されます。
MQL5でONNXモデルをアンサンブルする方法の例 MQL5でONNXモデルをアンサンブルする方法の例
ONNX (Open Neural Network eXchange)は、ニューラルネットワークを表現するために構築されたオープンフォーマットです。この記事では、1つのエキスパートアドバイザー(EA)で2つのONNXモデルを同時に使用する方法を示します。
MQL5の圏論(第3回) MQL5の圏論(第3回)
圏論は数学の一分野であり、多様な広がりを見せていますが、MQL5コミュニティでは今のところ比較的知られていません。この連載では、その概念のいくつかを紹介して考察することで、トレーダーの戦略開発におけるこの注目すべき分野の利用を促進することを目的としたオープンなライブラリを確立することを目指しています。
MQL5でONNXモデルを使用する方法 MQL5でONNXモデルを使用する方法
ONNX (Open Neural Network Exchange)は、機械学習モデルを表現するために構築されたオープンフォーマットです。この記事では、CNN-LSTMモデルを作成して金融時系列を予測する方法を検討します。MQL5エキスパートアドバイザー(EA)で作成されたONNXモデルを使用する方法も示します。