English Русский 中文 Español Deutsch Português
preview
母集団最適化アルゴリズム:細菌採餌最適化(BFO)

母集団最適化アルゴリズム:細菌採餌最適化(BFO)

MetaTrader 5 | 27 3月 2023, 09:32
195 0
Andrey Dik
Andrey Dik

内容

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


1.はじめに

細菌採餌最適化(Bacterial Foraging Optimization、BFO)アルゴリズムは、非常に複雑または不可能な数値関数の最大化/最小化問題の近似解を見つけるために使用できる魅力的な最適化手法です。このアルゴリズムは、分散最適化および制御のための大域的最適化アルゴリズムとして広く認識されています。BFOは、大腸菌の社会的採餌行動に触発されています。BFOは、いくつかの適応分野で発生する現実世界の最適化問題を解決する際の有効性について、すでに研究者の注目を集めています。大腸菌の採餌戦略の背後にある生物学は、独自の方法でエミュレートされ、単純な最適化アルゴリズムとして使用されます。

大腸菌やサルモネラ菌などの細菌は、地球上で最も成功している生物の1つです。これらの機敏な細菌は、鞭毛と呼ばれる半硬質の付属物を持ち、それを使ってねじり運動で自分自身を推進します。すべての鞭毛が反時計回りに回転すると、プロペラ効果が生じ、細菌は多かれ少なかれ直線的な方向に移動します。この場合、細菌は遊泳と呼ばれる動きをします。すべての鞭毛は同じ方向に回転します。

鞭毛は、エシェリヒア属大腸菌が回転または遊泳(採餌中に細菌がおこなう2つの主な動作)するのを助けます。鞭毛を時計回りに回転させると、各鞭毛が細胞を押します。鞭毛が異なる方向に回転すると、細菌は回転します。細菌は、好ましい環境ではあまり回転せずに移動しますが、有害な環境では、栄養勾配を見つけるために頻繁に回転します。鞭毛の反時計回りの動きは、細菌が非常に高速で遊泳するのに役立ちます。

上記のアルゴリズムでは、細菌の行動は細菌の走化性と呼ばれるメカニズムによって決定されます。これは、環境内の化学的刺激に対するこれらの微生物の運動反応です。このメカニズムにより、細菌は誘引物質(ほとんどの場合、栄養素)に向かって移動し、忌避物質(細菌にとって潜在的に有害な物質)から離れることができます。誘引物質と忌避物質を検出する受容体は、細菌の極にあります。

細菌のサイズが小さいため、極間の有用物質と有害物質の濃度の違いを捉えることができません。細菌は、移動中の濃度の変化を測定することにより、これらの物質の勾配を決定します。この動きの速度は、毎秒数十細菌の長さに達する可能性があります。たとえば、大腸菌は通常、1秒間にその長さの10~20倍の速度で移動します。


親のクローン

図1:複製:元の細菌(動きベクトルの保存)とクローン細菌(動きベクトルの変更)への分割、
回転:細菌の動きのベクトルの変化

細菌が選んだ移動方向が誘引物質の濃度の増加(忌避物質の濃度の減少)に対応している場合、次の回転までの時間が長くなります。細菌のサイズが小さいため、その動きはブラウン運動の影響を強く受けます。その結果、細菌は平均して、有益な物質に近づき、有害な物質から遠ざかる方向にのみ移動します。

考えられる細菌の動きのメカニズムは唯一のものではありません。一部の細菌は鞭毛を1つ持っています。この場合の細菌の動きのバリアントには、その回転と停止のさまざまなモードがあります。ただし、すべての場合において、細菌が正しい方向に移動すると、そのような移動の期間が長くなります。したがって、一般に、細菌の走化性は、遊泳と回転の複雑な組み合わせとして定義できます。これにより、細菌は高濃度の栄養素の場所にとどまり、許容できない濃度の有害物質を回避できます。

検索エンジンの最適化問題の文脈では、細菌の走化性は、細菌による既知の食物資源の使用を最適化し、潜在的により価値のある新しい領域を探索するためのメカニズムとして解釈することもできます。十分な量の細菌の集団は、複雑な時空間構造を形成することができます。これは、細菌集団における構造形成の効果です。この効果は、走化性と他の多くの理由の両方によって引き起こされる可能性があります。

一部の細菌では、そのような構造の形成は、それらの代謝産物の調節特性によって説明されます。同様の効果は、磁気走性(磁場に対する感受性)、生物対流、負の走性(重力方向に対する微生物の優先的な動き)およびその他の現象に基づいて可能です。原則として、細菌は友好的な環境でより長い距離を移動します。十分な食物を得ると、細菌は長くなり、適切な温度が与えられると、真ん中で壊れて、自身の正確なレプリカに変わります。

この現象は、PassinoがBFOに増殖イベントを導入するのに影響を与えました。環境の急激な変化や攻撃により、走化性プロセスが中断され、細菌群が別の場所に移動する可能性があります。これは、領域内のすべての細菌が死ぬか、細菌のグループが環境の新しい部分に分散するときに、実際の細菌集団での除去と分散イベントを表します。さらに、考えられている走化性と増殖の手順は、一般に、多極値目的関数の大域的最大値を見つけるには不十分です。これは、これらの手順では、細菌が見つけたこの関数の局所的最大値を離れることを許可しないためです。除去と分散の手順は、この欠点を克服するように設計されています。自然淘汰(適者生存)により、適応度の低い細菌は破壊され、適応度の高い細菌は自己増殖します。


2.アルゴリズムの説明

BFOの標準バージョンには、次の主要な手順が含まれます。

  1. 細菌コロニーの初期化
  2. 走化性
  3. 群れ
  4. 増殖
  5. 粛清と削除

      
1.パラメータを初期化します。
細菌は、いくつかの半固体栄養素の中で複雑で安定した時空間パターンを形成することができ、最初に中心に一緒に置かれた環境で生き残ることができます.。さらに、特定の条件下では、細胞間誘引シグナルを分泌して、クラスター化して互いを保護します。
2.走化性
食物を探す細菌の動きの特徴は、2つの方法で決定できます。つまり、遊泳と回転は共に走化性として知られています。細菌は、正しい方向に動くと「遊泳」する、環境が悪化する方向に動くと「回転」すると言われています。


3.群れ
細菌が最も食物の豊富な場所にたどり着くためには、最適な細菌が、検索期間のある時点まで、他の細菌を引き付けて、目的の場所により早く収束するようにすることが望ましいです。.これをおこなうには、最適な細菌からこの検索期間までの各細菌の相対距離に基づいて、元のコスト関数にペナルティ関数が追加されます。最後に、すべての細菌が決定点に結合されると、このペナルティ関数はゼロになります。群れの効果は、細菌が群れに集まり、高密度の群れで同心円状のパターンで移動することです.。


4.増殖
いくつかの走化性段階を通過した細菌の初期セットは、増殖段階に達します。ここで、細菌の最良のセットは2つのグループに分けられます。より健康な半分は、食物を見つける能力が低いために破壊される細菌の残りの半分に置き換えられます。これにより、進化の過程で細菌の個体数が一定になります。


5.排除と分散
進化の過程で、予期せぬ突然の出来事が発生する可能性があります。これにより、スムーズな進化のプロセスが劇的に変化し、多くの細菌が排除されたり、新しい環境に分散したりします。皮肉なことに、一連の細菌の正常な走化性増殖を妨害する代わりに、この未知のイベントは、より新しい細菌のセットを食物がある場所の近くに配置する可能性があります.広い視野から見ると、排除と分散は長距離にわたる個体群の行動の一部です。これを最適化に適用すると、このような並列検索アルゴリズムでよく見られる停滞を軽減するのに役立ちます。

私のBFOの実装は、標準バージョンとは少し異なります。コードの特定のセクションを検討するときは、これらの変更が必要な理由に加えて、違いについて詳しく説明します。一般に、実装の変更は重要であるとは見なされないため、アルゴリズムの名前に「m」(変更されたバージョン)マーカーを割り当てません。実装された変更により結果が改善されたことにのみ言及します。

次に、実装したアルゴリズムとコードについて考えてみましょう。

アルゴリズムの手順:

1.細菌コロニーの初期化
2.細菌の健康状態(適応)の測定
3.複製?
3.1.はい ->レプリケーションの実行
3.2.いいえ -> p.4
4.古い(寿命に達した)?
4.1.はい ->回転を実行(移動ベクトルを変更)
4.2.いいえ ->p.5
5.正しい方向に進んでいる?
5.1.はい ->同じベクトルで移動を続ける
5.2.いいえ ->回転を実行(移動ベクトルを変更)
6.細菌の健康状態(適応度)を測定する
7.停止基準が満たされるまで、p.3から続行する

アルゴリズムの論理スキームを図1に示します。


スキーム

図2:BFOアルゴリズムの論理ブロック図

コードを見てみましょう。

細菌を説明する最良の方法は、座標と動きベクトルの配列を含む構造体です。細菌の現在および以前のヘルス値とライフカウンター。本質的に、ライフカウンターは、寿命に達すると細菌が破壊され、検索空間のランダムな場所に新しい細菌が作成される元のバージョンとは異なり、一方向への連続移動の量を制限するために必要です。ただし、このトピックについては以前の記事で既に触れているため、ランダムな場所に新しいエージェントを作成しても実用的な意味はなく、検索機能が低下するだけです。この場合、最適な解の場所に新しいエージェントを作成するか、現在の場所から移動を続けますが、方向ベクトルを変更することをお勧めします。2番目のオプションは、より良い結果を示しました。

標準バージョンでは、一定の動きベクトルが使用されます。命の数が多いと、これは検索空間内の直線に沿った細菌の移動につながります。この線が極値をうまく通過しない場合、この直線運動のプロセスは無限に発生しますが、ここではカウンターが強制回転の役割を果たし、細菌が生涯にわたって直線運動を回避できるようにします。勾配を持たない領域を持つ関数では、最終的には適合度を改善し始めることができる場所につながります。

//——————————————————————————————————————————————————————————————————————————————
struct S_Bacteria
{
  double c  [];   //coordinates
  double v  [];   //vector
  double f;       //current health
  double fLast;   //previous health
  double lifeCNT; //life counter
};
//——————————————————————————————————————————————————————————————————————————————

BFOアルゴリズムクラスをC_AO_BFOとして宣言しましょう。このクラスには、細菌コロニーの宣言、探索空間の境界、最適解の値、最適解の座標の配列が含まれています。また、アルゴリズムパラメータの定数値を宣言します。

//——————————————————————————————————————————————————————————————————————————————
class C_AO_BFO
{
  //----------------------------------------------------------------------------
  public: S_Bacteria b     []; //bacteria
  public: double rangeMax  []; //maximum search range
  public: double rangeMin  []; //manimum search range
  public: double rangeStep []; //step search
  public: double cB        []; //best coordinates
  public: double fB;           //FF of the best coordinates

  public: void Init (const int    paramsP,         //number of opt. parameters
                     const int    populationSizeP, //population size
                     const double lambdaP,         //lambda
                     const double reproductionP,   //probability of reproduction
                     const int    lifeCounterP);   //life counter

  public: void Swimming   ();
  public: void Evaluation ();

  //----------------------------------------------------------------------------
  private: double NewVector (int paramInd);
  private: S_Bacteria bT []; //bacteria
  private: double v      [];
  private: int    ind    [];
  private: double val    [];
  private: int    populationSize; //population size
  private: int    parameters;     //number of optimized parameters
  private: double lambda;         //lambda
  private: double reproduction;   //probability of reproduction
  private: int    lifeCounter;    //life counter
  private: bool   evaluation;

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

publicInit()メソッドは、定数変数の初期化、配列サイズの分配、フラグと最適解の値のリセットを目的としています。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BFO::Init (const int    paramsP,         //number of opt. parameters
                     const int    populationSizeP, //population size
                     const double lambdaP,         //lambda
                     const double reproductionP,   //probability of reproduction
                     const int    lifeCounterP)    //life counter
{
  fB = -DBL_MAX;
  evaluation = false;

  parameters      = paramsP;
  populationSize  = populationSizeP;
  lambda          = lambdaP;
  reproduction    = reproductionP;
  lifeCounter     = lifeCounterP;

  ArrayResize (rangeMax,  parameters);
  ArrayResize (rangeMin,  parameters);
  ArrayResize (rangeStep, parameters);
  ArrayResize (v,         parameters);

  ArrayResize (ind,       populationSize);
  ArrayResize (val,       populationSize);

  ArrayResize (b,  populationSize);
  ArrayResize (bT, populationSize);

  for (int i = 0; i < populationSize; i++)
  {
    ArrayResize (b [i].c,  parameters);
    ArrayResize (b [i].v,  parameters);
    b [i].f  = -DBL_MAX;
    b [i].fLast = -DBL_MAX;

    ArrayResize (bT [i].c,  parameters);
    ArrayResize (bT [i].v,  parameters);
  }

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

各反復で呼び出す必要がある最初のpublicメソッドのSwimming()(細菌の遊泳)には、アルゴリズムの主要なロジックがすべて含まれています。

void C_AO_BFO::Swimming ()
{}

このメソッドを詳しく考えてみましょう。最初の反復で、評価フラグが「false」に設定されている場合、検索空間全体に細菌を一様分布でランダムに分散させます。この段階では、現在の健康状態(適応度)と以前の健康状態は不明です。DBL_MAX値を対応する変数に割り当てましょう。ランダムに取得された座標が境界を超えていないかを確認し、最適化されたパラメータを変更するステップを適用します。この反復では、NewVector()privateメソッドを使用して、各細菌に個別の変位ベクトルを設定する必要があります(以下で検討)。すべての細菌は、その変化の条件が満たされるまで、同じ個々のベクトルで一様に前方に一直線に遊泳します。

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

  for (int s = 0; s < populationSize; s++)
  {
    for (int k = 0; k < parameters; k++)
    {
      b [s].c [k] = RNDfromCI (rangeMin [k], rangeMax [k]);
      b [s].c [k] = SeInDiSp (b [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);

      v [k] = rangeMax [k] - rangeMin [k];

      b [s].v [k] = NewVector (k);

      b [s].f  = -DBL_MAX;
      b [s].fLast = -DBL_MAX;

      b [s].lifeCNT = 0;
    }
  }

  evaluation = true;
}

2回目以降の反復では、寿命に達すると、遊泳、回転、複製、細菌の破壊の操作が実行されます。ロジックの最初の部分は、(パラメータで指定された確率で)増殖の操作です。これは、前の反復で細菌コロニーが健康値の降順で並び替えられたことを意味します。

アルゴリズムでの増殖は重要な機能を実行します。細菌コロニーの「遺伝子プール」を改善することにより、アルゴリズムの収束が加速します。この操作は、細菌を2つの部分に仮想的に分割するものであり、コロニーの最初の、より良い半分だけが分割されます。コロニーの前半は半分になり、元の親バージョンはコロニーの後半に配置されます。親細菌は、そのクローンとは対照的に、同じベクターで動き続けます。クローンはコロニー内のその場所に残り、新しい移動ベクトルが割り当てられます。親とそのクローンは、分割が発生した空間内の点から移動を続けます。

r = RNDfromCI (0.0, 1.0);

//==========================================================================
if (r < reproduction)
{
  int st = populationSize / 2;
  for (int s = 0; s < st; s++)
  {
    //bacterium original--------------------------------------------------
    for (int k = 0; k < parameters; k++)
    {
      b [st + s].v [k] = b [s].v [k];
      b [st + s].c [k] = b [s].c [k] + b [s].v [k];
      b [st + s].c [k] = SeInDiSp (b [st + s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
      b [st + s].fLast = b [s].f;
      b [st + s].lifeCNT++;
    }

    //bacterium clone-------------------------------------------------------
    for (int k = 0; k < parameters; k++)
    {
      b [s].v [k] = NewVector (k);
      b [s].c [k] = b [s].c [k] + b [s].v [k];
      b [s].c [k] = SeInDiSp (b [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
      b [s].fLast = b [s].f;
      b [s].lifeCNT = 0;
    }
  }
}

複製の可能性が実装されていない場合は、細菌が寿命に達したかどうかの確認が実行されます。アルゴリズムの標準バージョンでは、「古い」細菌を破壊し、その代わりに、細菌のリスト内の検索空間内のランダムな場所に新しい細菌を作成する必要があります。一般的なケースでは、増殖と走化性の操作は、多極値適応度関数の最大値を見つけるのに十分ではありません。
これらの手順では、細菌が見つけた極小値を離れることはできません。粛清の手順は、この欠点を克服するように設計されています。ただし、このアルゴリズムや他のアルゴリズムを使用した実験で示されているように、この場合は単純に動きベクトルを変更する方が効率的です。ライフカウンターがリセットされます。カウンターは、一定歩数(ライフ)経過後に移動方向を変えるトリガーです。複製と排除の結果としての細菌の総数は一定のままです。

if (b [s].lifeCNT >= lifeCounter)
{
  for (int k = 0; k < parameters; k++)
  {
    b [s].v [k] = NewVector (k);
    b [s].c [k] = b [s].c [k] + b [s].v [k];
    b [s].c [k] = SeInDiSp (b [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
    b [s].fLast = b [s].f;
    b [s].lifeCNT = 0;
  }
}

寿命が尽きていない場合は、細菌が適応度関数の勾配を改善する方向に動いているかどうかを確認します。つまり、現在の反復と前の反復の2つの健康状態値をチェックします。健康状態が改善した場合、動きベクトルは保持されます。そうでない場合、細菌は回転を実行します(動きベクトルを変更)。

標準バージョンでは、現在の健康状態が以前の健康状態より厳密に「より大きい」ことが確認されますが、私のバージョンでは「より大きいか等しい」が適用されます。研究対象の表面で、適応度関数の勾配がない場合、細菌は1か所で際限なく回転します(健康状態に変化はなく、遊泳に方向がないことを意味します)。この段階で、受信した新しい座標の出力が検索空間の境界を超えているかどうかも確認する必要があります。

else
{
  if (b [s].f >= b [s].fLast)
  {
    for (int k = 0; k < parameters; k++)
    {
      b [s].c [k] = b [s].c [k] + b [s].v [k];
      b [s].c [k] = SeInDiSp (b [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
      b [s].fLast = b [s].f;
      b [s].lifeCNT++;
    }
  }
  else
  {
    for (int k = 0; k < parameters; k++)
    {
      b [s].v [k] = NewVector (k);
      b [s].c [k] = b [s].c [k] + b [s].v [k];
      b [s].c [k] = SeInDiSp (b [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
      b [s].fLast = b [s].f;
      b [s].lifeCNT++;
    }
  }
}

NewVecror()は、動きベクトル(回転)を変更するためのprivateメソッドです。メソッドは座標ごとに適用されます。ここでの考え方は単純です。対応する座標vの検索境界の差に[-1.0;1.0]の範囲の乱数rを掛け、λスケールファクター(アルゴリズムパラメータの1つ)を掛けます。細菌は、寿命が尽きるまで(新しい移動ベクトルを持つ新しい細菌が同じ場所に作成される)、複製中(クローンが新しいベクトルを持つ)、および健康状態の悪化中(新しいより好ましい環境を見つけようとする)、移動ベクトルを変更せずに使用します。 

//——————————————————————————————————————————————————————————————————————————————
double C_AO_BFO::NewVector (int paramInd)
{
  double r = RNDfromCI (-1.0, 1.0);
  return lambda * v [paramInd] * r;
}
//——————————————————————————————————————————————————————————————————————————————

各反復で実行する必要がある2番目のpublic Evaluation()メソッドは、並び替えメソッドを呼び出し、並び替えられたコロニー内の最良の細菌の健康状態を最適な解と比較して、大域的な解の更新を確認します。

//——————————————————————————————————————————————————————————————————————————————
void C_AO_BFO::Evaluation ()
{
  Sorting ();

  if (b [0].f > fB)
  {
    fB = b [0].f;
    ArrayCopy (cB, b [0].c, 0, 0, WHOLE_ARRAY);
  }
}
//——————————————————————————————————————————————————————————————————————————————


3.テスト結果

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

2023.01.21 12:52:46.501    Test_AO_BFO (.US500Cash,M1)    C_AO_BFO:50;0.01;0.8;100
2023.01.21 12:52:46.501    Test_AO_BFO (.US500Cash,M1)    =============================
2023.01.21 12:52:48.451    Test_AO_BFO (.US500Cash,M1)    5 Rastrigin's; Func runs 10000 result:72.94540549092933
2023.01.21 12:52:48.451    Test_AO_BFO (.US500Cash,M1)    Score:0.90383
2023.01.21 12:52:51.778    Test_AO_BFO (.US500Cash,M1)    25 Rastrigin's; Func runs 10000 result:54.75744312933767
2023.01.21 12:52:51.778    Test_AO_BFO (.US500Cash,M1)    Score:0.67848
2023.01.21 12:53:21.197    Test_AO_BFO (.US500Cash,M1)    500 Rastrigin's; Func runs 10000 result:40.668487609790404
2023.01.21 12:53:21.197    Test_AO_BFO (.US500Cash,M1)    Score:0.50391
2023.01.21 12:53:21.197    Test_AO_BFO (.US500Cash,M1)    =============================
2023.01.21 12:53:23.211    Test_AO_BFO (.US500Cash,M1)    5 Forest's; Func runs 10000 result:0.8569098398505888
2023.01.21 12:53:23.211    Test_AO_BFO (.US500Cash,M1)    Score:0.48471
2023.01.21 12:53:26.878    Test_AO_BFO (.US500Cash,M1)    25 Forest's; Func runs 10000 result:0.37618151461180294
2023.01.21 12:53:26.878    Test_AO_BFO (.US500Cash,M1)    Score:0.21279
2023.01.21 12:54:22.339    Test_AO_BFO (.US500Cash,M1)    500 Forest's; Func runs 10000 result:0.08748190028975696
2023.01.21 12:54:22.339    Test_AO_BFO (.US500Cash,M1)    Score:0.04948
2023.01.21 12:54:22.339    Test_AO_BFO (.US500Cash,M1)    =============================
2023.01.21 12:54:28.849    Test_AO_BFO (.US500Cash,M1)    5 Megacity's; Func runs 10000 result:4.8
2023.01.21 12:54:28.849    Test_AO_BFO (.US500Cash,M1)    Score:0.40000
2023.01.21 12:54:40.089    Test_AO_BFO (.US500Cash,M1)    25 Megacity's; Func runs 10000 result:2.216
2023.01.21 12:54:40.089    Test_AO_BFO (.US500Cash,M1)    Score:0.18467
2023.01.21 12:55:24.640    Test_AO_BFO (.US500Cash,M1)    500 Megacity's; Func runs 10000 result:0.4232
2023.01.21 12:55:24.640    Test_AO_BFO (.US500Cash,M1)    Score:0.03527

明確な結論を出すのは時期尚早です。最初に、他のテスト参加者との関係で結果を分析する必要があります。

rastrigin

  Rastriginテスト関数のBFO

forest

Forestテスト関数のBFO

megacity

Megacityテスト関数のBFO

テストの視覚化に注目しましょう。アニメーションで、アルゴリズムで「より大きい」記号を「より大きいか等しい」に置き換えるという決定の正しさが確認されました。これにより、細菌はテスト関数の水平セクションで移動し続けることができました。これは、ForestおよびMegacity関数で特に顕著です。細菌は、機能勾配がまったくない場所でも移動しようとします。アルゴリズムにはサブコロニーを形成するための論理的な方法は含まれていませんが、細菌コロニーがいくつかの別個のコロニーに分割され、視覚的に別個の局所極値に分割される能力に注意する必要があります。これは、明確に肯定的な特徴と見なすことができます。一般に、検索空間内の細菌の均一な動きは、どの方向にも急激なジャンプを試みなくても目立ちます。これは、均一な増分運動-走化性によって説明されます。

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)

IWO

侵入雑草最適化

1.00000

1.00000

0.33519

2.33519

0.79937

0.46349

0.41071

1.67357

0.75912

0.44903

0.94088

2.14903

100.000

ACOm

蟻コロニー最適化M

0.36118

0.26810

0.17991

0.80919

1.00000

1.00000

1.00000

3.00000

1.00000

1.00000

0.10959

2.10959

95.996

COAm

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

0.96423

0.69756

0.28892

1.95071

0.64504

0.34034

0.21362

1.19900

0.67153

0.34273

0.45422

1.46848

74.204

FAm

ホタルアルゴリズムM

0.62430

0.50653

0.18102

1.31185

0.55408

0.42299

0.64360

1.62067

0.21167

0.28416

1.00000

1.49583

71.024

BA

コウモリアルゴリズム

0.42290

0.95047

1.00000

2.37337

0.17768

0.17477

0.33595

0.68840

0.15329

0.07158

0.46287

0.68774

59.650

ABC

人工蜂コロニー

0.81573

0.48767

0.22588

1.52928

0.58850

0.21455

0.17249

0.97554

0.47444

0.26681

0.35941

1.10066

57.237

BFO

細菌採餌の最適化

0.70129

0.46155

0.11627

1.27911

0.41251

0.26623

0.26695

0.94569

0.42336

0.34491

0.50973

1.27800

55.516

FSS

魚群検索

0.48850

0.37769

0.11006

0.97625

0.07806

0.05013

0.08423

0.21242

0.00000

0.01084

0.18998

0.20082

20.109

PSO

粒子群最適化

0.21339

0.12224

0.05966

0.39529

0.15345

0.10486

0.28099

0.53930

0.08028

0.02385

0.00000

0.10413

14.232

RND

ランダム

0.17559

0.14524

0.07011

0.39094

0.08623

0.04810

0.06094

0.19527

0.00000

0.00000

0.08904

0.08904

8.142

GWO

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

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

0.00000

0.18977

0.04119

0.01802

0.24898

1.000


テスト結果を分析する時が来ました。BFOは評価表の中央に位置し、現在参加しているアルゴリズムのリストでは総合スコアが55をわずかに上回っています。結果は印象的ではありませんが、悪くもありません。特に、10変数のRastrigin関数で良い結果が得られました。変数が50個と1000個の場合、結果は著しく悪化します。また、アルゴリズムはForest関数ではうまく機能しませんでした。Megacity離散関数の比較的良好な動作は驚くべきことです。なぜなら、アルゴリズムにはそのような関数を処理するためのメカニズムがないからです。さらに、他のアルゴリズムと比較して優れたスケーラビリティがあります(1000 Megacityパラメータでテスト)。

BFOは幅広い可能性を秘めた科学分野です。最適化のパフォーマンスを向上させるためにモデル化できる一般的な細菌採餌および動物採餌の多くの側面があります。BFOアルゴリズムの場合、多くのパラメータがあり、パフォーマンスが向上する可能性があるため、制御パラメータの自動適応が特に重要になる可能性があります。これが追加の実験の理由です。

BFOには、初期化中およびパラメータの選択中の座標の初期値に対する感度の低さ、優れた信頼性、ロジックの単純さ、実装の容易さ、並列化および大域的検索の可能性など、多くの利点があります。したがって、BFOアルゴリズムは、さまざまな最適化問題を解決するために使用されます。ただし、BFOには、収束が遅い、場合によっては局所的な最適値を超えることができない、固定されたステップ長など、多くの欠点もあります。BFOはメタヒューリスティックです。つまり、アルゴリズムの変更を開発するために使用できる単なる概念的なフレームワークです。ここで紹介したBFOのバージョンは、多くの可能性のうちの1つにすぎず、このトピックに関する締めくくりではなく、実験の出発点と見なされるべきです。

アルゴリズムのテスト結果のヒストグラムを以下に示します。

チャート

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

細菌採餌最適化(BFO)アルゴリズムの特性に関する結論は、次の通りです。

賛成:
1.高速
2.シンプルなロジック
3.低速ではあるが、すべての反復を通じて収束する

反対:
1.収束が遅い
2.極値を終了する方法がない


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

添付されたファイル |
データサイエンスと機械学習(第11回):単純ベイズ、取引における確率論 データサイエンスと機械学習(第11回):単純ベイズ、取引における確率論
確率を利用した取引は綱渡りのようなもので、正確さとバランス、そしてリスクに対する鋭い理解が必要です。取引の世界では、確率がすべてです。確率は、成功と失敗、利益と損失の違いになります。確率の力を活用することで、トレーダーは十分な情報に基づいた意思決定をおこない、リスクを効果的に管理し、経済的目標を達成することができます。つまり、経験豊富な投資家であれ、初心者のトレーダーであれ、確率を理解することは、取引の可能性を引き出す鍵になるのです。この記事では、確率を利用したエキサイティングな取引の世界を探求し、取引ゲームを次のレベルに引き上げる方法を紹介します。
Murrayシステム再訪問 Murrayシステム再訪問
グラフィカルな価格分析システムは、当然ながらトレーダーの間で人気があります。今回は、有名なレベルを含む完全なMurray(マレー)システム、および現在の価格ポジションを評価し、取引を決定するための有用な他のテクニックについて説明します。
ニューラルネットワークが簡単に(第33部):分散型Q学習における分位点回帰 ニューラルネットワークが簡単に(第33部):分散型Q学習における分位点回帰
分散型Q学習の研究を続けます。今日は、この方法を反対側から見てみましょう。価格予測問題を解決するために、分位点回帰を利用する可能性を検討します。
エキスパートアドバイザー(EA)の選び方:取引ボットを却下するための20の強力な基準 エキスパートアドバイザー(EA)の選び方:取引ボットを却下するための20の強力な基準
この記事では、「どうやって正しいエキスパートアドバイザーを選べばいいのか」という問いに答えようと思います。ポートフォリオに最適なのはどれでしょうか。また、市場で入手できる大規模な取引ボットリストをどのようにフィルタリングすればいいのでしょうか。この記事では、エキスパートアドバイザーを却下するための20の明確で強力な基準を紹介します。それぞれの基準が提示され、よく説明されているので、より持続的な判断ができ、より収益性の高いエキスパートアドバイザーを集めることができるようになります。