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

 
shurick:

Muito obrigado pelo esclarecimento, a pergunta sobre a remoção de duplicatas foi totalmente respondida para minha satisfação. Estou anexando o código do script que demonstra a função original e a otimizada, que demonstra a redução no número de passagens em loops. No meu comentário atual, NÃO estou apontando um bug na função, mas sugerindo sua otimização, e meu objetivo principal era descobrir o princípio da remoção de duplicatas, para o qual recebi uma resposta abrangente. Mais uma vez, muito obrigado pela biblioteca e pelo esclarecimento da função.

110 e 160 são demais para 20 cromossomos.... Você colocou o contador no lugar errado.

Esse é o lugar certo:

/Selecione o segundo do par....
      for (Ch2=Ch+1;Ch2<PopulChromosCount;Ch2++)
      {
        //count_cicles++; // DEBUG conta quantas vezes passamos os ciclos Ch e Ch2
        if (Ch!=Ch2 && chromosomeUnique[Ch2]!=0)
        {
          count_cicles++; // O DEBUG conta quantas vezes comparamos os cromossomos.
          //Vamos reiniciar a contagem do número de genes idênticos
          cnt=0;
          /Verifique os genes, desde que os genes sejam os mesmos.
          for (Ge=1;Ge<=GeneCount;Ge++)
          {
            if (Population[Ge][Ch]!=Population[Ge][Ch2])
              break;
            else
              cnt++;
          }
          //Se o número de genes idênticos for o mesmo que o número total de genes
          //... o cromossomo é reconhecido como uma duplicata.
          if (cnt==GeneCount)
            chromosomeUnique[Ch2]=0;
        }

OK. Agora tente a mesma população, com os mesmos cromossomos, mas nessa sequência:

int m_init[20] = {7,7,7,3,9,2,4,5,3,3,5,6,2,4,3,5,10,6,2};

O que observamos?

 

para Shurick:

De fato. O número de verificações de exclusividade, com todos os cromossomos diferentes, pode ser calculado pela fórmula

(PopulChromosCount^2-PopulChromosCount)/2

No nosso exemplo, que tem 20 cromossomos (supondo que todos os cromossomos sejam diferentes), o número de verificações seria

(20*20-20)/2=190

Isso é confirmado por esta verificação:

int  m_init[20]  = {1,2,3,4,5,6,6,7,8,9,9,10,11,12,13,14,15,16,17,18,19,20};

Se forem detectadas duplicatas, haverá ainda menos verificações.

Obrigado por sua participação ativa no projeto!

As alterações apropriadas serão feitas na biblioteca. Embora as alterações não afetem os recursos de pesquisa do algoritmo, elas tornarão seu trabalho mais racional.

 
joo:

O que estamos vendo?

Resultado

Embora as alterações não afetem os recursos de pesquisa do algoritmo de forma alguma

Absolutamente certo, a qualidade do algoritmo não mudará, embora inicialmente eu duvidasse disso, mas agora você provou isso para mim, mas nessas dúvidas encontrou um método de otimização :)

 
Biblioteca UGA e exemplos atualizados para o artigo. Versão atual gratuita do autor 1.2.1.
Arquivos anexados:
 
Atualização da biblioteca UGA e exemplos para este artigo. Versão atual de criação gratuita 1.2.1.
Arquivos anexados:
 

Estudei o artigo e encontrei uma inconsistência no código: em duas funções para obter valores de intervalo, é usada a mesma fórmula:

//Replicação
void Replication
...
    /Vamos definir os limites para a criação de um novo gene
    Minimum = C1-((C2-C1)*ReplicationOffset);
    Maximum = C2+((C2-C1)*ReplicationOffset);
...

/////////////////////////////////////////////

// Mutação artificial.
void ArtificialMutation
...
    /Vamos definir os limites para a criação de um novo gene
    Minimum=C1-((C2-C1)*ReplicationOffset);
    Maximum=C2+((C2-C1)*ReplicationOffset);
...

Ou seja, são obtidos dados fora dos valores de dois genes, o que é característico da "mutação artificial". Isso é um bug ou há outra explicação?

Parece-me que, para o método de replicação, é necessário alterar os sinais:

Mínimo = C1+((C2-C1)*ReplicationOffset);

Máximo = C2-((C2-C1)*ReplicationOffset);


 
Batohov:

Estudei o artigo e encontrei essa inconsistência no código: duas funções usam a mesma fórmula para obter valores de intervalo:

Ou seja, são obtidos dados fora dos valores de dois genes, o que é característico da "mutação artificial". Isso é um bug ou há outra explicação?

Parece-me que, para o método de replicação, é necessário alterar os sinais:

Mínimo = C1+((C2-C1)*ReplicationOffset);

Máximo = C2-((C2-C1)*ReplicationOffset);

Não há erro ou inconsistência. Tanto na replicação quanto na mutação artificial , os limites do provável surgimento de um novo gene (as seções de código que você citou) são definidos da mesma forma.

Mas, para a replicação, a área de probabilidade está dentro desses limites, e para a mutação artificial, além desses limites.

A replicação serve para transferir traços característicos dos genes de ambos os pais (dentro dos limites).

A mutação artificial serve para gerar novos genes diferentes dos genes dos pais (fora dos limites).

 
joo:

Não há erro ou inconsistência. Tanto na replicação quanto na mutação artificial, os limites do provável surgimento de um novo gene (as seções de código que você citou) são definidos da mesma forma.

Mas, para a replicação, a área de probabilidade está dentro desses limites, e para a mutação artificial, além desses limites.

A replicação serve para transferir traços característicos dos genes de ambos os pais (dentro dos limites).

A mutação artificial serve para gerar novos genes diferentes dos genes dos pais (fora dos limites).

Obrigado por sua resposta rápida, entendo sua linha de pensamento.
 
joo:

A propósito, é muito bom ser o destruidor de um dos mais famosos mitos dos traders relacionados à ZZ (a segunda tarefa do artigo). :)

Aparentemente, eu não entendi a redação da tarefa. Minha declaração:

Os pontos de entrada para o lucro máximo, com a condição de que a negociação mínima seja de N pips, estão localizados nos topos do ZigZag com a condição de joelho mínimo N + Spread pips.

 
joo:

Eu publiquei algumas funções de teste interessantes no tópico do fórum MQL4 "Test Multivariable Multiextremal Function", uma delas é apresentada no artigo.

Se quiser, você pode tentar encontrar os extremos das funções propostas usando outros algoritmos de otimização além do GA e publicar os resultados aqui. Você está convidado a fazer isso. Será interessante para todos e para mim, em primeiro lugar.

Sei que é muito importante avaliar a validade do ajuste. Um dos métodos é adicionar ruído aos dados originais.

Os códigos-fonte dos métodos de otimização alternativos podem ser encontrados aqui(http://alglib.sources.ru/optimization/) e aqui(http://ool.sourceforge.net/).

Obviamente, cada algoritmo de otimização tem melhor desempenho em suas próprias classes de funções de destino.

Quais funções de destino você usa na prática?