決定論的振動型探索(DOS)
内容
はじめに
最適化アルゴリズムは、従来手法の根本的な限界を克服するために進化を続けています。ほとんどのメタヒューリスティック最適化アルゴリズムは、確率的プロセスや乱数に大きく依存しています。これらの手法は局所最適を回避する優れた能力を示しますが、その非決定論的な性質は、結果の厳密な再現性が求められる分野では問題となる可能性があります。
本記事では、決定論的振動型探索(DOS, Deterministic Oscillatory Search)という新しいメタヒューリスティックアルゴリズムを紹介します。このアルゴリズムは、従来の勾配ベース手法の利点と群知能アルゴリズムの効率性を組み合わせながら、乱数の使用を完全に排除しています。
DOSは、2017年にArchanaによって複雑な大域最適化問題を解決するために設計されました。このアルゴリズムは、探索空間における粒子の振動運動と、初期位置の決定論的分布という概念に基づいています。DOSの重要な特徴は、多次元問題を扱いながら完全な再現性を維持できる点にあります。つまり、同じ初期条件を与えれば、アルゴリズムは常に同じ結果へ到達します。
ほとんどのメタヒューリスティックアルゴリズムとは異なり、DOSでは「適応度の傾き(fitness slope)」という概念が導入されています。これは、粒子が現在の移動方向によって解が改善しているかどうかを評価し、その情報をもとに探索戦略を適応的に変更する仕組みです。粒子は正(現在の移動によって解が改善している)、負(現在の移動によって解が悪化している)、不明の3つの勾配状態のいずれかを取ります。
この情報は、粒子の振動的な挙動を制御するために使用されます。従来の勾配法では、すべての方向への移動が目的関数の悪化につながる点に到達すると探索が停止します。しかしDOSでは、振動運動によって改善が得られなくなった場合に作動する群知能メカニズムによって、この制限を克服します。この場合、粒子は既知の大域最良解の方向へ移動を開始します。
本記事では、DOSアルゴリズムの数学的基礎を詳しく解説し、その特性や実装上の特徴を分析するとともに、複数のテスト問題を通してアルゴリズムの有効性を示します。
アルゴリズムの実装
それでは、DOSアルゴリズムがどのように動作するのかを見ていきます。DOSはランダムウォークの代わりに、いくつかの単純なルールから構成される体系的なアプローチを採用しています。DOSは乱数に依存しません。アルゴリズムはまず、複数の「探索者(粒子)」を探索空間内の異なる位置へ配置することから開始します。この配置はランダムではなく、領域全体を均一にカバーするよう設計された特定の方程式によって決定されます。各粒子は、初期方向と移動速度を持っています。粒子が前進するにつれて、地形が高くなっているか(より良い状態)、あるいは低くなっているか(より悪い状態)を記憶します。これが「勾配状態(slope)」です。これは、自分が正しい方向へ進んでいるかどうかを追跡するための単純な方法です。
ここからアルゴリズムの興味深い部分が始まります。粒子が上昇を続けていた状態から下降へ転じたこと、つまり適応度悪化を検出した場合、単純に停止したり元へ戻ったりはしません。その代わりに、「反射」をおこないます。つまり、進行方向を反転し、以前の半分の速度で逆方向への移動を続けます。これは、壁に当たって跳ね返るテニスボールのようなものですが、反発のたびにエネルギーが減少していく点が異なります。
この反射によって振動運動が生み出されます。これがアルゴリズム名の由来です。反発を繰り返すたびに、粒子は極値の位置をより正確に絞り込んでいきます。しかし、粒子が閉じ込められてしまった場合はどうなるでしょうか。たとえば、小さな丘の上にいて、その周囲のすべてが下降方向であり、しかもその極値が領域内で最も高い点ではない場合です。ここでDOSは別の戦略へ切り替わります。粒子がさまざまな方向への移動を試みても、すべての方向で適応度が悪化する場合、粒子は別のモード、すなわち「群知能(swarming)」モードへ切り替わります。このモードでは、それまでに全粒子が発見した最良点の方向へ移動を開始します。
ランダム探索や試行錯誤型の探索とは異なり、DOSは改善方向に関する情報と、すべての粒子の集合的経験を利用して、解空間を体系的に探索します。同時に、複雑な導関数計算や大規模な探索履歴の保存を必要としません。このようにDOSは、移動、反射、群知能という単純なルールを段階的に適用することで、複雑な問題に対する最適解を見つけ出します。
以下の図は、等高線で表現された大域最適解および複数の局所最適解を持つ2次元探索空間と、DOSアルゴリズム特有の挙動を示しながら開始点から大域最適解へ至る経路など、アルゴリズムの主要な側面を示しています。
- 粒子の決定論的初期位置
- 探索時の振動的(ジグザグ)移動
- 大域最適解への適応的移動
アルゴリズムの主要構成要素は、決定論的粒子初期化、「適応度の傾き」概念の利用、振動運動、そして群知能メカニズム(既知の最良解への移動)です。
勾配状態は以下のいずれかになります。
- 正(+1):現在の移動によって適応度が改善している
- 負(-1):現在の移動によって適応度が悪化している
- 不明(0):初期化時、または戦略変更後の状態
図1:アルゴリズムの動作
この図は、DOSが古典的勾配法の特徴(振動による局所探索)と群知能アルゴリズムの能力を組み合わせながら、完全に決定論的な動作を維持していることを明確に示しています。動作原理を確認したところで、次はアルゴリズムの擬似コードを作成していきます。
ステップ1:初期準備
- 各粒子の位置、速度、以前の適応度値、および勾配状態を保存する配列を作成する
- 発見済みの最良解を、最小可能適応度値で初期化する
ステップ2:決定論的粒子初期化
- 各粒子について:
- 領域全体を均一にカバーする決定論的方程式を用いて探索空間内へ配置する
- 初期速度をゼロに設定する
- 初期勾配を「不明」(0)に設定する
- 前回適応度値を最小可能値に設定する
ステップ3:メイン最適化ループ
- 最大反復回数に到達するまで繰り返す。パート1:粒子の移動
- 各粒子について:
- 現在の適応度値を前回の適応度として保存する
- 現在の速度を加算して位置を更新する
- 新しい位置が探索境界外にある場合、許可された範囲内へ制限する
- 各粒子について:
- 新しい適応度値を計算する
- 適応度が現在の最良解より優れている場合、最良解を更新する
- 勾配状態が「不明」(0)の場合:
- 新しい適応度が前回より良い場合、勾配状態を「正(1)」に設定する
- 新しい適応度が前回より悪い場合、勾配状態を「負(-1)」に設定する
- 適応度が変化しない場合、勾配状態を「不明」のまま維持する
- 勾配状態が「正(1)」の場合:
- 新しい適応度が前回より悪化した場合:
- 移動方向を逆方向へ変更する
- 速度を半分に減少させる
- 勾配状態を「負(-1)」に設定する
- 新しい適応度が前回より悪化した場合:
- 勾配状態が「負(-1)」の場合:
- 新しい適応度が前回より悪化した場合:
- 群知能メカニズムを適用する:現在の速度に対して、最良解方向ベクトルへ移動係数を掛けたものを加算する
- 勾配状態を「不明(0)」に設定する
- 新しい適応度が前回より悪化した場合:
- 速度がゼロ、またはほぼゼロであるかを確認する:
- 速度が実質的にゼロの場合:
- 発見済み最良解方向へ向かう速度を、移動係数を掛けて設定する
- 勾配状態を「不明(0)」に設定する
- 速度が実質的にゼロの場合:
- 各粒子について:
ステップ4:終了
- 発見された最良解と、その適応度値を返す
ここからDOSアルゴリズムのコード実装を開始できます。まず、最適化中の粒子状態を保存するための構造体を作成します。この構造体には、速度勾配状態(正、負、不明)を定義するフィールドと、各次元ごとの速度成分配列が含まれます。これにより、粒子運動パラメータを効率よく保存および処理することができます。
構造体を初期化するために、勾配状態をデフォルト値へ設定し、指定サイズの速度配列を生成してゼロで埋めるメソッドを用意します。これにより、処理開始前に正しい初期状態が保証されます。
さらに、ゼロ速度チェックも実装されています。このメソッドは、指定された精度を考慮してすべての速度成分を確認し、それらがすべて実質的にゼロである場合はtrueを返し、それ以外の場合はfalseを返します。これにより、粒子が安定状態へ到達したのか、それとも移動を継続する必要があるのかを判断できます。
// Structure for storing particle velocity struct S_DOS_Velocity { int slope; // Particle slope (-1: negative, 0: unknown, 1: positive) double v []; // Velocity components for each dimension void Init (int dims) { slope = 0; ArrayResize (v, dims); ArrayInitialize (v, 0.0); // Quick initialization of the entire array to zeros } // Check for zero velocity bool IsZero (double epsilon = 1e-10) { for (int i = 0; i < ArraySize (v); i++) if (MathAbs (v [i]) > epsilon) return false; return true; } }; //——————————————————————————————————————————————————————————————————————————————
C_AO_DOSクラスは、このアルゴリズムの実装を表します。このクラスは基底クラスC_AOの機能を継承し、DOS手法固有のロジックを追加します。クラスの主な特徴として、コンストラクタではデフォルトパラメータを初期化します。これには、集団サイズや最良解への移動係数などが含まれ、同時にパラメータ配列も生成されます。SetParams()メソッドは、popSizeやmovementFactorなどのパラメータを、指定された制約条件に従って設定および検証する機能を提供します。Init()メソッドは初期条件の準備を担当します。具体的には、探索範囲、変化ステップ、および反復回数を初期化します。
粒子移動ロジックに関するメソッド- Moving()は、現在の速度および評価値に基づき、探索空間内で粒子を移動させる基本メカニズムを実装します。
- Revision ()は、各ステップ後に位置または速度を調整するために使用されます。
クラス内部では、S_DOS_Velocity構造体が定義されています。この構造体は、各粒子について全次元の速度成分を保持し、初期化およびゼロ速度判定のためのメソッドを含みます。
内部メソッド- InitializeParticles()とProcessParticleMovement()は、粒子位置の初期化および更新をおこなう補助関数です。これらはアルゴリズムの主要ロジックを提供します。
全体として、このクラスはDOS手法に対する構造化されたアプローチを実装しています。各数値および変数は、粒子の位置、速度、探索方向を利用して解空間の探索を導くことを目的としています。
//—————————————————————————————————————————————————————————————————————————————— class C_AO_DOS : public C_AO { public: //-------------------------------------------------------------------- ~C_AO_DOS () { } C_AO_DOS () { ao_name = "DOS"; ao_desc = "Deterministic Oscillatory Search"; ao_link = "https://www.mql5.com/ja/articles/18154"; // Set default parameters popSize = 30; // population size movementFactor = 0.95; // movement factor towards the best solution // Create and initialize the parameters array ArrayResize (params, 2); params [0].name = "Population Size"; params [0].val = popSize; params [1].name = "Movement Factor"; params [1].val = movementFactor; } void SetParams () { // Set parameter values with validation popSize = (int)MathMax (5, params [0].val); // Minimum 5 particles for efficiency movementFactor = MathMax (0.1, MathMin (1.0, params [1].val)); // Limit from 0.1 to 1.0 } bool Init (const double &rangeMinP [], // minimum values const double &rangeMaxP [], // maximum values const double &rangeStepP [], // step change const int epochsP = 0); void Moving (); void Revision (); //---------------------------------------------------------------------------- double movementFactor; // movement factor towards the best solution S_DOS_Velocity velocities []; // Array of particle velocity structures private: //------------------------------------------------------------------- void InitializeParticles (); void ProcessParticleMovement (int particleIndex); }; //——————————————————————————————————————————————————————————————————————————————
Initメソッドは、アルゴリズムの実行準備を担当します。まず、基底クラスの初期化メソッドが呼び出され、動作に必要な初期探索範囲およびステップが設定されます。基本初期化が正常に完了した後、粒子速度情報を保存するための配列用メモリが確保されます。
集団内の各要素について、粒子運動の初期ダイナミクスを決定するために、全次元の速度配列が初期化されます。最後に、粒子を決定論的な方法で初期配置するメソッドが呼び出され、探索空間内における初期位置が設定されます。
このメソッドの結果として、一定の初期条件を持つ粒子集団が準備され、反復的な探索プロセスを開始できる状態になります。
//—————————————————————————————————————————————————————————————————————————————— bool C_AO_DOS::Init (const double &rangeMinP [], // minimum values const double &rangeMaxP [], // maximum values const double &rangeStepP [], // step change const int epochsP = 0) // number of epochs { // Standard C_AO initialization if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false; //---------------------------------------------------------------------------- // Allocating memory for arrays ArrayResize (velocities, popSize); // Initialize the velocities for each dimension for (int i = 0; i < popSize; i++) velocities [i].Init (coords); // Initialize particle positions deterministically InitializeParticles (); return true; } //——————————————————————————————————————————————————————————————————————————————
Moving()メソッドは、DOSアルゴリズムにおける探索空間内での粒子移動を実装するものであり、集団内の各粒子を先頭から順番に処理します。各粒子について、現在の適応度関数値fが保存されます。これは後続の比較処理をおこない、粒子位置が改善したのか、それとも悪化したのかを判定するために必要です。
粒子の各座標(次元)について、現在の座標に対応する速度成分を加算することで新しい値が計算されます。新しい座標値は、粒子が許可された探索領域を超えないよう、stepを考慮しながらrangeMin[d]およびrangeMax[d]の範囲内へ制限されます。
その結果、Moving()メソッドは探索空間内における粒子位置を更新しつつ、以前の状態に関する情報を保持し、さらに制約条件および離散化を考慮しながら、新しい座標値の妥当性を保証します。
//+----------------------------------------------------------------------------+ //| Basic method of particle movement | //+----------------------------------------------------------------------------+ void C_AO_DOS::Moving () { // Handle all particles for (int i = 0; i < popSize; i++) { // Save the fitness value a [i].fP = a [i].f; // Calculate new coordinates based on velocity for (int d = 0; d < coords; d++) { // Update position a [i].c [d] += velocities [i].v [d]; // Round to the nearest acceptable step a [i].c [d] = u.SeInDiSp (a [i].c [d], rangeMin [d], rangeMax [d], rangeStep [d]); } } } //——————————————————————————————————————————————————————————————————————————————
Revision()メソッドは、最良解に関する情報の更新と、探索中における粒子移動の処理を担当します。このメソッドは、集団内のすべての粒子を順番に処理します。各粒子について、現在の解が大域最良適応度値fBを改善するかどうかを確認します。改善している場合は、大域最良スコアが更新され、対応する座標も保存されます。さらに各粒子について、適応度関数の変化に基づいて位置を再計算および調整する専用メソッドが呼び出されます。
このメソッドの実行結果として、最良解情報が更新されるとともに、最新の更新内容を考慮しながら粒子が移動を継続できるよう、システムが次の探索ステージに向けて準備されます。
//+----------------------------------------------------------------------------+ //| Fitness function update method | //+----------------------------------------------------------------------------+ void C_AO_DOS::Revision () { // Handle each particle for (int i = 0; i < popSize; i++) { // Update the best solution if the current solution is better if (a [i].f > fB) { fB = a [i].f; ArrayCopy (cB, a [i].c, 0, 0, WHOLE_ARRAY); } // Handle particle motion based on fitness change ProcessParticleMovement (i); } } //——————————————————————————————————————————————————————————————————————————————
ProcessParticleMovement()メソッドは、適応度関数の変化および現在の移動方向に基づいて、探索空間内における個々の粒子の移動を調整する役割を担います。インデックスが無効な場合、メソッドは処理を終了します。アクセスを高速化するために、現在の粒子の適応度、前回の適応度値、および現在の勾配状態が保存されます。アルゴリズムは、現在と前回の適応度差、および現在の勾配状態に基づいて、粒子がどの方向へ移動すべきかを決定します。
- 勾配状態が不明の場合、適応度の変化に基づいて、その方向(正、負、不明)が決定されます。
- 勾配状態が正であったにもかかわらず適応度が悪化した場合、勾配状態は負に切り替わり、すべての軸方向における速度が半分に減少します。これにより、移動方向の変更が促進されます。
- 勾配状態が負の状態でさらに適応度が悪化した場合、「群知能」が発生します。このとき粒子は大域最適解方向へ移動し、各軸方向の速度は最良解へ向かう方向へ増加します。
すべての方向において速度がゼロである場合には、大域最適解への移動が開始されます。これは、現在座標と大域最良解座標との差分に基づき、移動係数を考慮して速度を設定することで実現されます。このように、状況に応じて速度の方向と大きさが調整されることで、粒子は適応度の変化へ適切に反応し、最適な方向へ移動するよう「学習」します。
このメソッドの最終的な目的は、粒子の局所解および大域解の変化を考慮しながら、動的かつ適応的な粒子運動を実現し、効率的に最適解を探索できるようにすることです。
//+----------------------------------------------------------------------------+ //| Handle particle motion after fitness update | //+----------------------------------------------------------------------------+ void C_AO_DOS::ProcessParticleMovement (int particleIndex) { // Local variables for access optimization double currentFitness = a [particleIndex].f; double previousFitness = a [particleIndex].fP; int currentSlope = velocities [particleIndex].slope; // Comparison of fitnesses to determine the movement direction double fitnessDiff = currentFitness - previousFitness; // Handle a slope according to the current state if (currentSlope == 0) // Unknown slope { // Determine the slope based on the change in fitness velocities [particleIndex].slope = (fitnessDiff > 0) ? 1 : (fitnessDiff < 0) ? -1 : 0; } else if (currentSlope == 1 && fitnessDiff < 0) // Positive slope and deterioration of fitness { // Change direction and decrease velocity for (int d = 0; d < coords; d++) velocities [particleIndex].v [d] *= -0.5; // Optimized form of division by 2 velocities [particleIndex].slope = -1; // Change the slope to negative } else if (currentSlope == -1 && fitnessDiff < 0) // Negative slope and fitness degradation { // Apply the swarming mechanism - movement towards the global optimum for (int d = 0; d < coords; d++) velocities [particleIndex].v [d] += (cB [d] - a [particleIndex].c [d]) * movementFactor; velocities [particleIndex].slope = 0; // Reset the slope as unknown } // Check for zero velocity using the structure method if (velocities [particleIndex].IsZero ()) { // Initialize the velocity by moving towards the global optimum for (int d = 0; d < coords; d++) velocities [particleIndex].v [d] = (cB [d] - a [particleIndex].c [d]) * movementFactor; // Reset the slope velocities [particleIndex].slope = 0; } } //——————————————————————————————————————————————————————————————————————————————
テスト結果
それでは結果を見ていきます。このアルゴリズムは、群知能効果を内蔵した勾配ベース手法に基づいているため、従来の勾配法と比較して、タスクをより高い性能で処理できることが確認できます。
=============================
5 Hilly's; Func runs:10000; result:0.3422040822277234
25 Hilly's; Func runs:10000; result:0.3421751631202356
500 Hilly's; Func runs:10000; result:0.3421605659711745
=============================
5 Forest's; Func runs:10000; result:0.5708601371368296
25 Forest's; Func runs:10000; result:0.34628707444514434
500 Forest's; Func runs:10000; result:0.32879379664917996
=============================
5 Megacity's; Func runs:10000; result:0.19999999999999998
25 Megacity's; Func runs:10000; result:0.20923076923076928
500 Megacity's; Func runs:10000; result:0.23076923076922945
=============================
All score:2.91248 (32.36%)
可視化の結果を見ると、低次元関数において結果のばらつきが大きいことが確認できます。

Hillyテスト関数のDOS

Forestテスト関数のDOS

Megacityテスト関数のDOS
集団最適化アルゴリズムの評価表では、DOSは参考情報として掲載されています。
| # | AO | 詳細 | Hilly | Hilly ファイナル | Forest | Forest ファイナル | Megacity(離散) | Megacity ファイナル | ファイナル 結果 | % MAX | ||||||
| 10p(5F) | 50p(25F) | 1000p(500F) | 10p(5F) | 50p(25F) | 1000p(500F) | 10p(5F) | 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 | 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 |
| 13 | 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 |
| 14 | 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 |
| 15 | 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 |
| 16 | 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 |
| 17 | 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 |
| 18 | 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 |
| 19 | 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 |
| 20 | 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 |
| 21 | 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 |
| 22 | 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 |
| 23 | 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 |
| 24 | 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 |
| 25 | 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 |
| 26 | 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 |
| 27 | 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 |
| 28 | (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 |
| 29 | 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 |
| 30 | 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 |
| 31 | 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 |
| 32 | 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 |
| 33 | 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 |
| 34 | 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 |
| 35 | 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 |
| 36 | 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 |
| 37 | 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 |
| 38 | 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 |
| 39 | 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 |
| 40 | 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 |
| 41 | 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 |
| 42 | 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 |
| 43 | ATAm | 人工部族アルゴリズムM | 0.71771 | 0.55304 | 0.25235 | 1.52310 | 0.82491 | 0.55904 | 0.20473 | 1.58867 | 0.44000 | 0.18615 | 0.09411 | 0.72026 | 3.832 | 42.58 |
| 44 | CROm | サンゴ礁最適化M | 0.78512 | 0.46032 | 0.25958 | 1.50502 | 0.86688 | 0.35297 | 0.16267 | 1.38252 | 0.63231 | 0.26738 | 0.10734 | 1.00703 | 3.895 | 43.27 |
| 45 | CFO | 中心力最適化 | 0.60961 | 0.54958 | 0.27831 | 1.43750 | 0.63418 | 0.46833 | 0.22541 | 1.32792 | 0.57231 | 0.23477 | 0.09586 | 0.90294 | 3.668 | 40.76 |
| DOS | 決定論的振動型探索 | 0.34220 | 0.34218 | 0.34216 | 1.02654 | 0.57086 | 0.34629 | 0.32879 | 1.24594 | 0.20000 | 0.20923 | 0.23077 | 0.64000 | 2.912 | 32.36 | |
| RW | ニューロボイド最適化アルゴリズム2(joo) | 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 | |
まとめ
このアルゴリズムは、設定すべきパラメータが最小限(集団サイズと移動係数)のみで構成されているため、適用が容易であり、誤設定のリスクも低減されています。
また、3状態の勾配状態システム(正、負、不明)により、現在の探索方向の品質に応じて粒子の挙動が適応的に変化します。これが本アルゴリズムにおける主要な革新点です。さらに、複雑な数学的演算を必要としないため、計算効率にも優れています。
本アルゴリズムの主な強みは、群知能アルゴリズムの効率性と決定論的手法の信頼性および再現性を組み合わせている点にあります。ただし一般的に、決定論的手法は確率的手法に比べて性能面で劣る場合もあります。それにもかかわらず、特定の問題に対してはこのような手法が十分に有効であることもあります。

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

図3:アルゴリズムテスト結果のヒストグラム(0から100のスケール、高いほど良い)100は理論上の最大値であり、アーカイブには評価表を計算するためのスクリプトがあります。
DOSの長所と短所:
長所
- 迅速
- 実装が非常にシンプル
短所
- 低次元関数では結果のばらつきが大きい
この記事には、最新版のアルゴリズムコードを含むアーカイブが添付されています。記事の著者は、正規アルゴリズムの説明の絶対的な正確さについて責任を負いません。探索性能を向上させるために、それらの多くに変更が加えられています。記事に示された結論と判断は、実験結果に基づいています。
記事で使用されているプログラム
| # | 名前 | 種類 | 詳細 |
|---|---|---|---|
| 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_DOS.mq5 | スクリプト | DOSテストスタンド |
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/18154
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
Python + MetaTrader 5:データ、機能、プロトタイプのための高速研究フレームワーク
マルコフ状態遷移行列に基づくニューラルネットワークを用いた自己学習型エキスパートアドバイザー
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索