Discussão do artigo "Algoritmos de otimização populacionais: algoritmo genético binário (Binary Genetic Algorithm, BGA). Parte I"

 

Novo artigo Algoritmos de otimização populacionais: algoritmo genético binário (Binary Genetic Algorithm, BGA). Parte I foi publicado:

Neste artigo, vamos realizar um estudo sobre vários métodos aplicados em algoritmos genéticos binários e outros algoritmos populacionais. Vamos examinar os componentes principais do algoritmo, como seleção, crossover e mutação, bem como seu impacto no processo de otimização. Além disso, vamos explorar as formas de representação de informações e seu impacto nos resultados de otimização.

Os parâmetros dos problemas de otimização são frequentemente chamados de "características" e devem ser representados de certa forma para serem usados na lógica do algoritmo de otimização. Na genética, essas características são divididas em fenótipo e genótipo. O fenótipo representa a aparência externa do parâmetro a ser otimizado, enquanto o genótipo é a forma como ele é representado no algoritmo. Na maioria dos algoritmos de otimização, o fenótipo coincide com o genótipo e é representado como um número real. O gene é um parâmetro a ser otimizado, enquanto o cromossomo é um conjunto de genes, ou seja, um conjunto de parâmetros a serem otimizados.

A representação em número real é usada para representar números fracionários. Números reais podem ter uma parte inteira e uma parte fracionária, separadas por um ponto decimal. Por exemplo, "3.14" e "0.5" são números reais.

A representação binária de dados, por outro lado, usa o sistema de numeração binária, onde os números são representados usando dois símbolos: "0" e "1" e cada dígito é chamado de bit (de "binary digit"). Por exemplo, o número "5" pode ser representado em binário como "101".


A principal diferença entre a representação real e binária dos dados está na forma de codificar os números. Os números reais geralmente são codificados usando padrões como o IEEE 754, que define formatos para representar números de ponto flutuante. Na linguagem MQL5, para números reais é usado o tipo de dados "double", que pode descrever no total 16 dígitos significativos em um número. Isso significa que o número total de dígitos não pode ser maior que dezesseis, por exemplo, "9 999 999 999 999 999.0" e "9 999 999.999 999 99" e "0.999 999 999 999 999 9" têm dezesseis dígitos "9" no total antes e depois do ponto decimal. Por que isso é importante vamos entender mais adiante.

Números reais são convenientes para uso na programação e no cotidiano, enquanto a representação binária é usada para trabalhar em sistemas de computação e realizar operações em baixo nível, como operações lógicas e operações bit a bit.

Autor: Andrey Dik

 
fxsaber #:
Isso me apunhalou.
Obrigado, corrigido.
 
Leia. O que está faltando é um diagrama que mostre uma representação geral do algoritmo de otimização.
 
fxsaber #:
Leia. O que está faltando é um diagrama que mostre a representação geral de um algoritmo de otimização.

Para todos os algoritmos de otimização, sem exceção, não apenas para o GA, a ordem dos operadores (métodos) é sempre a mesma, na ordem do Índice:

1. Seleção.

2. Crossover.

3. mutação.

Cada algoritmo específico pode não ter um ou dois operadores, mas a ordem é sempre essa. Essa ordem certamente pode ser justificada logicamente e relacionada a probabilidades, e o objetivo de qualquer algoritmo de otimização é somar uma combinação de probabilidades a favor da solução do problema.

Há também um quarto método, o método de colocar novos indivíduos em uma população, mas ele geralmente não é identificado como um método autônomo.

Talvez, sim, faça sentido desenhar um diagrama da estrutura de um "algoritmo de otimização", vou pensar sobre isso.

 
Andrey Dik #:

Em todos os algoritmos de otimização, sem exceção, e não apenas no GA, a ordem dos operadores (métodos) é sempre a mesma

Não consegui descobrir por que em alguns algoritmos o Moving sem entrada e em outros com entrada.
for (uint i = epochCount; (bool)i--;)
{
  AO.Moving() // Moving(i)

  for (uint set = ArraySize(AO.aName); (bool)set--;)
    AO.aName[set].f = FF(AO.aName[set].c);
                                                                     
  AO.Revision();
}
 
fxsaber #:
Não consegui entender por que alguns algoritmos de movimentação têm movimentação sem entradas e outros com entradas.

Esse é um caso em que é necessário levar em conta o número da época atual em uma das fórmulas do algoritmo. Solução infeliz e mais uma exceção do que uma regra, em outros algoritmos o contador de época é seu próprio interior.