English Русский 中文 Español Deutsch Português
preview
人工蜂の巣アルゴリズム(ABHA):テストと結果

人工蜂の巣アルゴリズム(ABHA):テストと結果

MetaTrader 5テスター | 7 3月 2025, 09:08
146 0
Andrey Dik
Andrey Dik

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


1. はじめに

前回の記事では、人工蜂の巣アルゴリズム(ABHA)の動作原理を徹底的に検証することで、その魅力的な世界を掘り下げました。構造体とクラスについて説明し、MovingメソッドとRevisionメソッドとともにアルゴリズムの擬似コードを提示しました。この序章は、アルゴリズムのさらなる研究と理解の基礎となります。

この記事では、引き続きコーディングについて掘り下げ、残りのすべてのメソッドをカバーします。いつものように、アルゴリズムの効率と性能を評価するために、さまざまなテスト関数でテストを実施します。最後に、アルゴリズム作業の結果を評価表にまとめます。 

ABHAアルゴリズムの主要なポイントを、蜂の個体状態と行動モデルに基づいて振り返りましょう。

  • 各蜂は個別のエージェントとして表現され、その行動は状態(初心者、経験者、探索、食料源)によって制御されます。
  • ある時点での蜂の行動は、利用可能な内部情報と外部情報、さらに動機付けの状態に基づき、特定のルールに従って決定されます。
  • ルールセットはすべての蜂に共通ですが、空間的な位置によって知覚される環境が異なるため、個々の蜂の行動も異なります。
  • 蜂は採餌経験や動機付けの状態に応じて異なる行動を示すことがあります。

したがって、ABHAモデルは、個体の特性や環境に適応するルールに基づいて蜂の行動を表現しています。


2. アルゴリズム実装の再開

前回の記事で説明した擬似コードを使って、アルゴリズムメソッドを書き続けましょう。

StageActivityNoviceメソッドは、初心者の蜂がランダムサーチによって、あるいは他のエージェントの「ダンス」に従って、どのように位置を変えるかを制御します。メソッドの説明:

  • パラメータ:このメソッドはS_ABHA_Agent型のagentオブジェクトへの参照を受け取ります。
  • 戻り値:このメソッドは何も返しません(void)。

メソッドのロジック:

1. val変数は、エージェントの現在の座標を格納するために宣言されます。

2. forループは、すべてのエージェントの座標を繰り返し処理します。ここで、coordsは探索空間の座標(または次元)の総数です。

3. ループの中では、エージェントの現在の座標の値がval変数に格納されます。

4. 確率に応じて、どの行動を取るかが決定されます。

  • ランダムサーチ:生成された乱数(u.RNDprobab ()を使用)がrandomSearchProbabilityより小さい場合、ランダムサーチが実行され、ActionRandomSearch (c)メソッドを使用してc座標が更新され、この次元に新しい位置を生成します。
  • ダンスに従う:そうでなければ、エージェントは他のエージェントの「ダンス」に従うことになります。この場合、c座標はActionFollowingDance (c, val)メソッドを用いて更新され、val値を用いて他のエージェントに関する情報に基づいて新しい位置を決定します。

StageActivityNoviceメソッドは、ABHAアルゴリズムにおける初心者の動作を制御し、最終的に以下の重要なアクションを実行します。

1. 各エージェント座標を繰り返し処理します。

2. ランダムな確率によって、エージェントがランダムサーチをおこなうか、他のエージェントの「ダンス」に従うかを決定します。

3. 選択された行動に従って、各座標におけるエージェントの位置を更新します。

このメソッドにより、初心者はランダムな戦略と他のエージェントとの相互作用に基づく両方の戦略を用いて環境に適応できます。

//——————————————————————————————————————————————————————————————————————————————
//Actions 1 or 2
void C_AO_ABHA::StageActivityNovice (S_ABHA_Agent &agent)
{
  double val;

  for (int c = 0; c < coords; c++)
  {
    val = agent.position [c];

    if (u.RNDprobab () < randomSearchProbability) agent.position [c] = ActionRandomSearch   (c);
    else                                          agent.position [c] = ActionFollowingDance (c, val);
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのStageActivityExperiencedメソッドは、ABHAアルゴリズムにおける「経験者」エージェントの行動を担当し、「経験者」エージェントがランダム確率と現在の戦略に応じて行動を選択する方法を制御します。

1. rnd変数が宣言されます。これは、エージェントの行動を決定するために生成された乱数を保存するために使用されます。

2. forループは、すべてのエージェントの座標を繰り返し処理します。ここで、coordsは探索空間の座標(または次元)の総数です。

3. ループ内では、RNDprobab ()メソッドを使って各座標に対してrnd乱数を生成し、01の間の値を返します。

4. rndagent.p_srs(ランダムサーチ確率)以下であれば、エージェントはActionRandomSearch(c)メソッドを用いてc座標で位置を更新しながらランダムサーチをおこないます。

ダンスに従う確率

  • rndagent.p_srsを超え、agent.p_rul(ダンスに追従する確率)以下であれば、エージェントは他のエージェントの「ダンス」に追従し、ActionFollowingDance (c, agent.position [c])メソッドを使用して位置を更新します。

食料源の近くに留まる確率

  • いずれの前提条件も満たされない場合、エージェントは食料源の近くに留まり、ActionHiveVicinity (c, agent.bestPosition [c])を使用して位置を更新します。ここで、agent.bestPosition [c]はエージェントがこれまでに見つけた最良の位置を表します。

StageActivityExperiencedメソッドは、ABHAアルゴリズムにおける「経験者」エージェントの動作を制御し、最終的に以下のことをおこないます。

1. 各エージェント座標を繰り返し処理します。

2. 行動を選択するために乱数を生成します。

3. 生成された数と確率によって、エージェントがランダムサーチをおこなうか、他のエージェントの「ダンス」に従うか、あるいは食料源付近に留まるかを決定します。

このメソッドにより、「経験者」エージェントは、初心者よりも複雑な戦略を用いて環境に適応し、食料源探索のパフォーマンスを向上させることができます。

//——————————————————————————————————————————————————————————————————————————————
//actions 1 or 2 or 4
void C_AO_ABHA::StageActivityExperienced (S_ABHA_Agent &agent)
{
  double rnd = 0;

  for (int c = 0; c < coords; c++)
  {
    rnd = u.RNDprobab ();

    // random search probability
    if (rnd <= agent.p_srs)
    {
      agent.position [c] = ActionRandomSearch (c);
    }
    else
    {
      // Probability of following the dance
      if (agent.p_srs < rnd && rnd <= agent.p_rul)
      {
        agent.position [c] = ActionFollowingDance (c, agent.position [c]);
      }
      // Probability of remaining near the source
      else
      {
        agent.position [c] = ActionHiveVicinity (c, agent.bestPosition [c]);
      }
    }
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのStageActivitySearchメソッドは、探索フェーズにおけるエージェントの行動を担当し、選択された方向に応じてエージェントの位置を更新しながら、探索空間におけるエージェントの移動方法を制御します。このメソッドでは次をおこないます。

1. 各エージェント座標を繰り返し処理します。

2. 座標ごとにActionMovingDirectionメソッドが呼ばれ、エージェントの新しい移動方向が決定されます。

3. 対応する座標のエージェントの位置を更新します。

このメソッドにより、エージェントは探索空間内を能動的に移動し、選択された方向によって位置を適応させることができます。

//——————————————————————————————————————————————————————————————————————————————
//Actions 3
void C_AO_ABHA::StageActivitySearch (S_ABHA_Agent &agent)
{
  for (int c = 0; c < coords; c++)
  {
    agent.position [c] = ActionMovingDirection (agent, c);
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのStageActivitySourceメソッドは、モデル内のエージェントの食糧源の決定に関連する行動を取るように設計されています。エージェントの位置は、蜂の巣の近くにいるという文脈における最適な位置に基づいて更新されます。このメソッドは以下の手順を実行します。

1. 変数valを初期化します。

2. 各エージェント座標を繰り返し処理します。

3. 各座標について、ActionHiveVicinityメソッドを呼び出してエージェントの位置を更新します。

このメソッドは、「食料源」エージェントが、既知の食料源の周囲の詳細な探索に全神経を集中させるのに役立ちます。

//——————————————————————————————————————————————————————————————————————————————
//Actions 4
void C_AO_ABHA::StageActivitySource (S_ABHA_Agent &agent)
{
  double val = 0;

  for (int c = 0; c < coords; c++)
  {
    agent.position [c] = ActionHiveVicinity (c, agent.bestPosition [c]);
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのActionRandomSearchメソッドは、与えられた座標範囲内でランダムサーチをおこなうように設計されており、エージェントは与えられた範囲内でランダムに値を選択することができます。このメソッドは、探索空間の拡張探索をおこない、以下のアクションを実行します。

1. 乱数値を生成すべき座標のインデックスを受け取ります。

2. 乱数生成法を使用して、指定された座標の最小値と最大値で定義される範囲の値を取得します。

3. double型のランダムに生成された値を返します。

//——————————————————————————————————————————————————————————————————————————————
//1. Random search (random placement in a range of coordinates)
double C_AO_ABHA::ActionRandomSearch (int coordInd)
{
  return u.RNDfromCI (rangeMin [coordInd], rangeMax [coordInd]);
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのActionFollowingDanceメソッドは、ダンサーをフォローするロジックを実装しています。これは、すでに一定の経験レベルに達しているエージェントの方向に移動することを意味します。このメソッドは、現在のエージェントが従うエージェントを選択するために確率的アプローチを使用し、計算された方向にランダムなノイズを導入します。

1. 全体の確率を計算します。

  • totalProbabilityは初期化された変数で、すべての「経験者」エージェントのp_si確率の合計を格納します。
  • すべてのエージェントの状態はループでチェックされます。エージェントが「経験者」である場合、その確率はtotalProbabilityに加えられます。

2. ランダムな値を生成し、エージェントを選択します。

  • randomValue乱数値が生成されます。この値はtotalProbabilityに対して正規化されます。
  • 次のループでは、「経験者」エージェントのp_si確率が累積されます。累積確率がrandomValueを超えると、選択されたエージェントのindexが保存され、ループが解除されます。

3. 選択されたエージェントをチェックし、新しい値を計算します。

  • エージェントが選択されていない場合(ind-1)、ランダムサーチのためにActionRandomSearchメソッドが呼び出されます。
  • エージェントが選択された場合、選択されたエージェントの最良の位置とvalの現在値との差として移動方向が計算されます。
  • ランダムノイズ-1から1の範囲で生成されます。
  • 方向とノイズを調整した新しい値が返されます。

ActionFollowingDanceメソッドは、「経験者」エージェントを追従する戦略を実装しています。このエージェントはルーレットルールに基づいて選択され、経験値の高いダンスをおこなう蜂ほど選ばれる確率が高くなります。さらに、確率的なアプローチを用いて追従対象を決定し、移動方向にランダムなノイズを加えることで、エージェントの行動をより多様で適応的なものにしています。

———————————————————————————————————————————————————————————————————————
//2. Follow the dance (move in the direction of the dancer)
double C_AO_ABHA::ActionFollowingDance (int coordInd, double val)
{
  //----------------------------------------------------------------------------
  double totalProbability = 0;

  for (int i = 0; i < popSize; i++)
  {
    if (agents [i].state == S_ABHA_Agent::stateExperienced)
    {
      totalProbability += agents [i].p_si;
    }
  }

  //----------------------------------------------------------------------------
  double randomValue = u.RNDprobab () * totalProbability;
  double cumulativeProbability = 0;
  int    ind = -1;

  for (int i = 0; i < popSize; i++)
  {
    if (agents [i].state == S_ABHA_Agent::stateExperienced)
    {
      cumulativeProbability += agents [i].p_si;

      if (cumulativeProbability >= randomValue)
      {
        ind = i;
        break;
      }
    }
  }

  //----------------------------------------------------------------------------
  if (ind == -1)
  {
    return ActionRandomSearch (coordInd);
  }

  double direction = agents [ind].bestPosition [coordInd] - val;
  double noise     = u.RNDfromCI (-1.0, 1.0);

  return val + direction * noise;
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのActionMovingDirectionメソッドは、エージェントを所定の方向に一定のステップで移動させます。コードをひとつひとつ分解してみましょう。

1. エージェントの動き

  • 指定されたcoordInd座標でエージェントの位置を更新します。
  • agent.position [coordInd]:与えられた座標におけるエージェントの現在位置
  • agent.stepSize:エージェントがこの方向に移動するステップサイズ
  • agent.direction [coordInd]:指定された座標に沿ったエージェントの移動方向
  • stepSizedirectionを掛けると、エージェントの現在位置に追加される移動量が得られます。

2. ステップの減少サイズ

  • 移動後、stepSizeのステップサイズはstepSizeReductionFactorの比率だけ減少します。
  • これは、発見された解を洗練させるためにエージェントがよりゆっくりと動き始めるときの、動きの減少の効果をシミュレートするために必要です。

ActionMovingDirectionメソッドは、エージェントがステップサイズを考慮して指定された方向に移動し、移動後にこのステップを減少させるという単純なロジックを実装しています。

//——————————————————————————————————————————————————————————————————————————————
//3. Move in a given direction with a step
double C_AO_ABHA::ActionMovingDirection (S_ABHA_Agent &agent, int coordInd)
{
  agent.position [coordInd] += agent.stepSize * agent.direction [coordInd];
  agent.stepSize *= stepSizeReductionFactor;

  return agent.position [coordInd];
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのActionHiveVicinityメソッドは、食物源の近くでのエージェントの行動を定義するためのものです。ActionHiveVicinityメソッドは、指定された座標に新しい位置を生成します。現在の位置の近くに新しいポジションが生まれる確率が高くなります。

//——————————————————————————————————————————————————————————————————————————————
//4. Move in the vicinity of a food source
double C_AO_ABHA::ActionHiveVicinity (int coordInd, double val)
{
  return u.PowerDistribution (val, rangeMin [coordInd], rangeMax [coordInd], 12);
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのChangingStateForNoviceメソッドを見てみましょう。このメソッドは、現在のコスト適応度と食料源に関する情報に応じてエージェントの状態を変更する役割を担っています。

1. このメソッドでは、前回コストと最良のコストは使用されません。

2. ステータスの確認

  • 食料源の現在のコストが平均のavgCostを超えた場合、エージェントの状態は「経験者」(stateExperienced)に変化します。これは、エージェントが収益性の高い食料源に関する十分な情報を入手し、より効率的に行動する準備ができていることを意味します。

3. 探索状態への移行

  • 現在の値が平均値を超えない場合、エージェントは探索状態(stateSearch)に入ります。この状態は、エージェントが食料源に関する情報を持っておらず、ランダムサーチを開始することを想定しています。

4. ランダムサーチの方向

  • ループはすべてのcoords座標を反復処理し、各座標にランダムな方向が割り当てられます。RNDfromCIメソッドは、指定された範囲内で乱数を生成し、指定された範囲(rangeMinrangeMax)内での移動量と方向を決定するために使用されます。

5. 探索パラメータの初期化

  • stepSizeは、エージェントが食料源を探すためにおこなった反復回数を記録するsearchCounterとともに、エージェントの移動のために設定されます。

ChangingStateForNoviceメソッドは、餌の値によって「初心者」蜂の状態を変更します。この値が高ければ、そのエージェントは「経験者」になります。値が低い場合、エージェントは探索状態に入り、ランダムサーチを開始し、パラメータを初期化します。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_ABHA::ChangingStateForNovice (S_ABHA_Agent &agent)
{
  //Current cost   : Used to enter either the Experienced or Search state.
  //Previous cost: Not used.
  //Best cost    : Not used.

  //Into Experienced. If a novice receives information about a highly profitable food source (for example, through dances of other bees), it may transition to the experienced state.
  //Into Search. If a novice does not receive information about food sources, it may begin a random search and enter a search state.

  if (agent.cost > avgCost) agent.state = S_ABHA_Agent::stateExperienced;
  else
  {
    agent.state = S_ABHA_Agent::stateSearch;

    for (int c = 0; c < coords; c++)
    {
      agent.direction [c] = u.RNDfromCI (-(rangeMax [c] - rangeMin [c]), (rangeMax [c] - rangeMin [c]));
    }

    agent.stepSize        = initialStepSize;
    agent.searchCounter   = 0;
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのChangingStateForExperiencedメソッドは、「経験者」蜂(エージェント)の状態を、その現在と以前の食料源コスト値に応じて制御するように設計されています。メソッドを詳しく見てみましょう。

1. pabパラメータの変更

  • 現在の値が以前の値より小さければ、食料源の近くに留まる確率(pab)を下げます。pab0より小さくなると0に設定されます。
  • 現在の値が前の値より大きければ、食料源の近くに留まる確率を上げます。pab1を超える場合は1に設定されます。
  • 現在値が最良値を超えた場合、食料源付近に留まる確率は最大値の1に設定されます。

2. 食料源または探索への移動

  •  現在の値が個体群平均より20%高い場合:蜂は食物源(stateSource)状態に入り、これは良い食物源を見つけたことを意味します。食料源に留まる確率は1に設定されます。
  • 現在値が平均値より小さい場合、蜂は探索(stateSearch)状態になります。これは新たな食料源を探す必要性を示します。

3. ランダムサーチの方向

  •  探索状態に移行した場合:蜂は新しい餌を探すためにランダムな指示を与えられます。

4. 探索パラメータの初期化

  • エージェントの移動にはステップサイズが設定され、食料を探すために取ったステップを追跡する探索カウンタも設定されます。

ChangingStateForExperiencedメソッドは、「経験者」蜂の状態を、現在の食料源の値と以前の値に応じて制御します。蜂が餌源の探索を続けるべきか、それとも新しい餌源を探すべきかを判断するために、現在値、前回値、最良値を比較するロジックを使用します。pabパラメータ(食料源に残る確率)は、コストの変化に応じて調整されます。

//——————————————————————————————————————————————————————————————————————————————

void C_AO_ABHA::ChangingStateForExperienced (S_ABHA_Agent &agent)
{

  //Current cost   : If the current value is high and the information is valid, it can pass this information on to other bees through a dance.
  //Previous cost: A bee compares the current value with the previous one to determine if the situation has improved. If the current value is better, it may increase the probability of passing the information.
  //Best cost    : A bee can use the best value to assess whether to continue exploring a given food source or to look for a new one.

  //Into Search. If the information about the current food source is not good enough (e.g. the current fitness value is below the threshold), a bee may enter a search state to search for new sources.
  //Into Food Source. If information about a food source is confirmed (e.g. the current fitness value is high and stable), a bee may switch to a food source state to analyze the source in more depth.

  if (agent.cost < agent.prevCost)
  {
    agent.pab -= abandonmentRate;

    if (agent.pab < 0.0) agent.pab = 0.0;
  }

  if (agent.cost > agent.prevCost)
  {

    agent.pab += abandonmentRate;

    if (agent.pab > 1.0) agent.pab = 1.0;
  }

  if (agent.cost > agent.bestCost) agent.pab = 1.0;

  if (agent.cost > avgCost * 1.2)
  {

    agent.state = S_ABHA_Agent::stateSource;

    agent.pab = 1;
  }

  else

    if (agent.cost < avgCost)
    {

      agent.state = S_ABHA_Agent::stateSearch;

      for (int c = 0; c < coords; c++)
      {

        agent.direction [c] = u.RNDfromCI (-(rangeMax [c] - rangeMin [c]), (rangeMax [c] - rangeMin [c]));
      }

      agent.stepSize        = initialStepSize;

      agent.searchCounter   = 0;
    }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのChangingStateForSearchメソッドのコードを詳しく見てみましょう。このメソッドは以下の手順を実行します。

1. 現在値と前回値の比較

  • agent.costの現在値が、以前のagent.prevCostより小さければ、これは蜂が良い食料源から遠ざかっていることを意味します。その場合、
    • 蜂は、u.RNDfromCI関数を使って各座標方向に対してランダムな値を生成することで、方向を変えます。
    • 初期ステップサイズinitialStepSizeが設定され、蜂は探索を続ける準備ができました。
    • searchCounter探索カウンタを増やすと、探索試行回数を追跡できます。

2. 現在値と最良の値の比較

  • 現在値がagent.bestCostを上回った場合、これは蜂がより有益な餌を見つけたことを意味します。その場合、
    • ステップサイズは、指定された比率stepSizeReductionFactorだけ縮小されます。これは、発見された解を洗練するために、より小さなステップが必要であることを示します。
    • 蜂がより有益な食料源を見つけたため、探索カウンタは0にリセットされます。

3. 探索の最大試行回数を確認する

  • 探索カウンタが最大試行回数maxSearchAttemptsに達した場合、これは蜂が一定の試行回数の後に有益なものを見つけられなかったことを意味します。その場合、
    • 探索カウンタが0にリセットされます。
    • 蜂は初心者状態(stateNovice)になります。つまり、探索を再開する必要があります。

4. 良い食料源の存在を確認する

  • 現在の値がavgCostの平均値より20%高ければ、これは蜂が良い餌を発見したことを示しています。その場合、
    • 蜂は食物源状態(stateSource) に入り、食物源の収益性をさらに評価します。
    • 食料源近くに滞在する確率(pab)は1に設定されます。蜂はその食料源の近くに留まろうとします。

ChangingStateForSearchメソッドは、探索状態における蜂の行動を管理し、現在、前回、および最良の適応度値の比較に基づいて決定を下します。これによって蜂は環境に適応し、食糧源初心者の状態に移行することができ、また見つけた食糧源に応じてステップサイズを調整することができます。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_ABHA::ChangingStateForSearch (S_ABHA_Agent &agent)
{
  //Current cost  : A bee uses its current fitness value to assess its current position and to decide whether to continue searching or change direction
  //Previous value: A bee compares the current value with the previous one  to determine if things have improved. If the current value is better, it can continue in the same direction.
  //Best value    : The bee uses the best value to determine whether the current food source is more profitable than the previous ones. This helps it make decisions about whether to stay put or continue searching.

  //Into Food Source. If a searching bee finds a food source with good characteristics (e.g., the current fitness value is better than the threshold), it can switch to the food source state to evaluate the profitability of the source.
  //Into Novice. If a searching bee does not find any food sources or the information is impractical, it may revert to novice.

  if (agent.cost < agent.prevCost)
  {
    for (int c = 0; c < coords; c++)
    {
      agent.direction [c] = u.RNDfromCI (-(rangeMax [c] - rangeMin [c]), (rangeMax [c] - rangeMin [c]));
    }

    agent.stepSize = initialStepSize;
    agent.searchCounter++;
  }

  if (agent.cost > agent.bestCost)
  {
    agent.stepSize *= stepSizeReductionFactor;
    agent.searchCounter = 0;
  }

  if (agent.searchCounter >= maxSearchAttempts)
  {
    agent.searchCounter = 0;
    agent.state = S_ABHA_Agent::stateNovice;
    return;
  }

  if (agent.cost > avgCost * 1.2)
  {
    agent.state = S_ABHA_Agent::stateSource;
    agent.pab = 1;
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのChangingStateForSourceメソッドは、食料源を開拓している間の蜂エージェントの行動を管理します。メソッドの一般的な構造:

1. 探索状態への移行

  • 現在のagent.cost値がavgCostを下回っている場合、現在の食料源は採算が取れていないことを示します。
  • 蜂は、食料源の近くに留まる確率(pab)を放棄率(abandonmentRate)だけ減少させます。つまり、現在の食料源の近くに留まる確率が減ります。
  • u.RNDprobabから得られるランダム値がagent.pabを超えた場合、蜂は探索状態(stateSearch)に入ることを決定します。
    • 確率はリセットされ、pab=0となります。
    • u.RNDfromCIを使用して各座標にランダムな値を生成することで、蜂は方向を変えます。
    •  initialStepSize初期ステップサイズが設定され、searchCounter探索カウンタが0にリセットされます。

3. 経験者状態への移動

  • agent.costの現在値がagent.bestCostの最良値を上回れば、これは現在の食糧供給源が有益であることを意味します。
    • この場合、蜂は経験者(stateExperienced)状態になり、さらに他の蜂に良い情報源の情報を伝えます。
    • 食料源近くに滞在する確率(pab)は1に設定されます。蜂は可能な限り高い確率で食料源の近くに留まります。
ChangingStateForSourceメソッドは、「食料源」蜂を管理します。このメソッドによって、蜂は現在の食料源の近くに留まり続けるか、それとも新しい食料源を探すかを決めることができます。このメソッドでは、現在値と最高の実績の両方を考慮します。
//——————————————————————————————————————————————————————————————————————————————
void C_AO_ABHA::ChangingStateForSource      (S_ABHA_Agent &agent)
{
  //Current cost  : If the current value is below the threshold, it may decide that the source is not good enough and start looking for a new one.
  //Previous value: The bee can use the previous value to compare and determine if the situation has improved. If the current value is worse, it may signal the need to change the strategy.
  //Best value    : A bee uses the best value to decide whether to continue exploiting the current food source or to look for a new, more profitable one.

  //Into Search. If the current food source turns out to be impractical (e.g. the current fitness value is worse than the threshold), a bee may switch to a search state to search for new sources.
  //Into Experienced. If a food source bee finds a food source that proves beneficial, it may enter the experienced state to pass on the information to other bees.

  if (agent.cost < avgCost)
  {
    agent.pab -= abandonmentRate;

    if (u.RNDprobab () > agent.pab)
    {
      agent.state = S_ABHA_Agent::stateSearch;
      agent.pab = 0;

      for (int c = 0; c < coords; c++)
      {
        agent.direction [c] = u.RNDfromCI (-(rangeMax [c] - rangeMin [c]), (rangeMax [c] - rangeMin [c]));
      }

      agent.stepSize      = initialStepSize;
      agent.searchCounter = 0;
    }
  }

  if (agent.cost > agent.bestCost)
  {
    agent.state = S_ABHA_Agent::stateExperienced;
    agent.pab = 1;
  }
}
//—————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのCalculateProbabilitiesメソッドは、各エージェント(蜂)の現在値に基づいて、異なる行動の確率を計算します。このメソッドは以下の手順を実行します。

1. 変数の初期化

  • maxCostは、エージェントコストがこの値より大きくなることを保証するために、可能な最小値に初期化されます。
  • minCostはエージェントのコストがこの値より小さくなるように、最大値に初期化されます。

2. 最大コストと最小コストの検索

  • このループはpopSize個体群に含まれるすべてのエージェント(蜂)を繰り返し処理します。
  • ループ内では、エージェントの現在値がmaxCostminCostと比較され、必要であればその値が更新されます。

3. 値域の計算

  • costRangeは最大値と最小値の差を表し、これによって確率を正規化することができます。

4. 各エージェントの確率を計算する

  • p_si :エージェントのコストに基づく確率。コストが高いほど確率は高くなります(範囲で正規化)。
  • p_srs :事前に指定されたランダムサーチ確率
  • p_rul :ダンスに従う確率。つまり、食料源にとどまる確率が高ければ高いほど、ダンスに従う確率は低くなります。
  • p_ab :エージェントのpabに等しい、食料源の近くに留まる確率

この後、3つの確率の合計が計算され、それぞれの確率の合計が1になるように正規化されます。これは、各確率を合計で割ることによっておこなわれます。

CalculateProbabilitiesメソッドにより、各蜂が現在のコストに基づいて、様々な行動(ランダムサーチ、ダンスを追う、食料源を探す)を実行する確率を見積もることができます。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_ABHA::CalculateProbabilities ()
{
  double maxCost = -DBL_MAX;
  double minCost =  DBL_MAX;

  for (int i = 0; i < popSize; i++)
  {
    if (agents [i].cost > maxCost) maxCost = agents [i].cost;
    if (agents [i].cost < minCost) minCost = agents [i].cost;
  }

  double costRange = maxCost - minCost;

  for (int i = 0; i < popSize; i++)
  {
    agents [i].p_si = (maxCost - agents [i].cost) / costRange;

    agents [i].p_srs = randomSearchProbability; // random search probability
    agents [i].p_rul = 1.0 - agents [i].pab;    // probability of following the dance
    agents [i].p_ab  = agents [i].pab;          // probability of staying near the source

    double sum = agents [i].p_srs + agents [i].p_rul + agents [i].p_ab;

    agents [i].p_srs /= sum;
    agents [i].p_rul /= sum;
    agents [i].p_ab  /= sum;
  }
}
//——————————————————————————————————————————————————————————————————————————————

C_AO_ABHAクラスのCalculateAverageCostメソッドは、集団内のすべての蜂エージェントの平均コストを計算するためのものです。この情報は、集団の状態を分析し、アルゴリズム内で決定を下すために必要です。平均コストはエージェントの成功の指標となり、さらなる計算にも使用されます。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_ABHA::CalculateAverageCost ()
{
  double totalCost = 0;

  for (int i = 0; i < popSize; i++)
  {
    totalCost += agents [i].cost;
  }

  avgCost = totalCost / popSize;
}
//———————


3. テスト結果

ABHAの結果

ABHA|Artificial Bee Hive Algorithm|10.0|10.0|0.1|0.1|0.99|0.5|
=============================
5 Hilly's; Func runs:10000; result:0.8413125195861497
25 Hilly's; Func runs:10000; result:0.5422730855489947
500 Hilly's; Func runs:10000; result:0.2630407626746883
=============================
5 Forest's; Func runs:10000; result:0.8785786358650522
25 Forest's; Func runs:10000; result:0.47779307049664316
500 Forest's; Func runs:10000; result:0.17181208858518054
=============================
5 Megacity's; Func runs:10000; result:0.5092307692307693
25 Megacity's; Func runs:10000; result:0.3387692307692307
500 Megacity's; Func runs:10000; result:0.1039692307692317
=============================
All score:4.12678 (45.85%)

コードを書き終え、ABHAの全コンポーネントの詳細な分析をおこないました。では、テスト関数を使ったアルゴリズムのテストに直接進み、その効率を評価しましょう。アルゴリズムの視覚化では、テスト結果にかなり強い広がりが見られます。

Hilly

Hillyテスト関数のABHA

Forest

Forestテスト関数のABHA

Megacity

Megacityテスト関数のABHA

調査の結果、このアルゴリズムは評価表の中間あたりに位置しています。

#
AO
詳細
Hilly
Hilly最終
Forest
Forest最終
Megacity(離散)
Megacity最終
最終結果
MAXの%
10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F) 10 p (5 F) 50 p (25 F) 1000 p (500 F)
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 コードロックアルゴリズム 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 (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
4 CTA 彗尾アルゴリズム 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
5 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
6 ESG 社会母集団の進化 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
7 SIA 等方的焼きなまし 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
8 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
9 TSEA 亀甲進化アルゴリズム 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
10 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
11 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
12 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
13 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
14 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
15 (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
16 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
17 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
18 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
19 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
20 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
21 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
22 アズボ 適応型社会行動最適化(ASBO) 0.76331 0.49253 0.32619 1.58202 0.79546 0.40035 0.26097 1.45677 0.26462 0.17169 0.18200 0.61831 3.657 40.63
23 MEC Mind Evolutionary Computation 0.69533 0.53376 0.32661 1.55569 0.72464 0.33036 0.07198 1.12698 0.52500 0.22000 0.04198 0.78698 3.470 38.55
24 IWO 侵入雑草最適化 0.72679 0.52256 0.33123 1.58058 0.70756 0.33955 0.07484 1.12196 0.42333 0.23067 0.04617 0.70017 3.403 37.81
25 Micro-AIS 微小人工免疫系 0.79547 0.51922 0.30861 1.62330 0.72956 0.36879 0.09398 1.19233 0.37667 0.15867 0.02802 0.56335 3.379 37.54
26 COAm カッコウ最適化アルゴリズムM 0.75820 0.48652 0.31369 1.55841 0.74054 0.28051 0.05599 1.07704 0.50500 0.17467 0.03380 0.71347 3.349 37.21
27 SDOm 螺旋ダイナミクス最適化M 0.74601 0.44623 0.29687 1.48912 0.70204 0.34678 0.10944 1.15826 0.42833 0.16767 0.03663 0.63263 3.280 36.44
28 NMm ネルダー=ミード法M 0.73807 0.50598 0.31342 1.55747 0.63674 0.28302 0.08221 1.00197 0.44667 0.18667 0.04028 0.67362 3.233 35.92
29 FAm ホタルアルゴリズムM 0.58634 0.47228 0.32276 1.38138 0.68467 0.37439 0.10908 1.16814 0.28667 0.16467 0.04722 0.49855 3.048 33.87
30 GSA 重力探索法 0.64757 0.49197 0.30062 1.44016 0.53962 0.36353 0.09945 1.00260 0.32667 0.12200 0.01917 0.46783 2.911 32.34
31 BFO 細菌採餌最適化 0.61171 0.43270 0.31318 1.35759 0.54410 0.21511 0.05676 0.81597 0.42167 0.13800 0.03195 0.59162 2.765 30.72
32 ABC 人工蜂コロニー 0.63377 0.42402 0.30892 1.36671 0.55103 0.21874 0.05623 0.82600 0.34000 0.14200 0.03102 0.51302 2.706 30.06
33 BA コウモリアルゴリズム 0.59761 0.45911 0.35242 1.40915 0.40321 0.19313 0.07175 0.66810 0.21000 0.10100 0.03517 0.34617 2.423 26.93
34 SA 焼きなまし 0.55787 0.42177 0.31549 1.29513 0.34998 0.15259 0.05023 0.55280 0.31167 0.10033 0.02883 0.44083 2.289 25.43
35 IWDm intelligent water drops M 0.54501 0.37897 0.30124 1.22522 0.46104 0.14704 0.04369 0.65177 0.25833 0.09700 0.02308 0.37842 2.255 25.06
36 PSO 粒子群最適化 0.59726 0.36923 0.29928 1.26577 0.37237 0.16324 0.07010 0.60572 0.25667 0.08000 0.02157 0.35823 2.230 24.77
37 ボイド ボイドアルゴリズム 0.43340 0.30581 0.25425 0.99346 0.35718 0.20160 0.15708 0.71586 0.27846 0.14277 0.09834 0.51957 2.229 24.77
38 MA モンキーアルゴリズム 0.59107 0.42681 0.31816 1.33604 0.31138 0.14069 0.06612 0.51819 0.22833 0.08567 0.02790 0.34190 2.196 24.40
39 SFL Shuffled Frog-Leaping 0.53925 0.35816 0.29809 1.19551 0.37141 0.11427 0.04051 0.52618 0.27167 0.08667 0.02402 0.38235 2.104 23.38
40 FSS 魚群検索 0.55669 0.39992 0.31172 1.26833 0.31009 0.11889 0.04569 0.47467 0.21167 0.07633 0.02488 0.31288 2.056 22.84
41 RND ランダム 0.52033 0.36068 0.30133 1.18234 0.31335 0.11787 0.04354 0.47476 0.25333 0.07933 0.02382 0.35648 2.014 22.37
42 GWO 灰色オオカミオプティマイザ 0.59169 0.36561 0.29595 1.25326 0.24499 0.09047 0.03612 0.37158 0.27667 0.08567 0.02170 0.38403 2.009 22.32
43 CSS 荷電系探索 0.44252 0.35454 0.35201 1.14907 0.24140 0.11345 0.06814 0.42299 0.18333 0.06300 0.02322 0.26955 1.842 20.46
44 EM 電磁気学的アルゴリズム 0.46250 0.34594 0.32285 1.13129 0.21245 0.09783 0.10057 0.41085 0.15667 0.06033 0.02712 0.24412 1.786 19.85


まとめ

ABHAアルゴリズムは、様々なテスト関数で広範囲にテストされ、その結果、他の群知能ベースのアルゴリズムと競合することが示されました。これらのテストで、ABHAはその効率性と信頼性を実証しました。

これらの研究は、従来の最適化問題だけでなく、多目的最適化や制約問題など、より複雑な問題を解くためのABHAアルゴリズムの可能性を浮き彫りにしています。 しかし、私はもっと素晴らしい結果を期待していました。ともあれ、ABHAの結果は、群アルゴリズムの中ではまさに他の追随を許しません。

一般的に、このアルゴリズムは、他の大多数の最適化アルゴリズムに適用可能な、特定の手法とテクニックのセットとして評価することができます。結果を再現し、異なる条件に適応する能力により、このアルゴリズムは計算最適化の分野で有望なツールとなります。このように、ABHAは最適化アルゴリズムの応用の幅を広げるだけでなく、人工知能分野の研究とその実用化に新たな可能性を開くものでもあります。

タブ

図1:関連するテストによるアルゴリズムのカラーグラデーション 0.99以上の結果 0.99以上は白で強調表示

チャート

図2:アルゴリズムのテスト結果のヒストグラム(0から100までのスケールで、多ければ多いほど良い、

ここで、100は理論的に可能な最大の結果であり、アーカイブにはレーティング表を計算するスクリプトが含まれている)


ABHAの長所と短所

長所

  1. 低次元問題で良好な結果
  2. 離散関数での良好な結果

短所

  1. 複雑なロジックとアルゴリズムの実装
  2. 滑らかな関数に関する高次元問題の低収束
  3. 多数の外部パラメータ

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

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

添付されたファイル |
ABHA.zip (30.1 KB)
取引におけるニューラルネットワーク:TEMPO法の実践結果 取引におけるニューラルネットワーク:TEMPO法の実践結果
TEMPO法について引き続き学習します。この記事では、実際の履歴データに対する提案されたアプローチの実際の有効性を評価します。
人工蜂の巣アルゴリズム(ABHA):理論と方法 人工蜂の巣アルゴリズム(ABHA):理論と方法
この記事では、2009年に開発された人工蜂の巣アルゴリズム(ABHA)について説明します。このアルゴリズムは、連続的な最適化問題を解決することを目的としています。この記事では、蜂がそれぞれの役割を担って効率的に資源を見つける蜂のコロニーの行動から、ABHAがどのようにインスピレーションを得ているかを探ります。
クライアント端末での取引戦略の例の分析 クライアント端末での取引戦略の例の分析
この記事では、ブロック図を使用して、端末のExperts\Free Robotsフォルダにあるローソク足ベースの訓練EAのロジックを調べます。
取引におけるニューラルネットワーク:時系列予測のための言語モデルの使用 取引におけるニューラルネットワーク:時系列予測のための言語モデルの使用
時系列予測モデルの研究を続けます。本記事では、事前訓練済みの言語モデルを活用した複雑なアルゴリズムについて説明します。