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

 
joo:

1) Contador de histórias? Hmm, infelizmente não entendi o humor. A verificação do banco de dados ocorre na função CheckHistoryChromosomes(chromos,historyHromosomes ) , que é chamada a partir de GetFitness(historyHromosomes). É por isso que eu disse corretamente - não há execuções repetidas de FF.

2) A reconciliação com o banco de dados ocorre com a verificação por genes. E cada gene é normalizado por SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) quando um novo cromossomo aparece. Portanto, também não há "contos de fadas" aqui.

3) Veja 2)

1,2,3) Entendi. Quase. A normalização realmente existe, mas ainda não é motivo para comparar números reais "sem intervalo" para obter igualdade. :)

SelectInDiscreteSpace() foi ligeiramente reformulado. Não gostei do fato de você estar corrigindo o Step internamente. Não é uma questão real corrigir um usuário. Pelo menos não desta vez.

O usuário pode ter considerações razoáveis para tornar a etapa "irracional" com relação ao intervalo de alterações genéticas.

O resultado foi o seguinte:

double SelectInDiscreteSpace
(
double In, 
double InMin, 
double InMax, 
double step, 
int    RoundMode
)
{
  if (step==0.0)
    return(In);
  // garantir que os limites estejam corretos
  if ( InMax < InMin )
  {
    double temp = InMax; InMax = InMin; InMin = temp;
  }
  // se violado, retorna o limite violado
  if ( In < InMin ) return( InMin );
// se ( In > InMax ) return( InMax ); // E faremos isso no final, всё равно придётся
  if ( InMax == InMin || step <= 0.0 ) return( InMin );
  // trazer para uma determinada escala
// step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );  // Nah, não o traremos para a "escala determinada"
  switch ( RoundMode )
  {
  case 1:  In = ( InMin + step * MathFloor ( ( In - InMin ) / step ) );
  case 2:  In = ( InMin + step * MathCeil  ( ( In - InMin ) / step ) );
  default: In = ( InMin + step * MathRound ( ( In - InMin ) / step ) );
  }
  return fmin(In,InMax);
}
 
MetaDriver:

SelectInDiscreteSpace() foi ligeiramente modificado. Não gosto do fato de você corrigir o Step inside. Não é da conta do rei corrigir um usuário. Pelo menos não desta vez.

O usuário pode ter considerações razoáveis para tornar o Step "irracional" com relação ao intervalo de alterações genéticas.

Entenda isso:

A questão é que a etapa pode ser tal que dividirá o espaço em um número não inteiro de seções, e isso não é bom, porque imediatamente surge a pergunta: de que lado do número de entrada "pegar" o valor na linha numérica (não se sabe o que é "direito", direito ou esquerdo) - meu algoritmo dá uma resposta adequada, mas o seu, infelizmente. É por isso que você precisa fazer isso dessa forma:

step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );

Aqui estão alguns exemplos comparativos dos resultados do seu código e do meu:



Resultado


Meu Seu
Em 2,2 2 2
InMIN 2
InMAX 3
Degrau 0,8






Resultado


Meu Seu
Em 2,8 3 2,8
InMIN 2
InMAX 3
Degrau 0,8






Resultado


Meu Seu
Em 2,2 2,25 2,3
InMIN 2
InMAX 3
Degrau 0,3
 
O significado dessa normalização é diferente de NormalizeDouble (), mas cabe ao proprietário, que não gosta dela, usar a normalização para o sinal necessário, não com uma etapa especificada como em SelectInDiscreteSpace().
 
joo:
O significado dessa normalização é diferente de NormalizeDouble (), mas cabe ao proprietário, que não gosta dela, usar a normalização para o sinal necessário, não com uma etapa especificada como em SelectInDiscreteSpace().

Está tudo claro, assim como na postagem anterior.

Andrei, todas as variantes listadas têm o direito de existir aqui. A sua também, é claro. A discretização flutuante e variável durante a otimização merece muita atenção.

--

Sobre tudo em geral:

Você deve adicionar configurações, uma biblioteca de operadores genéticos, etc. E deve pensar em extensões e usos convenientes com antecedência.

Estou pensando em reescrever tudo em objetos, criando uma interface mais poderosa para o programa e para o usuário (gráfica, com muitas configurações em guias). Algumas coisas a serem adicionadas, outras a serem otimizadas.

Mais precisamente, ainda estou pensando se devo fazer isso com base no seu código (usar fragmentos) ou se devo reescrever tudo de novo.

Se você quiser participar, escreva em particular.

Não é certo que eu o publicarei. Veremos. Por enquanto, quero fazer isso por mim mesmo.

 
MetaDriver:

Sobre tudo em geral:

1) De forma positiva - você precisa adicionar personalizações, uma biblioteca de operadores genéticos, etc. E pensar na extensão e no uso convenientes com antecedência.

2) Mais precisamente, ainda estou pensando se devo fazer isso com base no seu código (usar fragmentos) ou reescrevê-lo todo de novo.

3) Se você quiser participar, escreva em particular.

1) Pelo contrário, estou tentando reduzir o número de parâmetros UGA sem reduzir a flexibilidade do controle.

2) Conheço várias pessoas que usam o código do artigo em seus projetos como está e outras que reescreveram o código do 0.

3) Escrevi para você em uma mensagem privada.

 
MetaDriver:

Tudo isso é compreensível, assim como a postagem anterior.

Andrei, todas as opções listadas aqui têm o direito de existir. As suas também, é claro. A discretização flutuante, que muda durante o processo de otimização, merece muita atenção.

--

Sobre tudo em geral:

Você deve adicionar configurações, uma biblioteca de operadores genéticos, etc. E deve pensar em extensões e usos convenientes com antecedência.

Estou pensando em reescrever tudo em objetos, criando uma interface mais poderosa, tanto para o programa quanto para o usuário (gráfica, com muitas configurações em guias). Algumas coisas a serem adicionadas, outras a serem otimizadas.

Mais precisamente, ainda estou pensando se devo fazer isso com base no seu código (usar fragmentos) ou se devo reescrever tudo de novo.

...

Vladimir, você quer pedalar ou dirigir?

Você quer um código bonito ou quer criar um GA mais legal do que o de teste?

Pessoalmente, acho que o de teste é bem legal, mas há poucos parâmetros.
.

 
Urain:

Vladimir, você quer pilotar ou dirigir?

quer um código bonito ou construir um GA mais legal do que o de teste?

Pessoalmente, acho que o de teste é muito legal, mas apenas uma nuance não é parâmetro suficiente.
.

Quero um código conveniente. Fácil de usar, estender, modificar e incorporar.

 
MetaDriver:

Quero um código conveniente. Fácil de usar, estender, modificar e incorporar.

Em seguida, descreva o modelo de objeto do GA. Crie classes vazias de acordo com o modelo descrito e, em seguida, preencha as classes com código e prescreva a interação.
 

A linha 175 foi substituída por.

        NormalizeDouble((double)SumOfCurrentEpoch/MathMax(1,(double)resetCounterFF),2),

Sem isso, o relatório de trabalho falha com um erro.

 
Rich:

A linha 175 foi substituída por.

Sem isso, o relatório de operação falhará com um erro.

Sim, ocorrerá um erro de divisão por 0 se não houver nenhuma melhoria em um determinado número de épocas desde a primeira execução do loop do operador gen.

É mais simples e logicamente mais correto atribuir 1 à variável resetCounterFF imediatamente na inicialização:

int    resetCounterFF   =1;// Contador de reinicialização de "épocas sem melhoria