English Русский 中文 Español Deutsch Português
preview
人工蜂の巣アルゴリズム(ABHA):理論と方法

人工蜂の巣アルゴリズム(ABHA):理論と方法

MetaTrader 5 | 7 3月 2025, 09:05
92 0
Andrey Dik
Andrey Dik
内容
  1. はじめに
  2. アルゴリズムの実装
  3. 結論


1. はじめに

以前の記事の1つで、人工蜂コロニー(ABC)アルゴリズムについてすでに検討しました。これは、効率的な計算手法の創造において、自然がインスピレーションを与えた顕著な例です。蜂のコロニーは単なる昆虫の集団ではなく、それぞれの蜂が独自の役割を果たす高度に組織化されたシステムです。蜂の中には、餌を求めて周囲を探索する「偵察蜂」や、蜜や花粉を集める「採餌蜂」など、異なる役割を担う蜂がいます。この協力的な仕組みにより、コロニーはより効率的にリ食料源を発見することができます。

今回検討する新しい人工蜂の巣アルゴリズムは、蜂の採餌行動をより詳細に、かつ包括的に調べ、集団的な相互作用と役割の割り当てがどのように新しい食料源の探索を促進するかを実証します。また、エージェント間の相互作用がより効率的な結果を生む過程を明らかにします。このアルゴリズムは、蜂のコロニー内での個々の役割を詳しく掘り下げていきます。

ABHAの主な目的は、関数が多くの局所最小値や局所最大値を持つ可能性のある高次元空間で、最適解を見つけることです。従来の方法では大域最適解に到達できず、局所極値にとどまる可能性があり、最適化問題が特に困難になります。ABHAアルゴリズムは、蜂の効率的な採餌戦略からヒントを得ています。自然界において蜂は効率的に蜜源を見つけるために集団的な方法を使用しており、この原理を最適解を見つけるプロセスを改善するアルゴリズムに応用しています。

ABHAの構造には、蜂の行動のダイナミクスを反映したさまざまな状態が含まれています。その1つが「実験状態」で、蜂は発見した食料源に関する情報を交換します。この状態では、多次元空間で最も生産的な領域に関する知識が蓄積されます。もう1つの重要な状態が「探索状態」で、蜂は仲間から受け取った情報を基に、最適な資源を求めて空間を積極的に探索します。

人工蜂の巣アルゴリズム(ABHA)は、2009年にAndrés Muñoz氏が率いる研究者グループによって開発され、連続的な最適化問題を解決することを目指しています。


2. アルゴリズムの実装

ABHAは、蜂の行動との類似性を利用して連続探索空間における困難な最適化問題を解決する興味深い方法です。アルゴリズムの基本的な概念を見てみましょう。

1. 蜂の行動のモデル化

  • ABHAは個々の蜂の行動モデルに基づいています。アルゴリズム内の各エージェント(蜂)は、一連の動作ルールに従って、取るべき行動を決定します。

2. 巣内の相互作用

  • ABHAの主な焦点は蜂同士の相互作用です。
  • 蜂は自分たちが見つけた解に関する情報を交換します。

このアルゴリズムでは、蜂の4つの状態(役割)を使用します。これらは、異なるタイプの蜂の行動として考えることができます。わかりやすくするために、これらの状態を表の形式で示すと便利です。
蜂の状態
行動の種類
初心者
「巣」(情報が交換される抽象的な位置)に位置しており、食料源に関する情報を持たない
経験者   食料源に関する情報を持ち、それを共有することができる
探索  現在の食料源よりも良い食料源を探す
食料源 食料源の収益性を評価し、申告する価値があるかどうかを決定する

これらの各状態は、蜂が食物源を探して利用する際の行動のさまざまな側面を反映しています。蜂の各状態は、対応する蜂が従う一連のルールを表します。

蜂の状態   空間における蜂の位置を変えるためのルール
初心者
ランダムに探索を開始したり、ダンスが可能な場合はそれに従ったりする。食料源に関する情報が入手できない場合は、ランダムな捜索を開始することがある
経験者 食料源に関する情報が有効であれば、ダンスを通じてそれを他の蜂に伝えることができる。情報が無効な場合は、ランダム探索を開始することがある
探索 最適な食料源が見つかるまで、方向と歩幅に関する情報を使用して位置を変更する
食料源 食料源の収益性を評価し、基準を満たさない場合は探索の方向を変更することがある

すべての蜂が食料源に関する情報を共有できるわけではなく、またすべての蜂がこの能力を持つ他の蜂から情報を受け取れるわけでもありません。食物源に関する情報を受け取ったり渡したりする能力を持つ蜂には2種類あります。

1. 情報を渡す能力を持つ

  • 経験者:食料源に関する情報が有効である場合、ダンスを通じて他の蜂に情報を伝える

2. 他の蜂のダンスを通して情報を受け取る能力を持つ

  • 初心者:食料源に関する情報を得るために、可能であればダンスに従うことがある
  • 経験者 :ダンスを通じて他の蜂から情報を受け取ることができ、食料源に関する情報にアクセスできる

蜂は、経験に関連する条件や食料源に関する情報に応じて状態を変えることができます。以下に、蜂の種類と、蜂がある状態から別の状態に移行できる条件を示します。

1. 初心者

  • ->経験者:初心者が、非常に利益率の高い食料源に関する情報を受け取った場合(たとえば、他の蜂のダンスを通じて)、経験者な状態に移行する可能性がある
  • ->探索:初心者が食料源に関する情報を受け取らない場合、独自に探索を開始し、探索状態になることがある

2. 経験者

  • ->探索:現在の食料源に関する情報が十分でない場合(たとえば、現在の適応度値が閾値を下回っている場合)、蜂は新しい食料源を探すために探索状態に入ることがある
  • ->食料源:食料源に関する情報が確認された場合(たとえば、現在の適応度値が高く安定している場合)、蜂は食料源状態に切り替えて、食料源をより詳細に分析することがある

3. 探索

  • ->食料源:探索蜂が優れた特性を持つ食料源を見つけた場合(たとえば、現在の適応度値が閾値よりも優れている場合)、食料源状態に切り替えて、その食料源の収益性を定期的に評価できる
  • ->初心者:探索中の蜂が食料源を見つけられなかったり、情報が十分に価値がない場合は、初心者に戻ることがある

4. 食料源

  • ->探索:現在の食料源が実用的でないことが判明した場合(たとえば、現在の適応度値が閾値よりも悪い場合)、蜂は新しい食料源を探すために探索状態に切り替えることがある
  • ->経験者:蜂が見つけた食料源が有益であることが証明された場合、経験状態に入り、その情報を他の蜂に伝えることがある

これらの状態遷移により、アルゴリズムは解空間内の個体の位置に応じて探索戦略を動的に変更し、食料源に関する情報を効率的に交換できるようになります。

食料源」と蜂の「ダンス」の概念は、アルゴリズムにおいて重要な役割を果たします。アルゴリズムのコンテキストでは、「食料源」は最適化問題に対する潜在的な解を表します。

1. それぞれの「食料源」は特定の位置に対応しており、探索空間における最適化問題の可能な解を表します。 
2. 食料源の品質または「収益性」は、その時点での目的関数の値によって決まります。目的関数の値が高いほど、食料源は「より収益性が高い」ことになります。
3. アルゴリズム内の蜂は、最も「収益性の高い」食料源、つまり目標関数の最適な値に対応する位置を探して利用します。
4. 食料源が枯渇するということは、探索空間内の特定の地点ではより良い解が見つからないことを意味し、蜂は新しい、より有望な領域を探すことに切り替える必要があります。

このアルゴリズムでは、「ダンス」は蜂が見つけた「食料源」に関する情報を交換する方法です。それは次のように起こります。

  • 蜂は有望な「食料源」を見つけると、「」に戻って「ダンス」をします
  • ダンス」の持続時間は、見つかった食料源の「収益性」によって決まります。解が優れているほど、「ダンス」の持続時間は長くなります。
  • 巣の中の他の蜂はこの「ダンス」を聞いて、食料源に関する情報を得るかもしれません。蜂が「ダンス」に従う確率は、その源である「収益性」に依存します。

したがって、ABHAアルゴリズムにおける「食料源」は最適化問題に対する潜在的な解決策の類似物であり、その「収益性」は探索空間内の対応するポイントにおける目的関数の値によって決定され、「ダンス」は探索中に見つかった最も有望な解決策に関する情報を蜂間で渡す方法です。

ABHAアルゴリズムでは、各タイプの蜂は、前のステップ、現在のステップ、および最適な適応度の値からの適応度(またはコスト)値を次のように使用します。

蜂の状態 
初心者
経験者
探索
食料源
現在のコスト
経験済み状態または探索状態に入るために使用
現在の値が高く、情報が有効な場合、ダンスを通じてこの情報を他の蜂に渡すことができる
現在の適応度値を使用して現在の位置を評価し、探索を続けるか方向を変えるかを決定する
現在の値が閾値を下回る場合、食料源が十分ではないと判断し、新しい食料源の探索を開始することがある
前回の値
未使用
現在の値と以前の値を比較して、状況が改善されたかどうかを判断する。現在の値がより良好であれば、情報を渡す可能性が高くなる可能性がある
現在の値と以前の値を比較して、状況が改善されたかどうかを判断する。現在の値がより良好であれば、同じ方向に継続する可能性がある
未使用
最適値
未使用
最適値を使用して、特定の食料源の探索を続けるか、新しい食料源を探すかを判断できる
最適値を使用して、現在の食料源がより収益性が高いかどうかを判断する。これは、その場に留まるか、探索を続けるかを決定するのに役立つ
最良の価値を使用して、現在の食料源を利用し続けるか、経験者な状態に移行するかを決定する

各タイプの蜂は、異なる反復で適応度情報を使用して決定を下し、異なる状態に移行します。

アルゴリズムでは、ランダム探索の確率、ダンスに従う確率、食料源を放棄する確率(または食料源の近くに留まる確率)などの行動選択確率が、最適化全体を通じて動的に計算されます。これらの確率は、エージェント(蜂)が現在の情報と環境の状態に基づいてどのように行動するかを決定するのに役立ちます。

確率の計算

1.ランダム探索の確率(Psrs):蜂がダンスを追ったり、現在の食料源に留まったりする代わりに、ランダムな探索を開始する確率

      2.ダンスに従う確率(Prul):蜂が他の蜂のダンスに追従する確率

          3. 食料源を放棄する確率(Pab):蜂が現在の食料源の近くに留まるか、それを放棄する確率

              異なる状態の蜂は異なる方法で確率を使用し、各状態の確率も異なります。

              1.   初心者

              • Psrs:高い(他の食料源に関する情報を持たず、ランダムな探索を開始できるため)
              • Prul:他の蜂が踊っている場合に使用できるが、確率は利用可能な情報によって異なる
              • Pab:まだ食料源を見つけていないため、該当しない

              2. 経験者

              • Psrs:低い(すでに食料源に関する情報を持っているため)
              • Prul:食料源情報が有効であると判断された場合に、他の蜂に情報を渡すために使用される
              • Pab:現在の食料源の調査を継続するか、利益が低い場合はそれを放棄するかを決定するために使用できる

               3. 探索

              • Psrs:蜂が満足のいく供給源を見つけられない場合に使用できる
              • Prul:蜂が別の蜂のダンスに従って新しい情報源を探すことにした場合に使用できる
              • Pab:探索を続行するか、「ハイブ」に戻るかを評価するために使用される

               4. 食料源

              • Psrs:蜂がすでに発生源を見つけているため低い
              • Prul:食料源が有益であると考えられる場合に、有効な食料源に関する情報を他の蜂に渡すために使用される
              • Pab:食料源が満足のいく結果を生成しない場合は高く、食料源を放棄する決定につながることがある

              うまくいけば、蜂の行動の微妙な違いをすべてカバーし、疑似コードを書き始めることができます。

              初期化
                  アルゴリズムパラメータ(popSize、maxSearchAttempts、abandonmentRateなど)を設定します。
                  ランダムな位置を持つpopSizeエージェントの集団を作成する
                  各エージェントの初期状態を初心者に設定する

              メインループ
                  停止条件に達するまで:
                      各エージェントについて:
                          現在の状態に応じてアクションを実行する
                              初心者:ランダム探索またはダンスに従う
                              経験者:ランダム探索、ダンスまたは局地的探索に従う
                              探索:特定の方向への動き
                              食料探索:最適な位置周辺の局地的探索
                          
                          エージェントの適合性を評価する
                          大域的最適解が見つかった場合は更新する

                      意思決定の確率と平均コストを計算する

                      各エージェントについて:
                          ステータスを更新する:
                              初心者:経験者または探索者への移行
                              経験者:食料源または探索への移行が可能
                              探索:初心者または食料源への移行が可能
                              食料源:探索または経験者への移行が可能

                          個体の最良の位置と値を更新する

                  エージェントの確率を計算する
                  平均コストを計算する

              それでは、アルゴリズムコードを書き始めましょう。ABHAロジックは非常に複雑で、コードも膨大であるため、作業に関係する構造体、クラス、メソッドについて可能な限り詳しく説明します。

              S_ABHA_Agent構造体は、蜂の行動に基づいたアルゴリズム内の「」エージェントを表します。以下が構造体です。

              1. BeeState列挙体は、蜂のさまざまな状態を定義します。

              • stateNovice:蜂が活動を始めたばかりの初心者状態
              • stateExperienced:ある程度の経験がすでに蓄積されている経験済み状態
              • stateSearch:蜂が積極的に食料源を探しているときの探索状態
              • stateSource:食料源に近い状態とその定期的な評価

              2. 構造体フィールド

              • position[]:空間内の蜂の現在の位置の配列
              • bestPosition[]:空間内での蜂の現在の位置の配列
              • direction[]:蜂の移動方向の配列
              • cost:現在の食料源の品質
              • prevCost:以前の食料源の品質
              • bestCost:見つかった最高の食品源の品質
              • stepSize:座標に沿って移動するときの蜂のステップサイズの比率
              • state:蜂の現在の状態(整数として表される)
              • searchCounter:探索状態における蜂の行動のカウンタ

              3. 確率を設定する構造のフィールド

              • pab:食料源の近くに留まる可能性
              • p_si:他の蜂がこの蜂のダンスを選択する動的確率
              • p_srs:ランダム探索確率
              • p_rul:ダンスに従う確率
              • p_ab:食料源の近くに留まる確率

              4. Initメソッド

              • coords座標の数とinitStepSize初期ステップサイズを受け入れることでエージェントを初期化
              • 配列にメモリを割り当て、状態、カウンタ、確率など、構造体のすべてのメンバーの初期値を設定

              S_ABHA_Agent構造体は、アルゴリズム内で蜂の行動をモデル化するために使用されます。蜂はさまざまな状態になり、餌を探して空間を探索し、他の蜂と対話することができます。構造を初期化すると、アルゴリズムを開始するために必要な初期パラメータを設定できます。

              //——————————————————————————————————————————————————————————————————————————————
              struct S_ABHA_Agent
              {
                  enum BeeState
                  {
                    stateNovice      = 0,    // Novice state
                    stateExperienced = 1,    // Experienced state
                    stateSearch      = 2,    // Search state
                    stateSource      = 3     // Food source state
                  };
              
                  double position        []; // Current position of the bee
                  double bestPosition    []; // Best bee position found
                  double direction       []; // Bee movement direction vector
                  double cost;               // Current food source quality
                  double prevCost;           // Previous food source quality
                  double bestCost;           // Best food source found quality
                  double stepSize;           // Step ratio in all coordinates during a bee movement
                  int    state;              // Bee's current state
                  int    searchCounter;      // Counter of the bee actions in the search state
              
                  double pab;                // Probability of remaining near the source
                  double p_si;               // Dynamic probability of other bees choosing this bee's dance
              
                  double p_srs;              // Random search probability
                  double p_rul;              // Probability of following the dance
                  double p_ab;               // Probability of source rejection
              
                  void Init (int coords, double initStepSize)
                  {
                    ArrayResize (position,        coords);
                    ArrayResize (bestPosition,    coords);
                    ArrayResize (direction,       coords);
                    cost              = -DBL_MAX;
                    prevCost          = -DBL_MAX;
                    bestCost          = -DBL_MAX;
                    state             = stateNovice;
                    searchCounter     = 0;
                    pab               = 0;
                    p_si              = 0;
                    p_srs             = 0;
                    p_rul             = 0;
                    p_ab              = 0;
              
                    stepSize        = initStepSize;
                  }
              };
              //——————————————————————————————————————————————————————————————————————————————
              

              C_AO_ABHAC_AO基底クラスから派生しています。つまり、親クラスで定義された機能を使用します。次はクラスの記述です。

              1. C_AO_ABHA()コンストラクタ

              • 人口サイズ(popSize)、探索試行の最大回数(maxSearchAttempts)、さまざまな確率の比率、初期ステップサイズ(initialStepSize)などのパラメータを設定
              • アルゴリズムパラメータを含むparams配列を初期化

              2. SetParams()メソッドは、params配列に格納されている値に基づいてアルゴリズムパラメータの値を設定します。

              3. Init()メソッドは、探索範囲の最小値と最大値、探索ステップ、エポック数を入力としてアルゴリズムを初期化します。 

              4. Moving()メソッドとRevision()メソッドは、エージェント(蜂)の移動のロジックを実装し、見つかった解を修正するために設計されたメソッドです。

              5. クラスメンバー

              • maxSearchAttempts:探索試行の最大回数
              • abandonmentRate:食料源の近くに留まる確率の段階的な変化
              • randomSearchProbability:ランダム探索確率
              • stepSizeReductionFactor:ステップサイズの縮小率
              • initialStepSize:初期ステップサイズ
              • S_ABHA_Agent agents []:アルゴリズムに参加するエージェント(蜂)の配列
              • avgCost:見つかった解の平均コスト

              6. 蜂の行動メソッド

              • ActionRandomSearch ():指定された範囲内でランダム探索をおこなう
              • ActionFollowingDance():他の蜂のダンスに従う
              • ActionMovingDirection():ステップサイズを考慮して指定された方向に移動する
              • ActionHiveVicinity():食料源の近くで移動する

              7. さまざまな状態での蜂の活動のメソッド: StageActivityNovice()StageActivityExperienced()StageActivitySearch()StageActivitySource()は、蜂の状態に応じて蜂の行動を決定します。

              8. 蜂の状態を変えるメソッド: ChangingStateForNovice()ChangingStateForExperienced()ChangingStateForSearch()ChangingStateForSource()は、蜂の活動に応じて蜂の状態を変更します。

              9. 計算メソッド

              • CalculateProbabilities():蜂の行動の確率を計算する
              • CalculateAverageCost():見つかった解の平均コストを計算する

              C_AO_ABHAクラスは、蜂の行動に基づいた最適化アルゴリズムを実装し、移動、意思決定、状態の変化など、蜂の行動のさまざまな側面をカバーします。

              //——————————————————————————————————————————————————————————————————————————————
              class C_AO_ABHA : public C_AO
              {
                public:
                C_AO_ABHA ()
                {
                  ao_name = "ABHA";
                  ao_desc = "Artificial Bee Hive Algorithm";
                  ao_link = "https://www.mql5.com/ja/articles/15347";
              
                  popSize                 = 10;
              
                  maxSearchAttempts       = 10;
                  abandonmentRate         = 0.1;
                  randomSearchProbability = 0.1;
                  stepSizeReductionFactor = 0.99;
                  initialStepSize         = 0.5;
              
                  ArrayResize (params, 6);
                  params [0].name = "popSize";                 params [0].val = popSize;
              
                  params [1].name = "maxSearchAttempts";       params [1].val = maxSearchAttempts;
                  params [2].name = "abandonmentRate";         params [2].val = abandonmentRate;
                  params [3].name = "randomSearchProbability"; params [3].val = randomSearchProbability;
                  params [4].name = "stepSizeReductionFactor"; params [4].val = stepSizeReductionFactor;
                  params [5].name = "initialStepSize";         params [5].val = initialStepSize;
                }
              
                void SetParams ()
                {
                  popSize                 = (int)params [0].val;
              
                  maxSearchAttempts       = (int)params [1].val;
                  abandonmentRate         = params      [2].val;
                  randomSearchProbability = params      [3].val;
                  stepSizeReductionFactor = params      [4].val;
                  initialStepSize         = params      [5].val;
                }
              
                bool Init (const double &rangeMinP  [], //minimum search range
                           const double &rangeMaxP  [], //maximum search range
                           const double &rangeStepP [], //step search
                           const int     epochsP = 0);  //number of epochs
              
                void Moving   ();
                void Revision ();
              
                //----------------------------------------------------------------------------
                int    maxSearchAttempts;
                double abandonmentRate;
                double randomSearchProbability;
                double stepSizeReductionFactor;
                double initialStepSize;
              
                S_ABHA_Agent agents [];
              
                private: //-------------------------------------------------------------------
                double avgCost;
              
                //Types of bees' actions----------------------------------------------------------
                double ActionRandomSearch       (int coordInd);                      //1. Random search (random placement in a range of coordinates)
                double ActionFollowingDance     (int coordInd, double val);          //2. Follow the dance (move in the direction of the dancer)
                double ActionMovingDirection    (S_ABHA_Agent &agent, int coordInd); //3. Move in a given direction with a step
                double ActionHiveVicinity       (int coordInd, double val);          //4. Move in the vicinity of a food source
              
                //Actions of bees in different states----------------------------------------
                void   StageActivityNovice      (S_ABHA_Agent &agent); //actions 1 or 2
                void   StageActivityExperienced (S_ABHA_Agent &agent); //actions 1 or 2 or 4
                void   StageActivitySearch      (S_ABHA_Agent &agent); //actions 3
                void   StageActivitySource      (S_ABHA_Agent &agent); //actions 4
              
                //Change bees' state----------------------------------------------------
                void ChangingStateForNovice      (S_ABHA_Agent &agent);
                void ChangingStateForExperienced (S_ABHA_Agent &agent);
                void ChangingStateForSearch      (S_ABHA_Agent &agent);
                void ChangingStateForSource      (S_ABHA_Agent &agent);
              
                void CalculateProbabilities ();
                void CalculateAverageCost   ();
              };
              //——————————————————————————————————————————————————————————————————————————————
              

              C_AO_ABHAクラスのInitメソッドは、ABHAアルゴリズムを初期化する役割を担います。ひとつひとつ分解してみましょう。

              1. メソッドパラメータ

              • rangeMinP[]:最小探索範囲値の配列。これらは最適化される各変数の下限です。
              • rangeMaxP[]:最大探索範囲値の配列。これらは各変数の上限です。
              • rangeStepP[]:探索ステップ配列。これらは、探索中に変数がどの程度変化するかを決定する値です。
              • epochsP:アルゴリズムによってカバーされるエポック(反復)の数 

              2. このメソッドは、初期化が成功した場合はtrueを返し、それ以外の場合はfalseを返します。

              メソッドロジック

              • 探索範囲パラメータを使用してStandardInitメソッドを呼び出します。このメソッドは、探索範囲やステップの設定などの標準的な初期化操作を実行します。初期化に失敗した場合、Initメソッドは実行を終了し、falseを返します。
              • ArrayResizeメソッドは、アルゴリズム内の蜂(エージェント)を表すagents配列のサイズを変更します。配列のサイズはpopSizeに設定され、最適化に参加するエージェントの数を決定します。
              • ループは、agents配列内の各エージェントを初期化します。Initメソッドは各エージェントに対して呼び出され、初期座標(coords配列から)と初期ステップサイズinitialStepSizeを設定します。このステップでは、探索中にエージェントが移動できる距離を決定します。

              C_AO_ABHAクラスのInitメソッドは、次のタスクを実行します。

              • 探索パラメータの標準初期化が成功したかどうかを確認する
              • 指定された蜂の数に応じてエージェント配列のサイズを変更する
              • アルゴリズムが機能するために必要な初期パラメータを設定する独自のInitメソッドを使用して各エージェントを初期化する

              すべてのステップが正常に完了した場合、メソッドは「true」を返します。これは、アルゴリズムの初期化が成功したことを示します。

              //——————————————————————————————————————————————————————————————————————————————
              bool C_AO_ABHA::Init (const double &rangeMinP  [], //minimum search range
                                    const double &rangeMaxP  [], //maximum search range
                                    const double &rangeStepP [], //step search
                                    const int     epochsP = 0)   //number of epochs
              {
                if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false;
              
                ArrayResize (agents, popSize);
                for (int i = 0; i < popSize; i++)
                {
                  agents [i].Init (coords, initialStepSize);
                }
                return true;
              }
              //————————————————————
              

              次は、アルゴリズムのエージェント移動ステージを実装するC_AO_ABHAクラスのMovingメソッドです。Movingメソッドはパラメーターを取らず、値を返しません。最適化中にエージェント(蜂)の動きを制御します。メソッドロジック

              1. 初期化

              • revision変数を確認:falseの場合、これは最初のメソッド呼び出しであり、エージェントの位置を初期化する必要があります。
              • 初期位置の生成-ネストされたループがすべてのエージェントと座標を反復処理します。各座標について:
                • 指定された範囲(rangeMinrangeMax)内でvalランダム値を生成します。
                • この値はSeInDiSpを使用して調整され、指定されたステップで許容範囲に値が設定されます。
                • エージェントの現在の位置と最適な位置が設定されます(最初は同じです)。
                • エージェントの移動方向がランダムに生成されます。
              • 初期化が完了すると、revisionはtrueに設定され、メソッドは終了します。

              2. エージェント移動の基本的なロジック。状態別のエージェントの移動:

              • 各エージェントの現在の状態(初心者、経験者、探索、食料源)は、switchを使用して決定されます。状態に応じて、エージェントの動作を制御する適切なメソッド(たとえば、StageActivityNoviceStageActivityExperiencedなど)が呼び出されます。
              • 状態に応じてアクションを実行した後、SeInDiSpを使用してエージェントの位置が更新され、許容範囲内に留まります。

              3. ループは、エージェントの現在の位置をa配列の対応する要素にコピーしてa配列を更新します。

              ABHAアルゴリズムでエージェントの移動を制御するMovingメソッドの最終的な意味。これが最初のメソッド呼び出しである場合、最初にエージェントの位置を初期化し、次に状態に応じて位置を更新し、次の処理を含めます。

              • ランダムな開始位置を生成します。
              • エージェントの状態に応じてエージェントの動作を決定します。
              • a配列内のエージェントの現在の位置を更新します。 

              このメソッドは、最適化プロセスにおけるエージェントの動的動作のために他のビー状態メソッドを呼び出すためのキーおよび制御メソッドです。

              //——————————————————————————————————————————————————————————————————————————————
              void C_AO_ABHA::Moving ()
              {
                //----------------------------------------------------------------------------
                if (!revision)
                {
                  double val = 0.0;
              
                  for (int i = 0; i < popSize; i++)
                  {
                    for (int c = 0; c < coords; c++)
                    {
                      val = u.RNDfromCI (rangeMin [c], rangeMax [c]);
                      val = u.SeInDiSp (val, rangeMin [c], rangeMax [c], rangeStep [c]);
              
                      agents [i].position     [c] = val;
                      agents [i].bestPosition [c] = val;
                      agents [i].direction    [c] = u.RNDfromCI (-(rangeMax [c] - rangeMin [c]), (rangeMax [c] - rangeMin [c]));
              
                      a [i].c [c] = val;
                    }
                  }
                  revision = true;
                  return;
                }
                //----------------------------------------------------------------------------
                for (int i = 0; i < popSize; i++)
                {
                  switch (agents [i].state)
                  {
                    //------------------------------------------------------------------------
                    //Novice
                    case S_ABHA_Agent::stateNovice:
                    {
                      StageActivityNovice (agents [i]);
                      break;
                    }
                      //------------------------------------------------------------------------
                      //Experienced
                    case S_ABHA_Agent::stateExperienced:
                    {
                      StageActivityExperienced (agents [i]);
                      break;
                    }
                      //------------------------------------------------------------------------
                      //Search
                    case S_ABHA_Agent::stateSearch:
                    {
                      StageActivitySearch (agents [i]);
                      break;
                    }
                      //------------------------------------------------------------------------
                      //Food source
                    case S_ABHA_Agent::stateSource:
                    {
                      StageActivitySource (agents [i]);
                      break;
                    }
                  }
                  //--------------------------------------------------------------------------
                  for (int c = 0; c < coords; c++)
                  {
                    agents [i].position [c] = u.SeInDiSp (agents [i].position [c], rangeMin [c], rangeMax [c], rangeStep [c]);
                    a      [i].c        [c] = agents [i].position [c];
                  }
                }
                for (int i = 0; i < popSize; i++) for (int c = 0; c < coords; c++) a [i].c [c] = agents [i].position [c];
              }
              //——————————————————————————————————————————————————————————————————————————————
              
              

              C_AO_ABHAクラスのRevisionメソッドは、アルゴリズム内のエージェントの状態を更新する役割を担い、エージェントの位置と状態の評価と更新に関連するいくつかの重要なアクションを実行します。Revisionメソッドはパラメータを取らず、値を返しません。パフォーマンスに基づいてエージェントのステータスとポジションに関する情報を更新するために役立ちます。メソッドロジック

              1. 最適なエージェントを見つける:

              • ind変数は、最適なコストを持つエージェントインデックスを追跡するために-1値を使用して初期化されます。
              • 最適なエージェントを探索する場合、サイクルはすべてのpopSizeエージェントを巡回します。
              • a[i].fエージェントのコストが現在のfBの最大値を超えると、fBが更新され、indインデックスが保存されます。
              • 最適なコスト(ind-1と等しくない)を持つエージェントが見つかった場合、最適なエージェントの座標をcB配列にコピーするArrayCopy関数が呼び出されます。

              2. このサイクルはすべてのエージェントを通過し、配列の値に基づいてagents[i].costコストを更新します。

              3. 現在のコストに基づいて各エージェントの確率を計算するCalculateProbabilitiesメソッドが呼び出されます。これは、エージェントが次のステップでどのように動作するかを決定するために使用されます。

              4. CalculateAverageCostメソッドも呼び出されます。これは、蜂が自身の状態を分析し、新しい状態に移動するために必要な、すべてのエージェントの平均コストを計算します。

              5. このサイクルはすべてのエージェントを通過し、現在のエージェントの状態(ChangingStateForNoviceChangingStateForExperiencedなど)に応じて適切なメソッドを呼び出し、エージェントの状態を変更します。

              6. サイクルはすべてのエージェントを通過し、エージェントの現在の値がその最適なbestCostより大きいかどうかを確認します。

              • 大きい場合、bestCostが更新され、エージェントの現在の位置がbestPositionにコピーされます。
              • prevCost以前のコストがcost現在のコストに更新されます。

              Revisionメソッド操作の最終的な意味は、アルゴリズム内のエージェントの状態情報を更新し、次の主要なアクションを実行することです。

              1. 最適なコストを持つエージェントを見つけ、対応する変数を更新します。

              2. すべてのエージェントの価格を更新します。

              3. 現在の値に基づいて確率を計算します。

              4. エージェントの平均コストを計算します。

              5. パフォーマンスに基づいてエージェントの状態を更新します。

              6. 最適なエージェントの価格とポジションを更新します。

              このメソッドは、エージェントが成功に基づいて適応し、情報を交換できるようにするため、アルゴリズムの重要な部分です。

              //——————————————————————————————————————————————————————————————————————————————
              void C_AO_ABHA::Revision ()
              {
                //----------------------------------------------------------------------------
                int ind = -1;
              
                for (int i = 0; i < popSize; i++)
                {
                  if (a [i].f > fB)
                  {
                    fB = a [i].f;
                    ind = i;
                  }
                }
              
                if (ind != -1) ArrayCopy (cB, a [ind].c, 0, 0, WHOLE_ARRAY);
              
                //----------------------------------------------------------------------------
                for (int i = 0; i < popSize; i++) agents [i].cost = a [i].f;
              
                //----------------------------------------------------------------------------
                //Calculate the probabilities for bees at the current cost
                CalculateProbabilities ();
              
                //----------------------------------------------------------------------------
                //Calculate the average cost
                CalculateAverageCost ();
              
                //----------------------------------------------------------------------------
                //update bees' states (novice, experienced, search, source) 
                for (int i = 0; i < popSize; i++)
                {
                  switch (agents [i].state)
                  {
                    case S_ABHA_Agent::stateNovice:
                    {
                      ChangingStateForNovice (agents [i]);
                      break;
                    }
                    case S_ABHA_Agent::stateExperienced:
                    {
                      ChangingStateForExperienced (agents [i]);
                      break;
                    }
                    case S_ABHA_Agent::stateSearch:
                    {
                      ChangingStateForSearch (agents [i]);
                      break;
                    }
                    case S_ABHA_Agent::stateSource:
                    {
                      ChangingStateForSource (agents [i]);
                      break;
                    }
                  }
                }
                //----------------------------------------------------------------------------
                //Update the cost for bees
                for (int i = 0; i < popSize; i++)
                {
                  if (agents [i].cost > agents [i].bestCost)
                  {
                    agents [i].bestCost = agents [i].cost;
              
                    ArrayCopy (agents [i].bestPosition, agents [i].position);
                  }
                  agents [i].prevCost = agents [i].cost;
                }
              }
              //——————————————————————————————————————————————————————————————————————————————
              
              


              結論

              ABHA蜂の巣アルゴリズムについて検討し、その動作原理を詳しく分析しました。さらに、アルゴリズムの疑似コードを記述し、構造やクラスの概要に加え、初期化プロセス、およびMovingメソッドとRevisionメソッドの詳細についても説明しました。次回の記事では、アルゴリズムのコード記述を引き続き進め、残りのメソッドについて解説していきます。いつものように、テスト関数を用いた検証をおこない、得られた結果を評価表にまとめて分析します。

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

              添付されたファイル |
              ABHA.zip (29.82 KB)
              人工蜂の巣アルゴリズム(ABHA):テストと結果 人工蜂の巣アルゴリズム(ABHA):テストと結果
              この記事では、人工蜂の巣アルゴリズム(ABHA)の探索を続け、コードの詳細を掘り下げるとともに、残りのメソッドについて考察します。ご存じのとおり、このモデルにおける各蜂は個別のエージェントとして表現されており、その行動は内部情報、外部情報、および動機付けの状態に依存します。さまざまな関数を用いてアルゴリズムをテストし、その結果を評価表としてまとめて提示します。
              取引におけるニューラルネットワーク:時系列予測のための言語モデルの使用 取引におけるニューラルネットワーク:時系列予測のための言語モデルの使用
              時系列予測モデルの研究を続けます。本記事では、事前訓練済みの言語モデルを活用した複雑なアルゴリズムについて説明します。
              取引におけるニューラルネットワーク:TEMPO法の実践結果 取引におけるニューラルネットワーク:TEMPO法の実践結果
              TEMPO法について引き続き学習します。この記事では、実際の履歴データに対する提案されたアプローチの実際の有効性を評価します。
              初心者からプロまでMQL5をマスターする(第4回):配列、関数、グローバルターミナル変数について 初心者からプロまでMQL5をマスターする(第4回):配列、関数、グローバルターミナル変数について
              この記事は初心者向け連載の続きです。データ配列、データと関数の相互作用、および異なるMQL5プログラム間でのデータ交換を可能にするグローバルターミナル変数について詳しく説明します。