• Nenhum resultado encontrado

5 ALGORITMO GENÉTICO EVOLUCIONÁRIO ESPECIALIZADO:

5.5 IMPLEMENTAÇÃO COMPUTACIONAL DO AGE

5.5.2 Etapas da implementação do AGE

A implementação computacional do AGE é dividida em sete passos, Passo 0 a Passo 6, nos quais compreendem as três etapas do algoritmo (apresentadas na Subseção 5.4.3), como a seguir:

Passo 0 (Etapa 1 - Definição dos Parâmetros Iniciais e População Inicial): O método

GetTickCount inicia a contagem de tempo de execução do algoritmo para cada exemplo testado. Definem-se o parâmetro inicial de controle, p = αn, bem como os demais valores de entrada secundários e matrizes auxiliares, através do método AlimentarValores. Uma população inicial de vetores é gerada pelo método gerarPopulacaoInicial, que é armazenada na matriz Apopde dimensão (p + 1) × 3n, em que a i-ésima linha da matriz corresponde ao i-ésimo indivíduo da população, para todo i = 1, ..., p, e tal que a linha p + 1 inicializa com valores nulos. As linhas 1 ap são preenchidas com números aleatórios da seguinte forma: colunas 1 a n com valores inteiros aleatórios de 1 a n (sequência 1a-S); colunas n + 1 a 2n com valores booleanos 0 ou 1 (sequência 2a-S); e colunas 2n + 1 a 3n, com valores inteiros de 1 a 6 (sequência 3a-S). As linhas 𝑃

2+ 1 a p são preenchidas de acordo com a Heurística HFPI: primeiramente, geram-se os valores aleatórios de maneira idêntica ao estabelecido para as 𝑃

2

primeiras linhas; depois, geram-se valores aleatórios ki

[0, 1), i = 1, . . . , n, para o cálculo dos parâmetros ri; e, por último, reordena-se 1a-S (e os genes

correspondentes de 2a-S e de 3a-S) de acordo com a ordenação crescente dos valores riassociados ao índice i dos respectivos genes.

129

Carregamento, compreendido como a utilização dos métodos 4 a 11, CarregarCaixa,

VerificarSobreposicao, CalcularEMSsobrepostos, TestarEMSsobrepostos, CalcularEMS, TestarEMS, OrdenarEMS e calcularFitness, para decodificar todos os cromossomos contidos nas primeiras p linhas da matriz Apop(em formato codificado), obtendo-se também os valores de fitness associados que são armazenadas em um vetor ffitness, vetor de dimensão (p + 1) × 1. Esse vetor é reorganizado, contendo suas componentes em ordem crescente de valores, bem como as linhas da matriz Apop, por meio do método ordenarPopulacaoInicial.

Passo 2 (Etapa 3(a) - Início do Ciclo Geracional): Verificação do Critério de Parada

(CP). Caso CP = falso, dar continuidade ao Ciclo Geracional contido nos Passos 3 a 6.

Passo 3 (Etapa 3(b) - Seleção): No método GerarPais, executa-se o operador Seleção

aleatória em quatro linhas da matriz Apope compara-se, duas a duas, entre as componentes associadas às linhas selecionadas do vetor ffitness(dois torneios de dois possíveis propostas de solução pais). Os ganhadores dos dois torneios são aqueles que possuem menores

fitness dos dois conjuntos de três valores fitness. As linhas de Apop que forneceram as menores fitness são selecionadas e guardadas como índice das linhas p1 e p2, constituindo-se, portanto, como os cromossomos pais da iteração atual que irão gerar um único descendente, no Passo 4.

Passo 4 (Etapa 3(c) - Recombinação PMX): Uma única nova solução é obtida através da

Recombinação PMX (método recombinacaoPMX) geram-se dois valores inteiros aleatórios

k1 e k2 no intervalo 1 a 𝑛

2, para k1, e k1 a n, para k2; criam-se os vetores s1 e s2

(subsequências s1 e s2 da Subseção 5.3.2) tal que s1(i) = Apop(p1, k1 + i − 1) e s2(i) =

Apop(p2, k1 + i − 1), i = 1, . . . , k2k1 + 1; em seguida, cria-se o vetor cromo-filho de 3n

componentes e de genes iguais a zero, que é atualizado de acordo com a estratégia PMX. Para essa atualização, inicialmente copiam-se para os genes de cromo-filho os valores das componentes de s1: cromo-filho(k1 + i − 1) = s1(i). Se k1 ƒ= 0, então existem genes antes da subsequência de genes de k1 a k2 para serem atualizados no vetor cromo-filho. Para isso, conta-se o número l1 de genes de p2, das posições 1 a k − 1, que possuem valores iguais aos armazenados no vetor s1, copiando-se nas componentes de posição 1 a k1 − 1 do

cromo-filho, que são diferentes dos genes de s1, os genes de p2 de índices associados:

cromo-filho(j) = p2(j), j = 1, . . . , k1 − 1, quando p2(j) ƒ= s1(i), para todo i = 1, . . . , k2

130 também são distintos dos valores de s1. Um contador armazena o número de posições de s1, l3, que obtiveram valores de s2 iguais aos de s1, até obter as l1 primeiras posições de genes distintos. De forma análoga, se k2 ƒ= n, então existem genes depois da subsequência de genes de

k1 a k2 para serem atualizados no vetor cromo-filho. Então, conta-se o número l2 de genes de p2, das posições k2 + 1 a n, que possuem valores iguais aos armazenados no vetor s1, copiando-se nas componentes de posição k2 + 1 a n do cromo-filho, que são diferentes dos genes de s1, os genes de

p2 de índices associados: cromo-filho(j) = p2(j), j = k2 + 1, . . . , n, quando p2(j) ƒ= s1(i), para todo i = 1, . . . , k2 − k1 + 1. Para as l2 posições não copiadas, copiam-se os l2 valores de s2, investigados a partir das posições l1 + l3 + 1 até k2, que também são distintos dos valores de s1. Essa estratégia da Recombinação PMX refere-se estritamente à formação dos primeiros n componentes do

cromo-filho (sequência 1a-S): cromofilho(l), l = 1, . . . , n. Porém, as sequências 2a-S e 3a-S

também são formadas em cromo-filho (posições n + 1 a 3n), de acordo com o que foi determinado na formação de 1a-S. Isto quer dizer que se cromo-filho(l) é atualizado como um gene m de p1,

p1(m), para algum m = 1, . . . , n, ou seja, cromo-filho(l) = p1(m), então também atualizam-se

cromo-filho(l + n) = p1(m + n) e cromo-filho(l + 2n) = p1(m + 2n). Análogo, se a atualização de

cromo-filho for a partir de p2.

Passo 5 (Etapa 3(d) - Mutação): Utilizando-se o método MutacaoFilho, geram-se dois

valores inteiros aleatórios t1 e t2, de 1 a n, que tenham uma distância de t% entre si. O cromossomo filho mutante tem os valores correspondentes à posição t1, t1 + n e t1 + 2n

permutados, respectivamente, com os genes da posição t2, t2 + n e t2 + 2n. Ao final, o método criarCarregamentoMutante é executado para construir um carregamento para o cromossomo mutante.

Passo 6 (Etapa 3(e) - Fitness e Atualização da População): Utilizando o Decodificador

Carregamento, calcula-se a fitness do descendente mutante através do método

verificarFitnessMutante, comparando-a com a pior fitness da população inicial (que está armazenada na primeira posição do vetor ffitness, por ser o maior valor). Se a fitness do descendente mutante for menor que a pior fitness, então a pior fitness é descartada, juntamente com a respectiva linha da matriz Apop. Neste caso, há uma atualização da população, tal que os valores da fitness e os genes do cromosso mutante são inseridos no vetor ffitness (preservando-se a ordenação crescente de valores) e na matriz Apop, respectivamente, voltando o algoritmo ao Passo 2. O cromossomo descartado é atualizado para a linha p + 1 de Apop. Caso a fitness do descendente mutante for igual ou pior à fitness da primeira componente do vetor ffitness, então, retorna-se diretamente ao Passo 2, para uma nova tentativa de produzir um mutante que forneça o melhoramento da população atual.

131