• Nenhum resultado encontrado

Programação Genética guiada por gramática

Existem duas reais motivações para combinar gramática e GP (O’NEILL e RYAN, 2001). Primeira, permite-se que o usuário incorpore na gramática conhecimento prévio sobre o domínio do problema para ajudar a guiar a busca. Segunda, elimina as chances da não satisfação da propriedade de fechamento através da definição das regras de produção da gramática. Inicialmente, abordagens baseadas em GGGP representavam uma pequena parcela das técnicas desenvolvidas em GP. No entanto, este cenário mudou, e o número de trabalhos envolvendo GGGP têm crescido (MCKAY et al., 2010; O’NEILL e RYAN, 2001).

Abordagens baseadas em GGGP apresentam os seguintes componentes: i) Gramática, ii) Mecanismo de busca e iii) Processo de mapeamento genótipo/fenótipo. As regras de produção do programa/algoritmo precisam ser definidas na gramática. Uma solução (genótipo) presente no mecanismo de busca, antes de ser avaliada, precisa ser convertida para um programa (fenótipo) através do processo de mapeamento. Uma vez convertida em programa, a solução pode ser avaliada através de uma função de avaliação. A seguir é apresentado o funcionamento geral do GGGP (ver Figura 10). O primeiro passo a ser dado é definir a gramática. Esta pode ser representada por uma tupla, (N, T, P, S), onde N é o conjunto de símbolos não-terminais, T é o conjunto de símbolos de terminais, P é o conjunto de regras de produção que mapeiam os elementos de N a T , e S é o símbolo de início, membro de N .

Para contextualizar os termos apresentados, a figura 9 apresenta um exemplo de uma gramática para a construção de indivíduos que representam equações matemáticas para um problema de regressão simbólica1.

Uma vez definida a gramática, um conjunto de indivíduos ou genótipos será gerado aleatoriamente como população inicial do mecanismo de busca. Considerando a gramática apre- sentada, um exemplo de indivíduo seria Sin(X) + Cos(X ∗ X). Cada indivíduo da população será traduzido de genótipo para um programa (no caso do exemplo, uma equação matemática cal- 1 A regressão simbólica é um dos processos de busca de funções para um modelo matemático, que é descrito no

Figura 9 – Exemplo de gramática para a geração de indivíduos no contexto do problema de regressão simbólica.

Fonte: o autor

culável) através do processo de mapeamento. Em seguida, cada indivíduo gerado será executado no problema dado, e seu valor de fitness armazenado. Estes passos iniciais antecedem o processo iterativo do algoritmo. Uma vez avaliados todos os indivíduos da população, são selecionados os melhores pais e sobre estes são aplicados operadores genéticos de mutação e cruzamento. Após a aplicação dos operadores sobre os pais, novos indivíduos são gerados. Como apenas os melhores filhos (genótipos) permanecem na população na próxima iteração, estes precisam ser traduzidos através do processo de mapeamento e assim terem seus valores de fitness executados da mesma forma como explicado previamente.

Dentre as abordagens de GGGP criadas, destacam-se os algoritmos de GGGP base- ados em árvore e genoma linear (MCKAY et al., 2010). Estas abordagens adotam o mesmo funcionamento apresentado na figura 10, sendo suas peculiaridades apresentadas a seguir.

Nas abordagens baseadas em árvore, os genótipos são representados por árvores de derivação produzidas a partir de uma gramática. A avaliação da solução acontece através da leitura da árvore de expressões (genótipo) de cada indivíduo a partir das folhas da árvore de

Capítulo 2. Conceitos básicos 35

Figura 10 – Funcionamento do GGGP.

Fonte: o autor

derivação. Uma vez construída a solução, o programa/algoritmo é executado. Assim como GP, GGGP baseado em árvore utiliza operadores genéticos como seleção, mutação, reprodução e cruzamento. No entanto, os operadores de cruzamento e mutação precisaram ser adaptados. Com relação à mutação, um nó interno é escolhido aleatoriamente. Em seguida, uma sub-árvore originada a partir daquele nó é removida, e então, substituída por outra gerada aleatoriamente seguindo as regras da gramática. Este procedimento pode ser visto na figura 11. Como pode ser visto nesta figura, o nó selecionado foi o Sub e toda a sub-árvore abaixo dele foi modificada.

Com relação ao cruzamento, dois nós internos da árvore de derivação são selecionados aleatoriamente, e suas respectivas sub-árvores são trocadas. É importante mencionar que o mecanismo de cruzamento exige que ambos os nós selecionados possuam o mesmo rótulo

Figura 11 – Exemplo de operador de mutação em GGGP.

Fonte: (MCKAY et al., 2010)

descrito na gramática. A figura 12 apresenta um exemplo da operação de cruzamento. Como pode-se ver, foram selecionados dois nós internos com o mesmo rótulo NP e suas sub-árvores foram trocadas. Vale destacar que existem outras implementações de operadores evolucionários para abordagens baseadas em árvores, podendo estas serem encontradas em (MCKAY et al., 2010). Dentre as abordagens baseadas em árvore, destacam-se a CFG-GP (do inglês, Context- free Grammar Genetic Programming) (WHIGHAM, 1995) e LOGENPRO (do inglês, Logic grammar-based genetic programming) (WONG e LEUNG, 1997). No entanto, outros algoritmos baseados em árvore podem ser encontrados em (MCKAY et al., 2010).

Nas abordagens baseadas em genoma linear, o genótipo adota uma estrutura de sequência linear (vetor de genes) para ser manipulado pelos operadores genéticos, e o fenótipo adota a representação de árvore de expressões (fenótipo). A estrutura linear como forma de representar o genótipo oferece algumas vantagens quando comparado com abordagens baseadas em árvore. O benefício mais aparente é que esta representação permite o uso da teoria e prática da área de computação evolucionária, que também utiliza representação linear, tais como GA e estratégias baseadas em evolução (do inglês, Evolution Strategy) (ES). Deste modo, operadores genéticos comumente utilizados tornaram-se disponíveis para operar sobre genótipos no formato linear. Este benefício fez com que as abordagens baseadas em genoma linear chamassem a atenção da área tornando-se largamente estudadas (MCKAY et al., 2010).

Ao longo dos anos, diferentes abordagens lineares foram propostas como apresentado em (MCKAY et al., 2010). Porém, Evolução Gramatical (do inglês, Grammatical Evolution) (GE) (O’NEILL e RYAN, 2001) tornou-se a variação de GGGP, que adota genoma linear, mais utilizada (MCKAY et al., 2010). Uma das primeiras aplicações foi na evolução da topologia de redes neurais artificiais (GRUAU, 1996; HUSSAIN e BROWSE, 1998). Também foi utilizada em regressão de funções simbólicas (KELLER e BANZHAF, 1996; MCCONAGHY e GIELEN,

Capítulo 2. Conceitos básicos 37

Figura 12 – Exemplo de operador de cruzamento em GGGP.

Fonte: (MCKAY et al., 2010)

2006; O’NEILL e RYAN, 2001), agrupamento de tarefas em mineração de dados (FALCO et al., 2005), e evolução de conjunto de regras (O’NEILL et al., 2001; TSAKONAS et al., 2004; WONG, 1998). Também são identificados trabalhos que aplicaram GE em problemas de otimização combinatória (BADER-EL-DEN; POLI; FATIMA, 2009; SOTELO-FIGUEROA et al., 2013; BURKE; HYDE; KENDALL, 2012; KELLER e POLI, 2007b; KELLER e POLI, 2007a; SABAR et al., 2013; MASCIA et al., 2014).

A principal diferença existente entre o GE e abordagens baseadas em árvore é o processo de mapeamento. Como o genótipo é representado por um vetor de genes, cada elemento do vetor, também chamado de códon, assume valores numéricos de 8-bits. Cada códon representa uma regra quando convertido pelo processo de mapeamento, e vai determinar qual regra será utilizada. O processo de mapeamento utiliza o genótipo para mapear símbolos de início em símbolos terminais. Isto se dá através da leitura códon por códon (esquerda para a direita) gerando-se um número inteiro que diz respeito a uma regra na gramática (ver figura 9:

regra = (valor inteiro do códon) MOD

(número de regras do item não terminal atual).

para selecionar:

(2) < op >::= + (0)

| − (1)

| / (2)

| ∗ (3)

Supondo-se que o códon lido correntemente tenha um valor 6 então 6 MOD 4 = 2, resultando na regra 2. O processo de mapeamento ocorre de forma circular até que não haja mais possibilidade de expansão.

Para exemplificar o processo de mapeamento, será considerado o indivíduo representado na Figura 13.

Figura 13 – Indivíduo representado por array de 8-bits.

Partindo do símbolo de início < expr >, 4 possíveis regras de produção são identificadas. A escolha da regra se dá através da leitura do valor do primeiro códon do indivíduo, usando-se para gerar um número. Este número é calculado através do procedimento mostrado previamente 220 MOD 4 = 0, o que significa que a regra de índice 0 substituirá o símbolo < expr >:

< expr >< op >< expr > .

Agora, tem-se 3 símbolos a serem traduzidos. O primeiro a ser lido sempre é o símbolo mais à esquerda, neste caso < expr >. Repetindo-se o mesmo procedimento, chega-se a 240 MOD4 = 0, sendo a regra de índice 0 selecionada mais uma vez. Isto resulta em:

< expr >< op >< expr >< op >< exp > .

Novamente, tem-se o valor 220 para o símbolo < expr >, resultando na seleção na regra de índice 0, gerando-se:

< expr >< op >< expr >< op >< expr >< op >< exp > .

No próximo passo, o símbolo < expr > assume o valor 203 resultando na regra 3, ou seja, o símbolo < expr > é substituído por < var >. O símbolo < var > possui 2 possíveis regras. Como o valor do próximo códon é 101, a regra 1 é selecionada gerando a seguinte sequência:

Capítulo 2. Conceitos básicos 39

O próximo passo vai determinar qual operador < op > será utilizado. Como existem 4 possíveis opções, 53 MOD 4 = 1. Este processo continua até que uma expressão apenas com terminais seja encontrada, assim como no exemplo a seguir:

1.0 − Sin(X) ∗ Sin(X) − Sin(X) ∗ Sin(X). (2.1)

Embora as abordagens lineares tenham se popularizado, principalmente o GE, existem dois problemas críticos associados à representação linear (WHIGHAM et al., 2015). Primeiro, um genótipo supostamente válido pode resultar em um fenótipo cujo fitness não pode ser avaliado. Embora este problema possa ser solucionado de forma simples através da atribuição de um valor de fitness ruim para estes indivíduos, porém esta solução insere indivíduos inconsistentes no processo de busca. Caso o número de indivíduos inconsistentes seja grande, o bom funcionamento do GGGP linear pode ser prejudicado. O segundo problema associado à representação linear está relacionado ao princípio da localidade. Este princípio afirma que pequenas modificações no genótipo devem resultar em pequenas modificações no fenótipo (WHIGHAM et al., 2015). No entanto, em representações lineares, pequenas modificações no genótipo podem causar grande mudança no fenótipo. Como consequência, o fenótipo pode produzir um comportamento diferente do que foi codificado no genótipo. Em uma situação extrema, onde o número de soluções inconsistentes torna-se elevada, o processo de busca pode funcionar de forma similar à uma abordagem aleatória (WHIGHAM et al., 2015). Reconhecendo-se as problemáticas associadas ao GGGP linear, diversos trabalhos foram desenvolvidos visando entender e melhorar a forma como estes algoritmos operam (MCKAY et al., 2010). Vale salientar que os dois problemas apresentados não acontecem em abordagens baseadas em árvore devido à forma como os indivíduos são representados e como os operadores genéticos funcionam nestes indivíduos. Deste modo, o fato de as abordagens lineares terem sido utilizadas de forma unânime na última década na geração de programas/algoritmos, não significa que esta é a abordagem mais apropriada dentre as abordagens de GGGP já desenvolvidas.

As abordagens de geração de algoritmos têm sido importantes para a área de otimização de algoritmos pois provê meios para projetar novos algoritmos com modelos previamente não considerados. No entanto, um ponto crítico existente na geração de algoritmos, é a avaliação das soluções. Como cada solução do espaço de busca representa um possível algoritmo, o cálculo do desempenho de cada solução é a execução do próprio algoritmo no problema de entrada. Deste modo, a geração de algoritmos torna-se bastante custosa, principalmente quando o número de soluções e iterações da simulação é grande (HARDING e BANZHAF, 2007). Vale salientar que algoritmos de geração de algoritmos propostos na literatura não levaram em consideração este custo, sendo portanto um problema em aberto (MCKAY et al., 2010). No entanto, pode-se citar alguns trabalhos que utilizaram GPUs para tentar acelerar a avaliação dos indivíduos (HARDING e BANZHAF, 2007; ROBILLIARD; MARION; FONLUPT, 2009).