レストラン経営達人アルゴリズム(SRA)
内容
はじめに
私は常に、最適化問題と現実のシナリオとの類似性に魅了されてきました。メタヒューリスティックアルゴリズムの新しいアプローチを探求する中で、集団最適化とレストランビジネスの進化との間に類似点があることに気づき、このアイデアをもとに「レストラン経営達人アルゴリズム(SRA)」を考案しました。
レストランオーナーが常にメニューを改善し、レストランの人気を高め、新しい顧客を呼び込もうとしている姿を想像してみてください。人気のない料理を完全に排除するのではなく、オーナーはより微妙なアプローチを取ります。最も人気のない料理を特定し、最も成功している料理の要素と慎重に組み合わせます。時には控えめな変更を加え、時には大胆な新しい食材を取り入れます。目標は常に同じです。それは、最も弱い料理を、レストランの顧客にとって新たな人気メニューになり得るものに変えることです。
この料理の比喩がSRAの基礎を形成しています。従来の進化的アルゴリズムが低評価の解を完全に破棄するのとは異なり、SRAは弱い解を成功した要素と組み合わせて改善します。このアプローチにより、解空間の多様性を維持しながら、集団全体の質を着実に向上させることができます。
この記事では、SRAの基本的な仕組み、実装方法、そして「温度」や「料理の実験度」といったパラメータが探索と活用のバランスをどのように制御するかを解説します。また、SRAを他の有名なアルゴリズムと比較したベンチマーク結果も紹介します。
創造的な思考実験として始まったこのアイデアは、独自の特性を持つ有望なアプローチへと発展しました。レストランに着想を得たこのアルゴリズムが、独自の「味」を持つ最適化解をどのように提供するか、ぜひご覧ください。
アルゴリズムの実装
簡単な比喩を通して、アルゴリズムの仕組みを理解してみましょう。私がレストランのオーナーだと想像してください。私はさまざまな料理があるメニューを持っていますが、その中には非常に人気のある料理もあれば、ほとんど注文されない料理もあります。では、私はどうするでしょうか。人気のない料理をすぐにメニューから削除する(提供可能な料理のリストを減らす)わけではありません。代わりに、最も人気のない料理を取り上げて改善を試みます。どうやって? レストランのヒットメニューを見て、そこからアイデアや材料を借りるのです。たとえば、魚料理はあまり売れませんが、サラダはとても人気があります。成功しているサラダの要素(特別なドレッシングや盛り付け方法など)を魚料理に取り入れると、新しい料理が生まれます。
時には小さな変更を加え、時には大胆な実験を試みます。レストランを開店したばかりの頃は多くの実験をおこないましたが、いくつか本当に成功した料理が見つかると、材料の組み合わせや分量の微調整を始めました。時間が経つにつれ、メニュー上で最も弱い料理もどんどん改善されていきます。そして時には、以前は不人気だった料理が、少し手を加えるだけで新たな人気メニューになることもあります。このようにして、すべての料理が成功することで、レストラン全体の人気も高まるのです。
これが私のアルゴリズムの仕組みです。悪い解を捨てるのではなく、常に最良の解からアイデアを借りて改善していきます。そして時間が経つにつれて、実験の回数は減り、既に見つけた良いものをより精緻に調整していくのです。図1はアルゴリズムの動作図を示しています。

図1:SRAアルゴリズムの動作図
この図は「初期化(Initialization)」ブロックから始まり、ここで初期メニューが作成されます。その後、アルゴリズムのメインループに移ります。このループは、料理の品質順に並べられた、レストランの現在のメニューを中心に構成されています。メニューは、緑(最良の料理)から赤(最も劣る料理)へのカラーグラデーションで表現されています。以下に4つの順序付きステップがあります。まず、改善する料理を選びます。最悪の料理と、二次関数的な確率に従って選ばれる最良の「元の」料理を選びます。次に、レシピを組み合わせ、材料を変異させることで新しいバリエーションを作成します(温度が高いほど大胆な実験になります)。その後、新しい料理を評価し、適合度関数を計算します。最後に、温度を下げて実験の過激さを抑えます。左側の点線矢印は、このプロセスが収束するか停止条件を満たすまで繰り返されることを示しています。右側には記号が示されており、A(緑丸)は最良の料理、B(赤丸)は最も劣る料理です。図全体は、成功した料理の要素を使いながら、メニュー上の弱い料理を体系的に改善していくレストラン経営者のプロセスを視覚的に表しています。
SRAアルゴリズムの疑似コードの記述に移りましょう。
//初期化
popSizeエージェントの集団を作成する(メニュー項目)
各エージェントについて
指定範囲内で座標をランダム初期化する
初期温度を1.0に設定する
冷却比を0.98に設定する
料理の実験度を0.3に設定する
//アルゴリズムのメインループ
停止条件が満たされるまで
//ステップ1:全エージェントの評価
各エージェントについて
適応度関数の値を計算する
// 現在の集団と以前の集団を結合する
現在のエージェントと以前のエージェントから共通のメニューを作成する
適合度関数の値でメニューを最良から最悪までソートする
//ステップ2:新しい選択肢の創出
新しい集団内の各エージェントについて
// ソートされた集団の前半から最悪の要素を取得する
エージェントからインデックス(popSize-1)の座標をコピーする
// 改善と実験のどちらかを選択する
「ランダム値 < (1.0 - menuInnovationRate * temperature)」の場合
// 二次ルーレット法を使って「元の料理」を選択する
r = 0から1までのランダム値
r = r²
donorIndex = 0から(popSize-1)にスケーリングする
// 各座標について
各c座標について:
// 元の料理からの座標を0.8の確率で取得する
「ランダム値 < 0.8」の場合
current_agent.c = donor.c
// 適応的突然変異
mutationRate = 0.1 + 0.4 * temperature * (agent_index / popSize)
「ランダム値 < mutationRate」の場合
// 突然変異の種類を選択する
「ランダム値 < 0.5」の場合
current_agent.c = 正規分布(current_agent.c)
それ以外の場合:
current_agent.c = 範囲内のランダム値
// 値が許容範囲内であることを確認する
current_agent.c = 最も近い有効な値に丸める
それ以外の場合:
// 新しい「料理」を作成する
各c座標について:
「ランダム値 < 0.7」の場合
current_agent.c = 範囲内のランダム値
それ以外の場合:
current_agent.c = 正規分布(best_solution.c)
// 値が許容範囲内であることを確認する
current_agent.c = 最も近い有効な値に丸める
// エリート主義 - 時折、より良い解から要素を追加する
「ランダム値 < 0.1」の場合
numEliteCoords = 1から(coords * 0.3)までのランダム値
iが1からnumEliteCoordsまで
c = ランダム座標インデックス
current_agent.c = best_solution.c
//ステップ3:最良解を更新する
各エージェントについて
「agent.fitness > best_solution.fitness」の場合
best_solution = agent
//ステップ4:温度低下
temperature = temperature * cooling_ratio
temperature < 0.1の場合
temperature = 0.1
best_solutionを返す
では、アルゴリズムのコード作成に取りかかりましょう。C_AO メインクラスを継承し、SRA アルゴリズムを実装する C_AO_SRA クラスを作成します。詳しく見てみましょう。
コンストラクタとデストラクタ:パラメータpopSize、temperature、coolingRate、menuInnovationRateは、アルゴリズムの主な特性(エージェント数や探索制御パラメータなど)を決定します。
SetParamsメソッド:コンストラクタで事前に初期化されたパラメータを格納したparams配列の値に基づいて、クラスのパラメータを更新します。
Initメソッド:アルゴリズムを初期化するために使用されます。パラメータの最小値と最大値、ステップサイズ、およびエポック数を受け取り、探索タスクを実行する準備をおこないます。
MovingメソッドとRevisionメソッド:エージェントの状態の移動(または更新)に関連するアルゴリズムの主要ステージを実行するために設計されています。Revision はパラメータの修正や適応を担当します。
クラスメンバー
- temperature:探索制御およびアルゴリズムの温度チャートに関連する現在の温度
- coolingRate:温度がどのくらい早く下がるかを制御する冷却率
- menuInnovationRate:料理の実験度、エージェントが新しい解を探索する程度
- S_AO_Agent menu []:SRAアルゴリズムの文脈で「メニュー」を表すエージェントの配列
- S_AO_Agent menuT []:料理のオプションを一時的に保存するために使用されるエージェントの配列
//—————————————————————————————————————————————————————————————————————————————— class C_AO_SRA : public C_AO { public: //-------------------------------------------------------------------- ~C_AO_SRA () { } C_AO_SRA () { ao_name = "SRA"; ao_desc = "Successful Restaurateur Algorithm (joo)"; ao_link = "https://www.mql5.com/ja/articles/17380"; popSize = 50; // number of agents (size of the "menu") temperature = 1.0; // initial "temperature" for research control coolingRate = 0.98; // cooling rate menuInnovationRate = 0.3; // intensity of culinary experiments ArrayResize (params, 4); params [0].name = "popSize"; params [0].val = popSize; params [1].name = "temperature"; params [1].val = temperature; params [2].name = "coolingRate"; params [2].val = coolingRate; params [3].name = "menuInnovationRate"; params [3].val = menuInnovationRate; } void SetParams () { popSize = (int)params [0].val; temperature = params [1].val; coolingRate = params [2].val; menuInnovationRate = params [3].val; } bool Init (const double &rangeMinP [], // minimum values const double &rangeMaxP [], // maximum values const double &rangeStepP [], // step change const int epochsP = 0); // number of epochs void Moving (); void Revision (); //---------------------------------------------------------------------------- double temperature; // current "temperature" double coolingRate; // cooling rate double menuInnovationRate; // intensity of culinary experiments private: //------------------------------------------------------------------- S_AO_Agent menu []; S_AO_Agent menuT []; }; //——————————————————————————————————————————————————————————————————————————————
C_AO_SRAクラスのInitメソッドはアルゴリズムを初期化します。
初期化の確認: このメソッドは、範囲の最小値と最大値およびステップを使ってStandardInitを呼び出します。StandardInitが失敗した場合は、falseを返します。
配列の初期化
- menu配列とmenuT配列のサイズを、エージェントの数に応じて割り当てます。
- menu配列の各エージェントを初期化します。
温度のリセット:temperatureの初期値を1.0に設定します。
初期化の成功判定:初期化が成功した場合はtrueを返します。
//—————————————————————————————————————————————————————————————————————————————— //--- Initialization bool C_AO_SRA::Init (const double &rangeMinP [], const double &rangeMaxP [], const double &rangeStepP [], const int epochsP = 0) { if (!StandardInit (rangeMinP, rangeMaxP, rangeStepP)) return false; //---------------------------------------------------------------------------- ArrayResize (menu, popSize * 2); ArrayResize (menuT, popSize * 2); for (int p = 0; p < popSize * 2; p++) menu [p].Init (coords); temperature = 1.0; // reset temperature during initialization return true; } //——————————————————————————————————————————————————————————————————————————————
C_AO_SRAクラスのMovingメソッドはアルゴリズムの主なステップを実装します。これには、エージェントの初期化と、突然変異および新しい解の作成によるエージェントの適応という2つの主要な部分があります。
初期化(revisionがfalseの場合)- 各エージェントは、ステップ(rangeStep)を使用して、指定された範囲(rangeMin~rangeMax)内のランダムな値で初期化されます。値はエージェントごとにcとcBに保存されます。
- revisionがtrueに設定され、メソッドが終了します。
温度低下:温度に冷却率(coolingRate)を掛けて、さらなる変化の可能性に影響します。
エージェントのメインループ:各エージェントごとに、ソートされた集団の最初の半分(menu配列から)から最悪の要素が選択されます。
行動の分類:温度に依存する一定の確率で、エージェントは次のいずれかを実行します。
- 現在の解を修正し(最良の料理の「元の料理のレシピ」を使用)、さまざまな確率で突然変異を適用する
- 新しい解(ランダム値)を作成する
エリート主義:ある程度の確率で、見つかった最良解の要素を新しい解に追加できます。
//—————————————————————————————————————————————————————————————————————————————— //--- The main step of the algorithm void C_AO_SRA::Moving () { //---------------------------------------------------------------------------- // Initial initialization if (!revision) { for (int p = 0; p < popSize; p++) { for (int c = 0; c < coords; c++) { a [p].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]); a [p].c [c] = u.SeInDiSp (a [p].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); a [p].cB [c] = a [p].c [c]; } } revision = true; return; } //---------------------------------------------------------------------------- // Lower the temperature temperature *= coolingRate; // Main loop on population agents for (int p = 0; p < popSize; p++) { // Take the worst element from the first half of the sorted population (with index popSize-1) // Remember that items are sorted from best to worst in the menu ArrayCopy (a [p].c, menu [popSize - 1].c, 0, 0, WHOLE_ARRAY); // Decide whether to create a hybrid or experiment with a new "dish" // The probability of an experiment depends on the temperature - there are more experiments at the beginning if (u.RNDprobab () < (1.0 - menuInnovationRate * temperature)) { // Select a "donor-recipe" with a probability proportional to the success of the dish double r = u.RNDprobab (); r = pow (r, 2); // Increased preference for better dishes int menuIND = (int)u.Scale (r, 0, 1.0, 0, popSize - 1); // The best ones are at the beginning of the array // For each coordinate for (int c = 0; c < coords; c++) { // Take the parameter from a successful dish with the probability depending on the temperature if (u.RNDprobab () < 0.8) { a [p].c [c] = menu [menuIND].c [c]; } // Mutation with adaptive probability - the further from the best solution and the higher the temperature, the more mutations double mutationRate = 0.1 + 0.4 * temperature * (double)(p) / popSize; if (u.RNDprobab () < mutationRate) { // Combination of different types of mutations if (u.RNDprobab () < 0.5) a [p].c [c] = u.GaussDistribution (a [p].c [c], rangeMin [c], rangeMax [c], 2); else a [p].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]); // Sometimes a completely new value // Make sure the value is within acceptable limits a [p].c [c] = u.SeInDiSp (a [p].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); } } } else // Create a completely new "dish" { for (int c = 0; c < coords; c++) { // Variation 1: Completely random value if (u.RNDprobab () < 0.7) { a [p].c [c] = u.RNDfromCI (rangeMin [c], rangeMax [c]); } // Variation 2: based on the best solution found with a large deviation else { a [p].c [c] = u.GaussDistribution (cB [c], rangeMin [c], rangeMax [c], 1); } a [p].c [c] = u.SeInDiSp (a [p].c [c], rangeMin [c], rangeMax [c], rangeStep [c]); } } // Sometimes we add elements from the best solution directly (elitism) if (u.RNDprobab () < 0.1) { int numEliteCoords = u.RNDintInRange (1, coords / 3); // Take from 1 to 30% of the coordinates for (int i = 0; i < numEliteCoords; i++) { int c = u.RNDminusOne (coords); a [p].c [c] = cB [c]; // Take the value from the best solution } } } } //——————————————————————————————————————————————————————————————————————————————
C_AO_SRAクラスのRevisionメソッドは、見つかった最良解を更新し、アルゴリズム操作中に解の全体的な「メニュー」を管理する役割を担います。
最適エージェントの検索:現在の集団内のすべてのエージェントを反復処理し、最適な適応関数(f)を持つエージェントを検索します。新しい最適エージェントが見つかった場合は、fB値とbestINDインデックスを更新します。
最良解の更新:最適エージェントが見つかった場合(つまりbestINDが-1と等しくない場合)、その決定パラメータ(c)が現在の最適な決定を表すcB変数にコピーされます。
一般的な「メニュー」の更新:すべてのエージェントの現在のパラメータを一般的な「メニュー」に追加し、完了した実験を保存できるようになります。
メニューのソート:menu配列を適応度関数によって最良解から最悪解の順にソートし、最良解が前半にくるようにします。これはアルゴリズムの次の反復で使用されます。
温度制御:温度が0.1を下回らないように温度の下限閾値を設定し、温度が急速に収束するのを防ぎます。//—————————————————————————————————————————————————————————————————————————————— //--- Update the best solution taking into account greedy selection and the probability of making worse decisions void C_AO_SRA::Revision () { int bestIND = -1; // Find the best agent in the current population for (int p = 0; p < popSize; p++) { if (a [p].f > fB) { fB = a [p].f; bestIND = p; } } // If we find a better solution, update cB if (bestIND != -1) ArrayCopy (cB, a [bestIND].c, 0, 0, WHOLE_ARRAY); // Add the current set of dishes to the general "menu" for (int p = 0; p < popSize; p++) { menu [popSize + p] = a [p]; } // Sort the entire "menu" from best to worst solutions // After sorting, the first half of the menu will contain the best solutions, // which will be used in the next iteration u.Sorting (menu, menuT, popSize * 2); // Prevent the temperature from falling below a certain threshold if (temperature < 0.1) temperature = 0.1; } //——————————————————————————————————————————————————————————————————————————————
テスト結果
ここで、SRAアルゴリズムがどのように機能するかを見てみましょう。テスト結果は以下の通りです。
SRA|Successful Restaurateur Algorithm|50.0|1.0|0.98|0.3|
=============================
5 Hilly's; Func runs:10000; result:0.9688326305968623
25 Hilly's; Func runs:10000; result:0.6345483084017249
500 Hilly's; Func runs:10000; result:0.292167027537253
=============================
5 Forest's; Func runs:10000; result:0.946368863880973
25 Forest's; Func runs:10000; result:0.5550607959254661
500 Forest's; Func runs:10000; result:0.19124225531141872
=============================
5 Megacity's; Func runs:10000; result:0.7492307692307693
25 Megacity's; Func runs:10000; result:0.4403076923076923
500 Megacity's; Func runs:10000; result:0.12526153846153956
=============================
All score:4.90302 (54.48%)
SRAアルゴリズムの動作をテストスタンド上で可視化することで、探索戦略の特徴的な性質について結論を導くことができます。この場合、探索空間の広範な探索が観察されます。エージェントは空間全体に均等に分布し、その最も遠隔な領域に至るまで探索しています。同時に、局所的極値付近での顕著な集団化は見られず、エージェントの動きは混沌としているように見えます。
一方で、このアルゴリズムは探索能力に優れているものの、解の洗練(改良)に関してはいくつかの課題を示しており、それは比較的低い収束精度として表れています。また、テスト結果のばらつきが小さい点も指摘しておく必要があります。

Hillyテスト関数のSRA

Forestテスト関数のSRA

テスト結果に基づくと、このアルゴリズムは集団ベース最適化アルゴリズムのランキング表で第20位に位置しています。現在、表には新しいSRAアルゴリズムを含む9つの独自の最適化アルゴリズム(joo)が示されています。
| # | 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 | レストラン経営達人アルゴリズム(SRA) | 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 | 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 |
| 30 | 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 |
| 31 | 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 |
| 32 | 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 |
| 33 | 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 |
| 34 | 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 |
| 35 | 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 |
| 36 | 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 |
| 37 | 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 |
| 38 | 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 |
| 39 | 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 |
| 40 | 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 |
| 41 | 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 |
| 42 | ASHA | 人工シャワーアルゴリズム | 0.89686 | 0.40433 | 0.25617 | 1.55737 | 0.80360 | 0.35526 | 0.19160 | 1.35046 | 0.47692 | 0.18123 | 0.09774 | 0.75589 | 3.664 | 40.71 |
| 43 | ASBO | 適応型社会行動最適化(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 |
| 44 | 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 |
| 45 | CSA | 円探索アルゴリズム | 0.66560 | 0.45317 | 0.29126 | 1.41003 | 0.68797 | 0.41397 | 0.20525 | 1.30719 | 0.37538 | 0.23631 | 0.10646 | 0.71815 | 3.435 | 38.17 |
| RW | ランダムウォーク | 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 | |
まとめ
レストラン経営達人アルゴリズム(SRA)を開発し、検証を行った結果、本アルゴリズムは有効であることが確認できました。現在、ランキング表では20位に位置しており、新しいコンセプトとしては十分に良好な結果であると言えます。結果を分析する中で、その挙動にいくつかの特徴が見られました。低次元問題では結果にばらつきが生じており、特に離散型のMegacity関数においてその傾向が顕著です。この関数はアルゴリズムにとって非常に難易度が高く、局所的極値に陥ることが例外ではなく、むしろ一般的です。
高次元問題においては、SRAは期待よりもやや弱い結果を示しています。これは、高次元空間では最悪解を改良する戦略において、温度および冷却率のパラメータをより精密に調整する必要があるためだと考えられます。
しかしながら、SRAは今後の改良の可能性を十分に備えた、堅実なアルゴリズムであると考えています。料理という比喩を用いることで、アルゴリズムの理解が容易になるだけでなく、直感的な修正、適応的突然変異メカニズムの洗練、さらには「元の料理」を選択するさまざまな方式を試す可能性も開かれています。
このアルゴリズムの開発において、私は既存の最適化手法に対する優位性を追求することよりも、現実世界の独創的なメタファーを通じて新たな概念的地平を示すことを重視しました。本研究の結果は、このアプローチがメタヒューリスティックアルゴリズムのエコシステムにおいて、一席を占める価値があることを明確に示しています。
集団内で最も劣った解に注目し、それを実験の基盤とするという発想は、一見すると奇抜に思われるかもしれませんが、予想以上に有効であることが証明されました。この「アウトサイダーの再生」という原理こそが、最適化における驚くべき可能性を引き出しています。熟練したレストラン経営者が不人気な料理を将来の看板メニューへと変えるように、このアルゴリズムは優れた解の要素を取り入れながら、弱い解をより良い解へと変換します。
この経験は、科学研究における重要な教訓を裏付けています。すなわち、どれほど型破りなアイデアであっても、適切に実装されれば実用的な価値を生み出し得るということです。非従来型のアプローチは、伝統的な手法では見落とされがちな問題の側面を明らかにすることがよくあります。

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

図3:アルゴリズムテスト結果のヒストグラム(0から100のスケール、高いほど良い)100は理論上の最大値であり、アーカイブには評価表を計算するためのスクリプトがあります。
SRAの長所と短所
長所
- 実装がシンプル
- 結果は上々
短所
- 重大な欠点はなし
この記事には、最新版のアルゴリズムコードを含むアーカイブが添付されています。記事の著者は、正規アルゴリズムの説明の絶対的な正確さについて責任を負いません。検索機能を向上させるために、それらの多くに変更が加えられています。記事に示された結論と判断は、実験結果に基づいています。
記事で使用されているプログラム
| # | 名前 | 種類 | 詳細 |
|---|---|---|---|
| 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_SRA.mq5 | スクリプト | SRAテストスタンド |
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/17380
警告: これらの資料についてのすべての権利はMetaQuotes Ltd.が保有しています。これらの資料の全部または一部の複製や再プリントは禁じられています。
この記事はサイトのユーザーによって執筆されたものであり、著者の個人的な見解を反映しています。MetaQuotes Ltdは、提示された情報の正確性や、記載されているソリューション、戦略、または推奨事項の使用によって生じたいかなる結果についても責任を負いません。
PythonでリモートFXリスク管理システムを構築する
FX裁定取引:合成マーケットメーカーボット入門
ニューロボイド最適化アルゴリズム(NOA)
MQL5でのテーブルモデルの実装:MVC概念の適用
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索