Discussão do artigo "Algoritmos genéticos - é fácil!" - página 16

 
Alexey_74:

Andrew, mais uma pergunta.

Podemos dizer que esses valores dessas variáveis são adequados para a maioria dos problemas de otimização?

Sim.

As configurações são feitas com alguma "reserva" para aumentar a capacidade de pesquisa (cobertura do campo de pesquisa). Para obter valores mais precisos (mas a probabilidade de um extremo global ser encontrado é reduzida), você pode reduzir os parâmetros de mutação e o coeficiente de deslocamento do limite do intervalo.

 
Alexey_74:

Andrew, mais uma pergunta.

Podemos dizer que esses valores dessas variáveis são adequados para a maioria dos problemas de otimização? Como dizem em algumas fontes "... 90% dos problemas podem ser resolvidos usando um perceptron convencional".

ZAGASTE GA :)

O algoritmo é de thread único, pode ser facilmente incorporado a um Expert Advisor, executá-lo em um testador e organizar competições entre GAs boo-gah-gah.

 

Maravilhoso.

Andrei, sabe, estou surpreso com meu atrevimento, mas tenho que fazer algumas "críticas"))

A função ServiceFunction() é chamada em três lugares no código UGA. Mas isso não serve para nada. É claro que você pode ver a dinâmica na tela, mas ela é tão rápida que não é possível vê-la e avaliá-la de qualquer forma. Você pode remover sua chamada no corpo de UGA(). É suficiente chamá-lo uma vez depois de chamar UGA().

"... e o violinista é desnecessário, ele só consome combustível extra" (kin dza dza (c))

  ts=GetTickCount();
  UGA( ... );
  ts=GetTickCount()-ts;
  ServiceFunction();
 
Novamente, isso não é crucial. É por isso que é uma função de serviço, você pode usá-la para depuração, visualização ou qualquer outra coisa, ou pode não usá-la de forma alguma, quem gosta disso. :)
 

Fiz um experimento. Fiz uma soma de três senoides com "frequências" 47, 81, 187. Obtive o seguinte

Em seguida, iniciei a pesquisa por enumeração direta (3 ciclos, 2 aninhados), embora com interrupção quando o valor do coeficiente de correlação = 1,0. Sem essa condição, todo esse absurdo teria levado muito mais tempo. Mas, dessa forma, foi feito em 375 segundos (um pouco mais de 6 minutos).

O AG fez isso em 2 segundos. ))

Mas há uma dúvida. Aqui está o resultado.

Últimos 2 dígitos: 2747 - número de chamadas FF; 506 - número de "estados" quando o coeficiente de correlação r era igual a 1,0. Acontece que o algoritmo poderia ter funcionado ainda mais rápido, pois r não pode ser maior que 1,0 e, após o primeiro alcance de r=1, a tarefa é considerada concluída. Mas o algoritmo atingiu o estado r=1,0 506 vezes.

Esses foram os parâmetros

parâmetros

E este FF.

void FitnessFunction(int chromos)
{
  int cnt = 1;

  while(cnt<=GeneCount)
  {
    F1=Colony[cnt][chromos]; cnt++;
    F2=Colony[cnt][chromos]; cnt++;
    F3=Colony[cnt][chromos]; cnt++;

    Fill(sum);
    r=Pirson(sin,sum,nobs);
    if(r>0.99999999) count++;
  }
  AmountStartsFF++;

  Colony[0][chromos]=r;
}

Pergunta - há alguma maneira de explicar ao algoritmo que (às vezes) é possível (necessário) encerrar antes. Ou não devemos fazer isso categoricamente e esperar que a convergência seja alcançada?

 

Bem, há muito tempo venho querendo saber a resposta para a pergunta "quantos". Desta vez, peguei um momentum e coloquei 50 senoides nele. O intervalo de valores é de 1-500. Portanto, se não estou enganado, a pesquisa direta resulta em 500^50, ou seja, 8,88178419700121252323333890533447266e+134 iterações (se minha calculadora não mentiu para mim). Está claro que não é possível converter em segundos (minutos, horas, dias, anos). Somente descendentes distantes veriam o resultado. O AG fez isso em 1 hora. 20 minutos. Uau. Além disso, descobriu-se que o coeficiente de correlação da soma de 50 sinusóides com o momento é 0,5275. Por que"adicionalmente"? Porque eu não tive uma única oportunidade de verificar esse ponto antes. E, em alguns casos, isso sugere algumas reflexões.....

Não me fixei em senoides, mas é que tenho tudo isso na ponta dos dedos. Além disso, como o objetivo é obter a semelhança máxima de sinais contínuos, o resultado é essa mesma semelhança, em outras palavras, o resultado é inequívoco e, além disso, facilmente verificável.

Andrey, muito obrigado por seu produto. Gostaria de ler outro artigo seu em um futuro próximo. GA com seleção de elite. ))

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Alexey_74:
...

Pergunta - há alguma maneira de explicar ao algoritmo que (às vezes) é possível (às vezes) encerrar mais cedo. Ou isso não deve ser feito categoricamente, e devemos esperar até que a convergência seja alcançada?

Isso é possível. E até mesmo necessário. Se você souber algo sobre a função em estudo (como na sua tarefa: FF<=1), deve usar ativamente essas informações para evitar cálculos desnecessários e, assim, reduzir o tempo de pesquisa.

Nessa implementação, não há alavancas para controlar o algoritmo do lado de fora, mas basta adicionar uma função para controlar o sinalizador de parada forçada.

Na próxima geração do algoritmo, sobre a qual está sendo preparado um artigo complementar, há muito mais possibilidades de controlar o algoritmo de fora (ele geralmente funciona na iniciação e sob controle de fora, e não como é agora - o FF é iniciado pelo próprio algoritmo, portanto, não há possibilidade de usá-lo em corujas de otimização automática sem modificação).

 
Alexey_74:

....

Andrew, muito obrigado novamente por seu produto. Gostaria de creditar outro de seus artigos em um futuro próximo. GA com seleção de elite. ))

Obrigado pelo agradecimento. :)

Haverá uma continuação, com certeza.

E boa sorte para encontrar a melhor opção! Na vida, no trabalho, na vida... Tudo.

 
Tenho medo de perguntar.... )) Eu entendi corretamente? A próxima geração do algoritmo pode ser formalizada como uma DLL?
 
sim