記事「母集団最適化アルゴリズム:社会集団の進化(ESG)」についてのディスカッション - ページ 2

 
Andrey Dik #:
GetMicrosecondCountの値が繰り返し実行されたときに、頑張って値を繰り返せるかどうかは疑問だ。もちろん、個々のテストがマイクロ秒より長ければの話だが。
2024.02.03 16:11:25.824 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:25.873 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:25.873 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:25.873 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:36.957 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:37.007 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:37.007 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:37.007 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.218 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:11:47.267 AmountCycles = 5000, Repeats = 1
2024.02.03 16:11:47.267 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:11:47.267 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.104 OPTIMIZATION_METHOD_AO_BGA
2024.02.03 16:12:49.152 AmountCycles = 5000, Repeats = 1
2024.02.03 16:12:49.152 BestResult = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999
2024.02.03 16:12:49.152 Check = 0.9999285571886549: X1 = -1.48, Y1 = 0.6299999999999999, X2 = -1.48, Y2 = 0.6299999999999999, X3 = -1.48, Y3 = 0.6299999999999999

左側はスクリプトの実行時間の列である。

 
fxsaber #:

左側はスクリプトの開始時間の列である。


99.99%は選択したステップで達成できる最大値で、私が理解する限り、BGAの設定で小数点以下2桁の精度が選択されている。
つまり、これはgccの初期化が同じであることの結果ではなく、設定されたタスク内で理論上可能な収束が完全に行われた結果である。
各テストで最初に作成された染色体を印刷すれば、異なる染色体であることが確認できます。異なる(ランダムな)初期状態で同じ解を見つけることができるのです。
 
アルゴがローカルにはまりにくいかどうかをテストする方法を思いついた。
最初の反復では、すべてのエージェントをフィールド全体にランダムに配置するのではなく、グローバル・ミニマムに配置する必要がある。課題は大域的な最大値を見つけることだ。きっと多くのアルゴはこのように穴に留まるだろう。
これは非常に人工的なケースだが、興味深い結論がある。
 
Andrey Dik #:
ロケールにはまりにくいアルゴのテストが頭に浮かんだ。
最初の反復では、すべてのエージェントをフィールド全体にランダムに配置するのではなく、グローバル・ミニマムに配置する必要がある。課題は大域的な最大値を見つけることだ。きっと多くのアルゴが穴に残るだろう。
これは非常に人工的なケースだが、興味深い結論がある。

ある時点で集団全体が縮退集団となる。これは母集団における多様性の減少の影響のテストでもあり、アルゴリズムはこのようなボトルネックから抜け出すことができるはずだ。

以上、思いつきで書いてみました。

 
Andrey Dik #:
最初の反復では、すべてのエージェントをフィールド全体にランダムに配置するのではなく、大域的な最小値に配置する必要がある。課題は大域的な最大値を見つけることである。

  1. 通常、大域的最大値を探索する。
  2. 次に、見つかった点(MaxTmp)から起動して、大域的な最小値を見つける。
  3. 次に、発見された点(MinTmp)から開始して、グローバル最大値を見つける。
  4. ステップ2に進む。

ステップ2-3では、大域的極小値/極大値からの距離を測定します(MaxGlobal - MaxTmp + MinTmp - MinGlobal)。この平均が最適化アルゴリズムの評価1となります。

(MaxTmp[i]-MinTmp[i])の和の平均を取ることが、最適化アルゴリズムの評価2となります。


現在、ある点からアルゴリズムを実行できる関数はありません。

 
fxsaber #:

  1. グローバル最大値を検索して通常起動。
  2. 次に、見つかった点(MaxTmp)から開始し、大域的な最小値を探索する。
  3. 次に見つかった点(MinTmp)から開始し、グローバル最大値を探索する。
  4. ステップ 2 に進む。

ステップ2-3では、大域的極小値/極大値からの距離を測定します(MaxGlobal - MaxTmp + MinTmp - MinGlobal)。この平均が最適化アルゴリズムの評価1となります。

最適化アルゴリズムの合計(MaxTmp[i]-MinTmp[i]) - rating2 の平均をとります。


このようにできます)))

Сейчас нет функции, позволяющей запускать алгоритм из точки.

最初のエポックでFFが計測される前に、エージェントの座標を任意の値で "強制的に "初期化することができます。エージェントのフィールドは公開されます。もちろん、フィールドの安全性を確保するための通常のアプローチとは矛盾するが、いずれにせよ自分の足を撃ちたい人は方法を見つけるだろうから、アルゴリズムを使う利便性は保たれる。

また、HCSの初期化の問題は解決されたのでしょうか?

 
Andrey Dik #:

99.99%は選択したピッチで達成できる最大値で、私が理解する限り、BGAの設定で選択できる精度は小数点以下2桁です。
つまり、これはgccの初期化が同じであることの結果ではなく、設定されたタスク内で理論的に可能な収束が完全に行われた結果なのです。
各テストで最初に作成された染色体を印刷すれば、異なる染色体であることがわかります。異なる(ランダムな)初期状態でも同じ解を見つけることができるのです。

その通りです!

void OnStart()
{
  Print(GetMicrosecondCount());
}
2024.02.04 15:31:28.422 2142
2024.02.04 15:31:40.553 2367
2024.02.04 15:31:42.385 2326
 
Andrey Dik #:

最初のエポックでFFが測定される前に、エージェントの座標を任意の値で "強制的に "初期化することが可能である。

2つのアルゴリズムの例を示してください。

 
fxsaber #:

2つのアルゴリズムの例を示してください。

エポックのメインループに、エージェントの座標を関数のグローバルミニマムの座標で上書きするコードを挿入する:

for (int epochCNT = 1; epochCNT <= epochCount && !IsStopped (); epochCNT++)
    {
      AO.Moving ();
      
      //---挿入されたコード--挿入されたコード--挿入されたコード--挿入者
      if (epochCNT == 1)
      {
        for (int set = 0; set < ArraySize (AO.a); set++)
        {
          for (int i = 0; i < funcCount; i++)
          {
            AO.a [set].c [i * 2]     = f.GetMinFuncX ();
            AO.a [set].c [i * 2 + 1] = f.GetMinFuncY ();
          }
        }
      }
      //---挿入されたコード--挿入されたコード--挿入されたコード--挿入者

      for (int set = 0; set < ArraySize (AO.a); set++)
      {
        AO.a [set].f = f.CalcFunc (AO.a [set].c, funcCount);
      }

      AO.Revision  ();

      if (Video_P)
      {
        //drawing a population--------------------------------------------------
        SendGraphToCanvas  (1, 1);

        for (int i = 0; i < ArraySize (AO.a); i++)
        {
          PointDr (AO.a [i].c, f, 1, 1, funcCount, false);
        }
        PointDr (AO.cB, f, 1, 1, funcCount, true);

        MaxMinDr (f);

        //コンバージェンス・グラフを描く
        xConv = (int)Scale (epochCNT, 1,              epochCount,     H + 2, W - 3, false);
        yConv = (int)Scale (AO.fB,   f.GetMinFun (), f.GetMaxFun (), 2,     H - 2, true);
        Canvas.FillCircle (xConv, yConv, 1, COLOR2RGB (clrConv));

        Canvas.Update ();
      }
    }

このトリックは、BGAアルゴリズムでは機能しません。なぜなら、この方法では、表現型を上書きするだけで、バイナリ遺伝子型は変更されないからです。そのためには、アルゴリズムの内部に入り込み、集団が初期段階にあるときに、このような外科的操作を行わなければならない。

このようにしてESGを初期化すると、このようになる:

拡大

ここで、ESGのビデオを撮りました。ESGがある一点から登っていき、大域的な最大値を求めて周囲に広がっていく様子がわかります。すべてのアルゴリズムがこのような振る舞いをするわけではありません。私の記事にも書きましたが、アルゴリズムによっては「罠から逃れる」メカニズムがまったくないものもあります。

 
こんにちは、私は内蔵の高速遺伝的アルゴリズムに 代わるものについて学び始めたところです。BGAの最適化を機能させる手助けをしていただけないでしょうか。このトピックに関する記事をいくつか拝見しました。しかし、私はスタートが遅く、どこかで情報を見逃しているような気がしていますし、異なるアルゴリズムでEAを実際に最適化する方法がわかりません。test_ao_bga.mq5をダウンロードしてコンパイルしました。ターミナルをロードすると、「Invalid program type, loading Test_AO_BGA.ex5 failed」と表示されます。実行しようとすると、ターミナルは「Test_AO_BGA.ex5が見つかりません」と表示します。どうすれば動くようになりますか?また、BGA最適化を使用するには、どのように自分のEAを設定すればよいのでしょうか?ありがとうございます。