É necessário mapear números inteiros para bits em um algoritmo genético?


8

Pelo que li, algoritmos genéticos são geralmente (sempre?) Aplicados a cromossomos de bits. Portanto, se um problema envolve maximizar uma função que aceita valores inteiros, os inteiros são primeiro codificados como bits.

Esse mapeamento é necessário? Parece que você pode pegar cromossomos de números inteiros e aplicar crossover e mutação diretamente. Portanto, se eu tenho uma função que aceita 35 entradas inteiras, posso aplicar os operadores genéticos a esses números inteiros, e não nos bits 35xB (onde B é o número de bits necessários para codificar um número inteiro). Existe uma razão para isso não ser feito?

Talvez o algoritmo sofra porque o problema é definido de forma mais grosseira (ou seja, um problema pode ser definido com cromossomos mais curtos se não estivermos usando bits), mas estou curioso para saber se alguém tem uma resposta melhor.


1
Não tenho conhecimento do domínio do problema em que você está, mas intuitivamente parece útil e potencialmente benéfico nesse contexto lidar diretamente no idioma do computador, em vez de proxies numéricos como valores inteiros. Mas se lidar com números inteiros é mais conveniente, faça isso de qualquer maneira. As redes neurais costumam lidar com números de ponto flutuante, mesmo que haja vantagens significativas em arquitetá-las de maneira binária.
Robert Harvey

Dado que o DNA usa pedaços de 2 bits, acho que a resposta não pode ser "não", pelo menos na medida em que algoritmos genéticos modelam a evolução biológica.
Gort the Robot

Respostas:


9

Codificar os valores como bits não é necessário. Veja o vagão 2d (não perca muito tempo) para ver um exemplo em que o cruzamento é feito com valores inteiros (flutuantes). 'Assembléias' inteiras são cruzadas, isso aumenta o reconhecimento da fonte (parte da estética do jogo), mas faz com que as variações entre um determinado cromossomo e seus pais sejam mais limitadas.

O motivo para considerar o uso de bits em vez de números inteiros tem a ver com o intervalo de dados com o qual o pool é propagado. Ter 35 números inteiros significa que o cruzamento só pode ocorrer em 35 valores que são tomados como valores inteiros. ter 1120 bits (números inteiros de 35 * 32 bits) fornece uma granularidade mais fina (considere o trabalho tradicional dos 'algoritmos genéticos' no ATCG - não os 'valores' inteiros 'de aminoácidos ou proteínas).

Ter bits permite que você tenha mutações 'mais limpas' (vire um pouco) e crossover que ocupa a parte superior de um número inteiro e a parte inferior de outro. Ambas as coisas ajudam a aumentar a variedade potencial de filhos.

Considere o cromossomo de apenas dois bytes (estamos executando bytes em vez de números inteiros para facilitar a visualização):

chromosome 1: 0xA3 0xB2
chromosome 2: 0x12 0x34

O cruzamento entre esses dois cromossomos pode acontecer apenas em locais limitados. Você terminará com:

chromosome 1': 0x12 0xB2
chromosome 2': 0xA3 0x34

Se isso foi feito como bits:

chromosome 1: 1010001110110010
chromosome 2: 0001001000110100
                    ^   ^     

Agora você pode selecionar os ^sites para dar crossover:

chromosome 1': 1010001000110010
chromosome 2': 0001001110110100
                     ^   ^     

Isso fornece um modelo mais rico com mais variações possíveis entre dois cromossomos.


Obrigado. Foi isso que quis dizer ao dizer que o problema era "mais grosseiro", mas você deu uma resposta clara e agradável.
itzy

3

Contanto que você tenha um crossover e uma mutação, estará no negócio. O tipo subjacente não importa. Eu já vi AGs em estruturas gráficas em que o crossover e o mutate operam diretamente nos gráficos, adicionando ou combinando nós.

Na verdade, eu normalmente codifico tudo para caracteres e, em seguida, forneço crossover e mutações no nível de bytes, em vez de bits. Não é difícil adicionar uma máscara de bits para levá-la ao nível de bits, mas a vida é muito curta.


0

No GA, todos os cromossomos são geralmente representados como cadeias de bits. Você pode ter exceções, mas vamos esquecê-las por enquanto.

Um cromossomo é uma solução possível para o seu problema; portanto, se sua solução for um número inteiro, ela deverá ter uma representação binária para ser trabalhada pelas operações genéticas. Felizmente, números inteiros já possuem essa representação binária (na verdade, eles são * cadeias de bits nativas); portanto, você não precisa fazer nada, basta aplicar os operadores sobre os indivíduos da sua população ao longo do processo de evolução.


0

O mapeamento não é necessário.

A evolução diferencial (DE) é um "subconjunto" muito bem-sucedido do espaço mais amplo dos algoritmos genéticos.

A primeira grande mudança é que DE está usando números reais / inteiros reais em vez de cadeias de bits (geralmente números reais para otimização numérica, números inteiros em outros campos).

De qualquer forma, é bom poder representar as coisas como números reais.

É uma maneira de usar os recursos do computador com eficiência e também torna a entrada e a saída transparentes para o usuário: os parâmetros podem ser inseridos, manipulados e gerados como números comuns, sem nunca serem reformatados como genes com uma representação binária diferente.

Para o problema de ser "definido de forma mais grosseira" , o DE adota operadores de mutação / crossover modificados que fazem uso da diferença entre dois ou mais vetores inteiros / reais na população para criar um novo vetor (por exemplo, adicionando uma proporção aleatória da diferença para um dos vetores existentes, além de uma pequena quantidade de ruído aleatório).

Esquema para gerar vetores de parâmetros de teste

Da evolução diferencial - uma abordagem prática à otimização global

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.