Aula 06
Aula 06
Aula 06
APLICADA
AULA 6
CONTEXTUALIZANDO
A teoria da evolução de Darwin foi um dos conceitos que revolucionaram
a ciência no século XIX. Em meados do século XX, a ideia de evolução permitiu
a concepção de sistemas que se modificam de acordo com um conjunto de
operações específicas, na busca da solução de um problema.
Em vez de solucionar um problema de busca por meio de procedimentos
analíticos, pode-se começar com uma solução parcial e, ao longo de várias
iterações, fazer evoluir essa solução até chegar a uma boa o bastante. Um dos
representantes da linha de pesquisa evolucionária são os Algoritmos Genéticos,
que permitem a abordagem de um problema, considerando a evolução de
soluções parciais. Geralmente são aplicados em problemas dos quais não se
tem muito, ou mesmo nenhum conhecimento. Estudaremos agora alguns dos
conceitos importantes dessa técnica relevante de IA.
2
efetuar a busca em problemas considerados intratáveis. A aplicação de
algoritmos genéticos se faz em várias áreas, tais como a arquitetura de circuitos
eletrônicos, planejamento e roteirização, programação de games, previsão do
tempo e ainda descoberta de identidades matemáticas (RUSSEL; NORVIG,
2004).
Podemos afirmar que um AG é considerado um algoritmo de busca em
feixe estocástica, em que os estados sucessores são criados a partir da
combinação de dois (ou mais) estados “pais”, em vez de serem criados a partir
da variação de um único estado. Temos assim uma analogia com a seleção
natural proveniente da biologia. A busca em feixe se dá pelo uso de uma
população inicial gerada aleatoriamente, que evolui ao longo das “gerações”
(iterações do algoritmo). A produção de uma nova população é
avaliada por uma “função objetivo”, ou “função de fitness”. Essa função
retorna à nova população, priorizando os estados melhores
(RUSSEL; NORVIG, 2004, p. 115).
Dos principais fatores que têm feito dos AG uma técnica de busca
bem-sucedida e utilizada, estão (AZEVEDO, 2000, p. 35):
3
encontrar uma solução ótima. Diferente das técnicas de busca convencionais, as
principais diferenças residem em (AZEVEDO, 2000, p. 37):
4
(c) Concede a cada membro da nova população a chance da
operação de mutação.
Seleção;
5
Cruzamento ou crossover;
Mutação.
6
de alternativas oferecidas pelo AG. Isso permitirá que as melhores soluções, que
estejam próximas de uma solução ótima (se esta existir) sejam criadas. Portanto,
o tamanho da população deve ser grande, levando-se em conta as restrições
físicas (GOMEZ, 2005). O que limita o tamanho da população é o tempo que vai
demorar o AG na sua execução, e a quantidade de memória para guardar a
população.
Qual a melhor forma de terminar a execução do AG? A abordagem mais
simples é rodar o algoritmo de busca por um número fixo de gerações – quanto
mais gerações, melhor. Outra abordagem é encerrar o algoritmo se, depois de
passadas algumas gerações, não se obtiver uma melhora na adaptação do
melhor indivíduo da população. Ou seja, a variação dos melhores indivíduos
obtidos para os que são criados novamente é mínima. Dessa forma, adotar um
limiar de variação pode reduzir o número de gerações na execução de um AG.
f ( x) 2 ( x 3)2 ( y 2)2
7
Sabemos de antemão que o valor máximo dessa equação se encontra no
ponto x=3 e y=2, com f(x)=2. Podemos ver na Figura 1 o gráfico dessa equação,
mostrando visualmente o ponto de máximo que se pode obter.
8
Decimal Binário
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
001101
x y Cromossomo
3 6 011110
6 4 110100
3 5 011101
7 0 111000
3 7 011111
1 6 001110
1 2 001010
5 4 101100
6 1 110001
9
4 2 100010
x y Cromossomo (x,y)
3 6 011110 8
6 4 110100 15
3 5 011101 3
7 0 111000 32
3 7 011111 5
1 6 001110 8
1 2 001010 0
5 4 101100 8
6 1 110001 18
4 2 100010 3
x y Cromossomo (x,y)
1 2 001010 0
3 5 011101 3
4 2 100010 3
3 6 011110 8
1 6 001110 8
5 4 101100 8
6 4 110100 15
3 7 011111 15
10
6 1 110001 18
7 0 111000 32
x y Cromossomo (x,y)
1 2 001010 0
3 5 011101 3
4 2 100010 3
3 6 011110 8
1 6 001110 8
5 4 101100 8
6 4 110100 15
3 7 011111 15
6 1 110001 18
7 0 111000 32
11
3 6 011110 8 1
x y Cromossomo (x,y)
001001
001001
001010
001010
011110
011110
011101
100010
100010
011110
12
100010
011010
x y Cromossomo (x,y)
1 3 001011 1
1 1 001001 3
3 2 011010 0
1 2 001010 0
3 6 011110 8
3 7 011111 15
3 5 011101 3
5 2 101010 8
4 2 100010 3
3 2 011010 0
13
Temos assim uma nova população. Podemos notar que nesta geração, o
valor máximo obtido foi 1, relativo ao ponto x=1 e y=3. Para as próximas
gerações, o algoritmo genético deve ser executado a partir do passo e),
continuando até obter o valor máximo da função objetivo considerada.
Esse exemplo demonstra a dinâmica do AG de uma forma simplificada,
porém permitindo visualizar a aplicação dos operadores de seleção, cruzamento
e mutação. A faixa de valores foi tratada com números inteiros, mas poderíamos
adotar números reais. Por exemplo, um cromossomo com tamanho total 30 (15
bits para cada variável), com o alfabeto binário, os pontos tomados ao acaso
x=3,07 e y=2,13, teriam a seguinte representação codificada em binário para o
cromossomo:
100010000111010110001001100100
TEMA 3: AG EM JAVA
Para a abordagem desse mesmo problema, utilizando linguagem de
programação, utilizaremos a biblioteca Java API for Genetic Algorithms (JAGA).
Essa biblioteca consiste em uma série de classes para o uso em diversos tipos
de problemas. Para exemplos que lidem com aspectos comuns dos AG,
podemos criar uma classe de exemplo com o problema em questão. Outra classe
deve ser criada para definir a função objetivo.
14
Para saber mais...
public Example1() {
}
15
// Inclui a reprodução da nova população com
crossover e mutação
CombinedReproductionAlgorithm repAlg = new
CombinedReproductionAlgorithm();
repAlg.insertReproductionAlgorithm(0, new
SimpleBinaryXOver(0.9));
repAlg.insertReproductionAlgorithm(1, new
SimpleBinaryMutation(0.02));
params.setReproductionAlgorithm(repAlg);
// Constrói o AG
ReusableSimpleGA ga = new
ReusableSimpleGA(params);
// Associa o analisador
AnalysisHook hook = new AnalysisHook(System.out,
false);
ga.addHook(hook);
16
final int attempts = 1;
// Executa o AG
GAResult [] allResults = new GAResult[attempts];
for (int i = 0; i < attempts; i++) {
hook.reset();
GAResult result = ((ReusableSimpleGA)
ga).exec();
allResults[i] = result;
}
System.out.println("\nALL DONE.\n");
for (int i = 0; i < attempts; i++) {
System.out.println("Result " + i + " is: " +
allResults[i]);
}
17
Figura 3: Classe Example1Fitness.java, que contém o método responsável pela avaliação da
função objetivo
public Example1Fitness() {}
18
verificar se o AG pode encontrar uma solução mais próxima da calculada
deterministicamente.
Figura 4: Tela de saída de uma execução da classe Example1.java, mostrando que, após
10000 gerações, foi encontrado o melhor resultado para os valores x=2.97 e y=1.94, resultando
a função objetivo f(x) = 1.9955
ALL DONE.
19
7 2.97 2.04 1.9975 1259
8 3.00 2.01 1.9999 2102
9 2.99 2.00 1.9999 9165
10 2.07 2.01 1.9990 2341
SÍNTESE
Nesta aula foi estudada uma introdução aos Algoritmos Genéticos, que
fazem parte da linha de pesquisa evolucionária. Um AG faz parte da classe de
algoritmos de busca, indo atrás de uma solução dentro de um espaço para um
problema específico de otimização.
Os algoritmos genéticos podem ser uma boa opção para efetuar a busca
em problemas considerados intratáveis. A busca em feixe estocástico se deve
ao uso de uma população inicial gerada aleatoriamente, que evolui ao longo das
iterações do algoritmo. A produção de uma nova população é avaliada por uma
função objetivo ou de fitness. AG é uma técnica bem-sucedida, simples de
operar, de fácil implementação, eficaz na busca da região onde provavelmente
se encontra o máximo global e aplicável em situações em que se tem pouco ou
nenhum conhecimento do modelo ou, ainda, esse é impreciso. Um algoritmo
genético possui como principais operadores a seleção, o cruzamento ou
crossover e a mutação. Um indivíduo que é uma solução em um AG é codificado
por meio de um cromossomo, conforme o alfabeto utilizado pelo AG.
20
REFERÊNCIAS
RUSSEL, S.; NORVIG, P. Inteligência Artificial. Tradução da 2. ed. Rio de
Janeiro: Campus, 2004.
21