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

 

Novo artigo Algoritmos de otimização populacionais: evolução de grupos sociais (Evolution of Social Groups, ESG) foi publicado:

Neste artigo, consideraremos o princípio de construção de algoritmos multipopulacionais e, como exemplo desse tipo de algoritmos, analisaremos a Evolução de Grupos Sociais (ESG), um novo algoritmo autoral. Analisaremos os conceitos principais, os mecanismos de interação entre populações e as vantagens desse algoritmo, bem como examinaremos seu desempenho em tarefas de otimização.

No campo da otimização, existe uma ampla gama de algoritmos populacionais destinados à busca de soluções ótimas em diversas tarefas. Contudo, apesar de sua importância, algoritmos multipopulacionais e de enxames não foram suficientemente abordados em meus artigos e pesquisas anteriores. Por isso, decidi abordar mais detalhadamente este tema fascinante e promissor.

Os algoritmos multipopulacionais são baseados na ideia de usar várias populações independentes para resolver problemas de otimização. As populações operam logicamente em paralelo e podem trocar informações sobre soluções ótimas, o que permite explorar simultaneamente diferentes regiões do espaço de parâmetros e encontrar diversos ótimos. Por outro lado, os algoritmos de enxames utilizam grupos sociais (enxames) compostos por múltiplas partículas interagentes, que também podem cooperar entre si e trocar informações para alcançar soluções ótimas.

[картинка]

Neste artigo, preencheremos essa lacuna e consideraremos como exemplo o algoritmo multipopulacional ESG, criado por mim especificamente para este artigo. Examinaremos os princípios básicos de funcionamento desses algoritmos. Além disso, discutiremos os resultados de estudos comparativos que permitirão avaliar a eficácia desses algoritmos em comparação com métodos de otimização monopopulacionais.

Autor: Andrey Dik

 
34: OPTIMIZATION_METHOD_AO_HS = 1 e-323
33: OPTIMIZATION_METHOD_AO_GSA = 0.11926002964619356
32: OPTIMIZATION_METHOD_AO_ABC = 0.4042085745674859
31: OPTIMIZATION_METHOD_AO_MA = 0.612338549995716
30: OPTIMIZATION_METHOD_AO_BFO = 0.6679763921514072
29: OPTIMIZATION_METHOD_AO_BFO_GA = 0.71308437578657
28: OPTIMIZATION_METHOD_AO_CSS = 0.7316626048819873
27: OPTIMIZATION_METHOD_AO_FSS = 0.7355579934372427
26: OPTIMIZATION_METHOD_AO_GWO = 0.7390576242470235
25: OPTIMIZATION_METHOD_AO_RND = 0.8155449913938271
24: OPTIMIZATION_METHOD_AO_PSO = 0.8222303819859975
23: OPTIMIZATION_METHOD_AO_SC = 0.8340939685401099
22: OPTIMIZATION_METHOD_AO_BA = 0.845763320077643
21: OPTIMIZATION_METHOD_AO_Micro_AIS = 0.8528065344750899
20: OPTIMIZATION_METHOD_AO_SA = 0.8589854552563216
19: OPTIMIZATION_METHOD_AO_SFL = 0.8597046576708655
18: OPTIMIZATION_METHOD_AO_IWDm = 0.862259472275573
17: OPTIMIZATION_METHOD_AO_EM = 0.8779833807818905
16: OPTIMIZATION_METHOD_AO_SDS = 0.9027267066161594
15: OPTIMIZATION_METHOD_AO_NMm = 0.9076903894257041
14: OPTIMIZATION_METHOD_AO_FAm = 0.9111364322206529
13: OPTIMIZATION_METHOD_AO_ESG = 0.9128694208149278
12: OPTIMIZATION_METHOD_AO_SDOm = 0.9182612507465655
11: OPTIMIZATION_METHOD_AO_COAm = 0.9198698363722636
10: OPTIMIZATION_METHOD_AO_IWO = 0.923914294524697
09: OPTIMIZATION_METHOD_AO_SSG = 0.9304990658351672
08: OPTIMIZATION_METHOD_AO_BGA = 0.9389284935189659
07: OPTIMIZATION_METHOD_AO_ACOm = 0.944545536542497
06: OPTIMIZATION_METHOD_AO_DE = 0.9482478998933197
05: OPTIMIZATION_METHOD_AO_POES = 0.9528516011673952
04: OPTIMIZATION_METHOD_AO_SIA = 0.9540996483364099
03: OPTIMIZATION_METHOD_AO_MEC = 0.9574730447145243
02: OPTIMIZATION_METHOD_AO_SDSm = 0.9648638811101882
01: OPTIMIZATION_METHOD_PSO = 0.9653160312454183
00: OPTIMIZATION_METHOD_AO_P_O_ES = 0.9654152361899765
 
34: OPTIMIZATION_METHOD_AO_ABC = 0.42453133581346014
33: OPTIMIZATION_METHOD_AO_IWDm = 0.48360991828383987
32: OPTIMIZATION_METHOD_AO_SIA = 0.49114081735004017
31: OPTIMIZATION_METHOD_AO_EM = 0.49479704987697276
30: OPTIMIZATION_METHOD_AO_RND = 0.5085913649249508
29: OPTIMIZATION_METHOD_AO_MA = 0.5129110822292692
28: OPTIMIZATION_METHOD_AO_HS = 0.5129110822292692
27: OPTIMIZATION_METHOD_AO_CSS = 0.5138134842496185
26: OPTIMIZATION_METHOD_AO_SSG = 0.518468314742929
25: OPTIMIZATION_METHOD_AO_SC = 0.5243709181146918
24: OPTIMIZATION_METHOD_AO_SA = 0.532630712905892
23: OPTIMIZATION_METHOD_AO_FSS = 0.5405996550405998
22: OPTIMIZATION_METHOD_AO_PSO = 0.5430691869913079
21: OPTIMIZATION_METHOD_AO_FAm = 0.5629971666466362
20: OPTIMIZATION_METHOD_AO_BA = 0.5653828707497576
19: OPTIMIZATION_METHOD_AO_BFO = 0.5708620661833331
18: OPTIMIZATION_METHOD_AO_IWO = 0.5736967768562664
17: OPTIMIZATION_METHOD_AO_NMm = 0.5818790406200212
16: OPTIMIZATION_METHOD_AO_ESG = 0.5945790493029925
15: OPTIMIZATION_METHOD_AO_GWO = 0.6234871646160723
14: OPTIMIZATION_METHOD_PSO = 0.6256882439878475
13: OPTIMIZATION_METHOD_AO_GSA = 0.6735183680285166
12: OPTIMIZATION_METHOD_AO_SFL = 0.6885524892005978
11: OPTIMIZATION_METHOD_AO_DE = 0.7092034045816206
10: OPTIMIZATION_METHOD_AO_COAm = 0.7263185318109061
09: OPTIMIZATION_METHOD_AO_SDS = 0.7686064552778226
08: OPTIMIZATION_METHOD_AO_Micro_AIS = 0.7722431882203732
07: OPTIMIZATION_METHOD_AO_SDOm = 0.7808430850753312
06: OPTIMIZATION_METHOD_AO_MEC = 0.7816647439743983
05: OPTIMIZATION_METHOD_AO_ACOm = 0.7830252357918316
04: OPTIMIZATION_METHOD_AO_POES = 0.8453008986622238
03: OPTIMIZATION_METHOD_AO_P_O_ES = 0.8523920887258357
02: OPTIMIZATION_METHOD_AO_SDSm = 0.9046058644799349
01: OPTIMIZATION_METHOD_AO_BGA = 0.9856063511804057
00: OPTIMIZATION_METHOD_AO_BFO_GA = 0.9880292622094636
 
fxsaber #:

Quantas execuções de ff e quantas vezes o teste foi executado?
 
Andrey Dik #:

Quantas execuções de ff e quantas vezes o teste foi executado?

Por que usar o resultado médio e não o mais alto?

    aveResult += AO.fB;
  }

  aveResult /=(double)NumberRepetTest_P;
 
fxsaber #:

Por que considerar o resultado médio e não o mais alto?

Porque o maior resultado não é garantido. Vou lhe dizer mais: nenhum resultado é garantido na busca estocástica.

Você só pode estimar o resultado médio para algum número de testes. Nos artigos, usamos 10 testes, o que é suficiente para uma boa avaliação da comparação dos algoritmos entre si. É possível aumentar o número de testes ainda mais, é claro, por exemplo, 100 ou mais, mas isso deixa de fazer sentido devido à rápida diminuição da precisão da medição. Em resumo, 10 é o melhor, antes eu usava 5 testes - não era suficiente.

E alguns algoritmos mostram uma dispersão muito grande na convergência, essa é uma propriedade muito importante dos algoritmos de otimização - a repetibilidade dos resultados, que caracteriza a estabilidade do modelo probabilístico do algoritmo (a menos, é claro, que estejamos falando de estratégias de busca determinísticas, cujos resultados serão invariavelmente os mesmos, mas, como regra, esses algoritmos têm baixa convergência).

Em geral, é necessário fazer pelo menos 10 testes para poder comparar adequadamente os algoritmos que têm em sua base a natureza estocástica da estratégia de busca.

Grosso modo, podemos fazer uma analogia: qual das estratégias de enfiar uma lança em um palheiro é mais eficaz para encontrar uma maçã em um monte de palha? A comparação só pode ser feita em vários testes, caso contrário, há uma probabilidade diferente de zero de acertar a maçã com a lança na primeira vez se você espetar estritamente a partir do topo da pilha no centro, e é errado pensar que esse é um resultado natural de tal estratégia.

Além disso, as estratégias são fornecidas em sua forma absolutamente pura, pode-se dizer que é um elixir de estratégias, não encoberto pela aplicação de triagem de duplicatas e outras técnicas de aceleração de pesquisa para um número limitado de execuções de FF. Cada novo conjunto de duplicatas desperdiça uma execução, e os algoritmos nessa forma pura são muito fáceis de comparar.

Quando o espaço de pesquisa é pequeno, a exclusão de duplicatas pode fazer uma grande diferença, e até mesmo algoritmos muito fracos podem apresentar bons resultados. Porém, à medida que o espaço de busca aumenta, a exclusão de duplicatas se torna sem sentido mais rapidamente, e mais as diferenças nas habilidades das estratégias de busca se tornam aparentes.

Talvez eu tenha transmitido mal meu ponto de vista com esta postagem, algumas coisas são muito difíceis de explicar, infelizmente.

 
Andrey Dik #:

Só é possível estimar o resultado médio de um determinado número de testes

Acho que é lógico ter um parâmetro de entrada "número de repetições" para buscar o máximo global. Por exemplo, otimizamos um TS no Tester padrão. Às vezes, é lógico executar o otimizador várias vezes seguidas para reduzir a probabilidade de ficar preso em extremos locais. Sim, a velocidade de cálculo cairá em um número correspondente de vezes, mas a probabilidade de atingir um pico global será maior.
 
fxsaber #:
Considero lógico ter um parâmetro de entrada "número de repetições" para pesquisar o máximo global.


34: OPTIMIZATION_METHOD_AO_HS = -1.7976931348623157 e+308
33: OPTIMIZATION_METHOD_AO_CSS = 0.49720358822818334
32: OPTIMIZATION_METHOD_AO_FSS = 0.5126268634117646
31: OPTIMIZATION_METHOD_AO_MA = 0.5456638212207142
30: OPTIMIZATION_METHOD_AO_SC = 0.5493573778417595
29: OPTIMIZATION_METHOD_AO_SFL = 0.5586288936731915
28: OPTIMIZATION_METHOD_AO_EM = 0.5622069376759021
27: OPTIMIZATION_METHOD_AO_BFO = 0.572272929264936
26: OPTIMIZATION_METHOD_AO_GWO = 0.576823172558009
25: OPTIMIZATION_METHOD_AO_BA = 0.5780620208551676
24: OPTIMIZATION_METHOD_AO_COAm = 0.6122501636921197
23: OPTIMIZATION_METHOD_AO_FAm = 0.6140389813209256
22: OPTIMIZATION_METHOD_AO_IWO = 0.668152749061326
21: OPTIMIZATION_METHOD_AO_RND = 0.6708834560036839
20: OPTIMIZATION_METHOD_AO_SDSm = 0.6949312990837662
19: OPTIMIZATION_METHOD_AO_ESG = 0.6998001260367949
18: OPTIMIZATION_METHOD_AO_DE = 0.7011196053256343
17: OPTIMIZATION_METHOD_AO_IWDm = 0.7021399692041209
16: OPTIMIZATION_METHOD_AO_GSA = 0.7220579685405103
15: OPTIMIZATION_METHOD_AO_PSO = 0.749441828773945
14: OPTIMIZATION_METHOD_AO_SA = 0.7682447940796119
13: OPTIMIZATION_METHOD_AO_MEC = 0.7861990306904714
12: OPTIMIZATION_METHOD_AO_ABC = 0.7907454297118246
11: OPTIMIZATION_METHOD_AO_SDS = 0.8196051951016118
10: OPTIMIZATION_METHOD_AO_SIA = 0.8221393904152611
09: OPTIMIZATION_METHOD_AO_SDOm = 0.8473736964247897
08: OPTIMIZATION_METHOD_PSO = 0.8554905139189528
07: OPTIMIZATION_METHOD_AO_BFO_GA = 0.9302287492114422
06: OPTIMIZATION_METHOD_AO_SSG = 0.9508929176886642
05: OPTIMIZATION_METHOD_AO_Micro_AIS = 0.9744230924005981
04: OPTIMIZATION_METHOD_AO_BGA = 0.9758026556865227
03: OPTIMIZATION_METHOD_AO_ACOm = 0.9842635986445009
02: OPTIMIZATION_METHOD_AO_P_O_ES = 0.9862393247408759
01: OPTIMIZATION_METHOD_AO_POES = 0.9939584765415376
00: OPTIMIZATION_METHOD_AO_NMm = 0.9992316949848764
inAmountCycles = 1000, inRepeats = 5

Repeats - o número de chamadas independentes para o algoritmo.

AmountCycles - o número de chamadas FF em cada tentativa (consulte Repetições).

Para cada algoritmo, o melhor resultado é gerado (consulte Repetições).

 
  MathSrand ((int)GetMicrosecondCount ()); // reinicialização do gerador

Eu faria dessa forma.

Sleep(1); // aleatório GetMicrosecondCount ().
MathSrand ((int)TimeLocal() + (int)GetMicrosecondCount ()); // reinicialização do gerador

Caso contrário, ele se repetirá toda vez que o script for executado.

 
fxsaber #:
Acho que é lógico ter um parâmetro de entrada "número de repetições" para buscar o máximo global. Por exemplo, otimizamos um TS no Tester padrão. Às vezes, é lógico executar o otimizador várias vezes seguidas para reduzir a probabilidade de ficar preso em extremos locais. Sim, a velocidade dos cálculos cairá pelo número correspondente de vezes, mas a probabilidade de atingir um pico global será maior.
fxsaber #:


Repetições - número de chamadas independentes do algoritmo.

AmountCycles - número de chamadas FF em cada tentativa (consulte Repeats).

Para cada algoritmo, o melhor resultado é exibido (consulte Repetições).

Sim, para aumentar a chance de encontrar uma solução global, se todas as outras coisas forem iguais, basta aumentar o número de testes e usar a melhor solução encontrada. Até mesmo o algoritmo RND tem uma chance diferente de zero de encontrar o que você precisa com essa abordagem.

Mas, como descrevi acima, somente o resultado médio permite comparar os algoritmos entre si.

 
fxsaber #:

Teria feito dessa forma.

Caso contrário, ele se repete toda vez que o script é executado.

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.