コンピュータサイエンスとオペレーションズリサーチにおいて、ミツバチアルゴリズムは、 2005 年に Pham、Ghanbarzadeh らによって開発された集団ベースの探索アルゴリズムです。 [ 1 ]これは、ミツバチのコロニーの採餌行動を模倣しています。基本バージョンでは、アルゴリズムは一種の近傍探索とグローバル探索を組み合わせたもので、組み合わせ最適化と連続最適化の両方に使用できます。ミツバチアルゴリズムを適用するための唯一の条件は、解間の距離の尺度が定義されていることです。ミツバチアルゴリズムの有効性と特定の能力は、多くの研究で証明されています。[ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
ミツバチのコロニーは、複数の食料源(花畑)から蜜や花粉を採取するために、14 kmを超える長距離[ 7 ]に同時に複数の方向に広がることができます。コロニーのごく一部は、常に新しい花畑を探して周囲を探索しています。これらの偵察蜂は、巣の周囲の領域をランダムに移動し、遭遇した食料源の収益性(正味エネルギー収量)を評価します。[ 7 ]偵察蜂は巣に戻ると、採取した食料を巣に運びます。収益性の高い食料源を見つけた個体は、巣の中の「ダンスフロア」と呼ばれる場所に行き、ワグルダンスと呼ばれる儀式を行います。[ 8 ] ワグルダンスを通して、偵察蜂は発見した場所を、花畑の利用に加わる暇な傍観者に伝えます。ダンスの長さは偵察蜂による食料源の評価に比例するため、評価の高い花畑を採取するために、より多くの採餌蜂が動員されます。ダンスの後、偵察蜂は発見した食料源に戻り、さらに食料を集めます。有益であると評価される限り、豊富な食料源は偵察蜂が巣に戻ったときに宣伝されます。勧誘された採餌蜂も尻振りダンスをすることがあり、報酬の高い花畑への勧誘が増加します。この自己触媒的なプロセスのおかげで、ミツバチのコロニーは採餌活動の焦点を最も有益な花畑に素早く切り替えることができます。[ 7 ]
ミツバチアルゴリズム[ 2 ] [ 9 ]は、ミツバチの採餌戦略を模倣して、最適化問題の最適な解を探します。各候補解は食料源(花)とみなされ、n個のエージェント(ミツバチ)からなる集団(コロニー)が解空間を探索します。人工のミツバチが花を訪れる(解に着地する)たびに、その収益性(適応度)を評価します。
ミツバチアルゴリズムは、初期化手順と、指定された回数T回、または許容可能な適合度を持つ解が見つかるまで繰り返されるメイン探索サイクルから構成されます。各探索サイクルは、リクルート、ローカル探索、近傍縮小、サイト放棄、グローバル探索の5つの手順からなります。
標準蜂アルゴリズムの擬似コード[ 2 ] i = 1, ..., ns の場合 1 i スカウト[i] = Initialise_scout() ii flower_patch[i] = Initialise_flower_patch(scout[i]) 2. 停止条件がTRUEになるまで繰り返す i 採用() ii i = 1, ..., na の場合 1 flower_patch[i] = Local_search(flower_patch[i]) 2 flower_patch[i] = Site_abandonment(flower_patch[i]) 3 flower_patch[i] = Neighbourhood_shrinking(flower_patch[i]) iii i = nb, ..., ns の場合 1 flower_patch[i] = Global_search(flower_patch[i])}
初期化ルーチンでは、ns個の偵察蜂が探索空間にランダムに配置され、着地した場所で解の適合度を評価します。各解に対して、近傍(フラワーパッチと呼ばれる)が区切られます。
採用プロセスにおいて、nb ≤ ns 個の最も適した解(最良の場所)を訪れたスカウトは、ワグルダンスを行います。つまり、最も有望な解の周辺をさらに探索するために採餌者を募集します。ne ≤ nb 個の最良の解(エリートの場所)を見つけたスカウトはそれぞれnre個の採餌者を募集し、残りのnb - ne 個のスカウトはそれぞれnrb ≤ nre 個の採餌者を募集します。したがって、募集される採餌者の数は、食料源の収益性に依存します。
局所探索手順では、採用された採餌者は、偵察者が訪れた解を囲む花のパッチ内にランダムに散らばります(局所的探索)。花のパッチ内の採餌者のいずれかが、偵察者が訪れた解よりも高い適応度を持つ解に到達した場合、その採餌者が新しい偵察者になります。採餌者がより高い適応度を持つ解を見つけられなかった場合、花のパッチのサイズが縮小されます(近傍縮小手順)。通常、花のパッチは最初は広い領域に定義され、近傍縮小手順によって徐々にサイズが縮小されます。その結果、局所探索の範囲は、局所的な適応度が最適となる領域に徐々に集中していきます。所定の探索サイクル数の間、特定の花のパッチで適応度の改善が記録されない場合、適応度の局所最大値が見つかったとみなされ、パッチは放棄され(サイト放棄)、新しい偵察者がランダムに生成されます。
生物学的な蜂のコロニーと同様に、[ 7 ]少数の偵察蜂がソリューション空間を探索し続け、適応度の高い新しい領域を探します(グローバル探索)。グローバル探索手順では、最後のns - nbの花のパッチをランダムに生成されたソリューションで再初期化します。
1回の探索サイクルの終わりに、偵察蜂の個体群は再びns匹の偵察蜂で構成されます。nr匹の偵察蜂は局所探索手順によって生成され(その一部はサイト放棄手順によって再初期化されている可能性があります)、ns匹- nb匹の偵察蜂は全体探索手順によって生成されます。人工蜂コロニーの総サイズはn = ne • nre + ( nb - ne ) • nrb + ns (エリートサイトの採餌蜂 + 残りのベストサイトの採餌蜂 + 偵察蜂)匹です。
基本的な蜂のアルゴリズム[ 9 ]に加えて、BAの改良版やハイブリッド版がいくつかあり、それぞれが基本的なBAのいくつかの欠点に焦点を当てています。これらのバリアントには、ファジーまたは拡張BA(EBA)[ 10 ] 、グループ化BA(GBA)[ 5 ] 、ハイブリッド修正BA(MBA)[ 11 ]などが含まれます(ただし、これらに限定されません)。グループ化BA(GBA)[ 5 ]の擬似MATLABコードは次のとおりです。
function GBA %% 問題のパラメータを設定しますmaxIteration = ..; % 反復回数 (例: 1000-5000) maxParameters = ..; % 入力変数の数min = [..] ; % 各入力パラメータの最小値を示す、maxParameters サイズの配列max = [..] ; % 各入力パラメータの最大値を示す、maxParameters サイズの配列%% グループ化された蜂のアルゴリズム (GBA) のパラメータを設定しますR_ngh = ..; % 最初のグループの蜂を探索する近傍のパッチ半径 (例: 0.001 - 1) n = ..; % 偵察蜂の数 (例: 4 - 30) nGroups = ..; % ランダムグループを除くグループ数%% GBA の自動パラメータ設定k = 3 * n / (( nGroups + 1 ) ^ 3 - 1 ); % GBA の各グループの偵察蜂の数を設定するパラメータgroups = zeros ( 1 , nGroups ); % 各グループの偵察蜂の数を保持する配列recruited_bees = zeros ( 1 , nGroups ); % 各グループの採用蜂の数を保持する配列a = ((( max - min ) ./ 2 ) - R_ngh ) ./ ( nGroups ^ 2 - 1 ); % 近隣半径を設定する GBA のパラメータb = R_ngh - a ; % 近隣半径を設定する GBA のパラメータfor i = 1 : nGroups % 各グループについてgroups ( i ) = floor ( k * i ^ 2 ); % 各グループの偵察蜂の数を決定します。if groups ( i ) == 0 groups ( i ) = 1 ; % 各グループに少なくとも 1 匹の偵察蜂が必要ですend recruited_bees = ( nGroups + 1 - i ) ^ 2 ; % 各グループの採用蜂の数を設定します。ngh ( i ) = a * i * i + b ; % 各グループの半径パッチを設定しますend group_random = n - sum ( groups ); % 残りの蜂 (存在する場合) をランダム検索に割り当てますgroup_random = max ( group_random , 0 ); % 負の数にならないようにします%% 個体群行列を初期化しますpopulation = zeros ( n , maxParameters + 1 ); % すべての入力変数とその適合度を含む n 匹の蜂の個体群for i = 1 : n population ( i , 1 : maxParameters )= generate_random_solution ( maxParameters , min , max ); % maxParameters 変数を max と min の間でランダムに初期化しますpopulation ( i , maxParameters + 1 ) = evalulate_fitness ( population ( i ,:)); % 各解の適合度を評価し、個体群行列の最後のインデックスに保存しますendsorted_population = sortrows ( population ); % 個体群を適応度に基づいてソートする%% グループ化された蜂のアルゴリズムの反復for i = 1 : maxIteration % GBA のメイン ループbeeIndex = 0 ; % すべての蜂 (つまり、パッチ) を追跡for g = 1 : nGroups % 偵察蜂の各グループについてfor j = 1 : groups ( g ) % 各グループ内の各パッチを利用beeIndex = beeIndex + 1 ; % 各パッチごとにカウンタを増やすfor i = 1 : recruited_bees ( g ) % グループの採用された蜂ごとにsolution = bee_waggle_dance ( sorted_population ( beeIndex , 1 : maxParameters ), ngh ( g )); % 選択されたパッチ / ソリューションの周囲の ngh の半径内で近隣を探索fit = evaluate_fitness ( solution ); % 最近見つかった解の適合度を評価します。fit < sorted_population ( beeIndex , maxParameters + 1 )の場合% 最小化問題: 採用蜂によってより良い場所/パッチ/解が見つかった場合sorted_population ( beeIndex , 1 : maxParameters + 1 ) = [ solution ( 1 : maxParameters ), fit ]; % 新しい解とその適合度をソートされた個体群行列にコピーしますend end end endfor i = 1 : group_random % 残りのランダムな蜂についてbeeIndex = beeIndex + 1 ; solution ( beeIndex , 1 : maxParameters )= generate_random_solution ( maxParameters , min , max ); % beeIndex のインデックスで新しいランダムな解を生成 solution ( beeIndex , maxParameters + 1 )= evaluate_fitness ( solution ); % その適合度を評価sorted_population ( beeIndex ,:) = [ solution ( 1 : maxParameters ), fit ]; % 新しいランダムな解とその適合度をソートされた個体群行列にコピーendsorted_population = sortrows ( sorted_population ); % 適応度に基づいて個体群をソートしますBest_solution_sofar = sorted_population ( 1 ,:);disp ( 'Best:' ); disp ( Best_solution_sofar ); % 現在の反復における最良の解を表示end % GBAのメインループの終了end % メイン関数の終了%% 関数 Bee Waggle Dance function new_solution = bee_waggle_dance ( solution, ngh, maxParameters ) new_solution ( 1 : maxParameters ) = ( solution - ngh ) + ( 2 * ngh .* rand ( 1 , maxParameters )); end