Discussão do artigo "Algoritmos de otimização populacionais: evolução de grupos sociais (Evolution of Social Groups, ESG)" - página 2

 
Andrey Dik #:
Duvido que o valor GetMicrosecondCount possa repetir os valores em execuções repetidas, mesmo que você se esforce. Desde que os testes individuais sejam maiores que um microssegundo, é claro.
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

À esquerda está a coluna de tempos de execução do script.

 
fxsaber #:

À esquerda, há uma coluna de horários de início do script.


99,99% é o máximo que pode ser alcançado com a etapa selecionada e, pelo que sei, a precisão de duas casas decimais é selecionada nas configurações do BGA.
Portanto, isso não é uma consequência da mesma inicialização do gcc, mas um resultado da convergência total teoricamente possível dentro da tarefa definida.
Você pode ter certeza disso se imprimir o primeiro cromossomo criado em cada teste individual, pois eles serão cromossomos diferentes. Essa é a incrível propriedade do algoritmo de otimização: encontrar a mesma solução em diferentes estados iniciais (aleatórios).
 
Criei um teste de resistência do algoritmo a ficar preso em locais.
Precisamos colocar todos os agentes na primeira iteração não de forma aleatória em todo o campo, mas no mínimo global. A tarefa é encontrar o máximo global. Tenho certeza de que muitos algoritmos ficarão no buraco dessa forma.
Esse é um caso muito artificial, mas tem conclusões interessantes.
 
Andrey Dik #:
Lembrei-me de um teste da resistência do algoritmo a ficar preso em locais.
Precisamos colocar todos os agentes na primeira iteração não de forma aleatória em todo o campo, mas no mínimo global. A tarefa é encontrar o máximo global. Tenho certeza de que muitos algoritmos permanecerão no buraco.
Esse é um caso muito artificial, mas tem conclusões interessantes.

Toda a população em um ponto é uma população degenerada. Esse também é um teste para o efeito da diminuição da diversidade na população; o algoritmo deve ser capaz de sair desse gargalo.

Isso é apenas um pensamento em voz alta.

 
Andrey Dik #:
Precisamos posicionar todos os agentes na primeira iteração, não de forma aleatória em todo o campo, mas no mínimo global. A tarefa é encontrar o máximo global.

  1. O início usual é a busca pelo máximo global.
  2. Em seguida, partimos do ponto encontrado(MaxTmp) para encontrar o mínimo global.
  3. Em seguida, iniciamos a partir do ponto encontrado(MinTmp) para encontrar o máximo global.
  4. Vá para a etapa 2.

Nas etapas 2 a 3, medimos a distância que estamos dos mínimos/máximos globais(MaxGlobal - MaxTmp + MinTmp - MinGlobal). A média é a classificação1 do algoritmo de otimização.

Tomar a média da soma de(MaxTmp[i]-MinTmp[i]) é a classificação2 do algoritmo de otimização.


Agora não há nenhuma função que permita executar o algoritmo a partir de um ponto.

 
fxsaber #:

  1. Início normal com pesquisa do máximo global.
  2. Em seguida, inicie a partir do ponto encontrado(MaxTmp) para pesquisar o mínimo global.
  3. Em seguida, inicie a partir do ponto encontrado(MinTmp) para pesquisar o máximo global.
  4. Vá para a etapa 2.

Nas etapas 2 a 3, medimos a distância que estamos dos mínimos/máximos globais(MaxGlobal - MaxTmp + MinTmp - MinGlobal). A média é a classificação1 do algoritmo de otimização.

Tomamos a média da soma(MaxTmp[i]-MinTmp[i]) - classificação2 do algoritmo de otimização.


Você pode fazer isso dessa forma)))

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

Você pode inicializar "forçosamente" as coordenadas dos agentes com quaisquer valores antes que o FF seja medido na primeira época. Os campos dos agentes são públicos. As "entranhas" dos algoritmos tentaram torná-los tão acessíveis quanto possível do lado de fora, é claro, isso contradiz a abordagem usual para garantir a segurança dos campos, mas aquele que quiser dar um tiro no próprio pé, de qualquer forma, encontrará uma maneira, e assim a conveniência de usar os algoritmos é preservada.

E o problema com a inicialização do HCS está resolvido?

 
Andrey Dik #:

99,99% é o máximo que pode ser alcançado com o passo selecionado e, pelo que sei, a precisão selecionada é de duas casas decimais nas configurações de BGA.
Portanto, isso não é uma consequência da mesma inicialização do gcc, mas um resultado da convergência total teoricamente possível dentro da tarefa definida.
Você pode ter certeza disso se imprimir o primeiro cromossomo criado em cada teste individual, pois serão cromossomos diferentes. Essa é a incrível propriedade do algoritmo de otimização: encontrar a mesma solução em diferentes estados iniciais (aleatórios).

Você está certo, obrigado!

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 #:

É possível inicializar externamente e de forma "forçada" as coordenadas dos agentes com quaisquer valores antes que o FF seja medido na primeira época.

Mostre exemplos de seus dois algoritmos.

 
fxsaber #:

Mostre com exemplos de seus dois algoritmos.

No loop principal de épocas, insira um código que substituirá as coordenadas dos agentes pelas coordenadas do mínimo global da função:

for (int epochCNT = 1; epochCNT <= epochCount && !IsStopped (); epochCNT++)
    {
      AO.Moving ();
      
      //---o código inserido---o código inserido---o código inserido---o inseridor
      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 ();
          }
        }
      }
      //---o código inserido---o código inserido---o código inserido---o inseridor

      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);

        //desenhando um gráfico de convergência---------------------------------------------
        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 ();
      }
    }

Esse truque não funcionará com o algoritmo BGA, pois dessa forma sobrescreveremos apenas o fenótipo, enquanto o genótipo binário permanecerá inalterado. Para isso, teremos de entrar no algoritmo e, quando a população estiver em sua infância, teremos de realizar essa operação cirúrgica.

Isso é o que você obtém se inicializar o ESG dessa forma:

expansão

Aqui, eu gravei um vídeo do ESG, e você pode ver como ele sai de um ponto e se espalha em busca de um máximo global. Nem todos os algoritmos se comportam dessa forma, escrevi sobre isso em meus artigos, alguns algoritmos não têm nenhum mecanismo para "escapar da armadilha".

 
Olá, estou apenas começando a aprender sobre alternativas ao algoritmo genético rápido embutido. Gostaria de saber se você poderia me ajudar a fazer a otimização do BGA funcionar. Tenho examinado alguns de seus artigos sobre esse tópico. No entanto, sinto que estou começando tarde, perdi algumas informações em algum lugar e não sei como otimizar de fato o EA com um algoritmo diferente. Baixei e compilei o test_ao_bga.mq5. Quando carrego o terminal, ele diz: "Invalid programme type, loading Test_AO_BGA.ex5 failed". Se eu tentar executá-lo, o terminal informa "Test_AO_BGA.ex5 not found" (Teste_AO_BGA.ex5 não encontrado). Você poderia me ajudar a fazer com que ele funcione? E como faço para configurar meu próprio EA para usar a otimização BGA? Obrigado.