English Русский 中文 Español Deutsch Português
preview
レストラン経営達人アルゴリズム(SRA)

レストラン経営達人アルゴリズム(SRA)

MetaTrader 5テスター |
31 0
Andrey Dik
Andrey Dik

内容

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


はじめに

私は常に、最適化問題と現実のシナリオとの類似性に魅了されてきました。メタヒューリスティックアルゴリズムの新しいアプローチを探求する中で、集団最適化とレストランビジネスの進化との間に類似点があることに気づき、このアイデアをもとに「レストラン経営達人アルゴリズム(SRA)」を考案しました。

レストランオーナーが常にメニューを改善し、レストランの人気を高め、新しい顧客を呼び込もうとしている姿を想像してみてください。人気のない料理を完全に排除するのではなく、オーナーはより微妙なアプローチを取ります。最も人気のない料理を特定し、最も成功している料理の要素と慎重に組み合わせます。時には控えめな変更を加え、時には大胆な新しい食材を取り入れます。目標は常に同じです。それは、最も弱い料理を、レストランの顧客にとって新たな人気メニューになり得るものに変えることです。

この料理の比喩がSRAの基礎を形成しています。従来の進化的アルゴリズムが低評価の解を完全に破棄するのとは異なり、SRAは弱い解を成功した要素と組み合わせて改善します。このアプローチにより、解空間の多様性を維持しながら、集団全体の質を着実に向上させることができます。

この記事では、SRAの基本的な仕組み、実装方法、そして「温度」や「料理の実験度」といったパラメータが探索と活用のバランスをどのように制御するかを解説します。また、SRAを他の有名なアルゴリズムと比較したベンチマーク結果も紹介します。

創造的な思考実験として始まったこのアイデアは、独自の特性を持つ有望なアプローチへと発展しました。レストランに着想を得たこのアルゴリズムが、独自の「味」を持つ最適化解をどのように提供するか、ぜひご覧ください。


アルゴリズムの実装

簡単な比喩を通して、アルゴリズムの仕組みを理解してみましょう。私がレストランのオーナーだと想像してください。私はさまざまな料理があるメニューを持っていますが、その中には非常に人気のある料理もあれば、ほとんど注文されない料理もあります。では、私はどうするでしょうか。人気のない料理をすぐにメニューから削除する(提供可能な料理のリストを減らす)わけではありません。代わりに、最も人気のない料理を取り上げて改善を試みます。どうやって? レストランのヒットメニューを見て、そこからアイデアや材料を借りるのです。たとえば、魚料理はあまり売れませんが、サラダはとても人気があります。成功しているサラダの要素(特別なドレッシングや盛り付け方法など)を魚料理に取り入れると、新しい料理が生まれます。

時には小さな変更を加え、時には大胆な実験を試みます。レストランを開店したばかりの頃は多くの実験をおこないましたが、いくつか本当に成功した料理が見つかると、材料の組み合わせや分量の微調整を始めました。時間が経つにつれ、メニュー上で最も弱い料理もどんどん改善されていきます。そして時には、以前は不人気だった料理が、少し手を加えるだけで新たな人気メニューになることもあります。このようにして、すべての料理が成功することで、レストラン全体の人気も高まるのです。

これが私のアルゴリズムの仕組みです。悪い解を捨てるのではなく、常に最良の解からアイデアを借りて改善していきます。そして時間が経つにつれて、実験の回数は減り、既に見つけた良いものをより精緻に調整していくのです。図1はアルゴリズムの動作図を示しています。

SRAアルゴリズムフロー

図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:料理の実験度、エージェントが新しい解を探索する程度
クラスのprivateメンバー
  • 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

Hillyテスト関数のSRA

Forest

Forestテスト関数のSRA

Megacity

Megacityテスト関数の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は今後の改良の可能性を十分に備えた、堅実なアルゴリズムであると考えています。料理という比喩を用いることで、アルゴリズムの理解が容易になるだけでなく、直感的な修正、適応的突然変異メカニズムの洗練、さらには「元の料理」を選択するさまざまな方式を試す可能性も開かれています。

このアルゴリズムの開発において、私は既存の最適化手法に対する優位性を追求することよりも、現実世界の独創的なメタファーを通じて新たな概念的地平を示すことを重視しました。本研究の結果は、このアプローチがメタヒューリスティックアルゴリズムのエコシステムにおいて、一席を占める価値があることを明確に示しています。

集団内で最も劣った解に注目し、それを実験の基盤とするという発想は、一見すると奇抜に思われるかもしれませんが、予想以上に有効であることが証明されました。この「アウトサイダーの再生」という原理こそが、最適化における驚くべき可能性を引き出しています。熟練したレストラン経営者が不人気な料理を将来の看板メニューへと変えるように、このアルゴリズムは優れた解の要素を取り入れながら、弱い解をより良い解へと変換します。

この経験は、科学研究における重要な教訓を裏付けています。すなわち、どれほど型破りなアイデアであっても、適切に実装されれば実用的な価値を生み出し得るということです。非従来型のアプローチは、伝統的な手法では見落とされがちな問題の側面を明らかにすることがよくあります。

Tab

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

チャート

図3:アルゴリズムテスト結果のヒストグラム(0から100のスケール、高いほど良い)100は理論上の最大値であり、アーカイブには評価表を計算するためのスクリプトがあります。

SRAの長所と短所

長所

  1. 実装がシンプル
  2. 結果は上々

短所

  1. 重大な欠点はなし

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


記事で使用されているプログラム

# 名前 種類 詳細
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

添付されたファイル |
SRA.zip (173.8 KB)
PythonでリモートFXリスク管理システムを構築する PythonでリモートFXリスク管理システムを構築する
Pythonで動作するリモートの外国為替リスク管理システムを構築しており、サーバーにも段階的に展開しています。本記事を通して、プログラムでFXのリスクを管理する方法や、FXの資金を無駄にしない方法を学んでいきます。
FX裁定取引:合成マーケットメーカーボット入門 FX裁定取引:合成マーケットメーカーボット入門
今日は私の最初の裁定取引ロボット、つまり合成資産向けの流動性プロバイダー(と言えるかどうかは微妙ですが)を見ていきます。現在、このボットは大規模な機械学習システムのモジュールとして実運用で使われていますが、クラウドから古いFX裁定取引ロボットを引っ張り出してきたので、これを確認し、現代でどのように活用できるか考えてみたいと思います。
ニューロボイド最適化アルゴリズム(NOA) ニューロボイド最適化アルゴリズム(NOA)
新しい生体模倣型最適化メタヒューリスティックであるNOA (Neuroboids Optimization Algorithm)は、集合知とニューラルネットワークの原理を組み合わせた手法です。従来の方法とは異なり、このアルゴリズムは自己学習型の「ニューロボイド」集団を使用し、それぞれが独自のニューラルネットワークを持ち、探索戦略をリアルタイムで適応させます。本記事では、アルゴリズムのアーキテクチャ、エージェントの自己学習メカニズム、そしてこのハイブリッドアプローチを複雑な最適化問題に応用する可能性について解説します。
MQL5でのテーブルモデルの実装:MVC概念の適用 MQL5でのテーブルモデルの実装:MVC概念の適用
本記事では、MQL5におけるテーブルモデルの開発過程を、MVC (Model-View-Controller)アーキテクチャパターンを用いて解説します。データロジック、表示、制御を分離することで、構造化され柔軟かつ拡張可能なコードを実現します。テーブルモデルを構築するためのクラス設計や、データ格納のためのリンクリストの使用方法も取り上げます。