You are on page 1of 22

See

discussions, stats, and author profiles for this publication at: https://www.researchgate.net/publication/261026533

Algoritmos Genticos em Java


ARTICLE AUGUST 2010

READS

686

1 AUTHOR:
Leandro Luque
Centro Paula Souza
23 PUBLICATIONS 1 CITATION
SEE PROFILE

Available from: Leandro Luque


Retrieved on: 11 March 2016

Algoritmos Genticos em Java


Conceitos e aplicao
Saiba como a teoria da evoluo das espcies pode ser aplicada na
soluo de problemas
LEANDRO LUQUE E RODRIGO ROCHA SILVA
De que se trata o artigo:

Neste artigo, apresentada uma introduo aos principais conceitos de Algoritmos


Genticos, uma importante subrea da Inteligncia Artificial, e um exemplo de
aplicao a um problema de distribuio de produtos.
Para que serve:

Apresentar conceitos, tcnicas e tecnologias que podem auxiliar desenvolvedores na


criao de produtos com diferenciais competitivos.
Em que situao o tema til:

Com o aumento da oferta de produtos de software, a procura por diferenciais


competitivos passou a ser uma constante no cenrio de desenvolvimento de software.
Tcnicas de Inteligncia Artificial (IA), como os Algoritmos Genticos, desempenham
um papel importante neste cenrio, uma vez que, podem ampliar e tornar mais teis e
interessantes as funcionalidades de uma aplicao.
Algoritmos Genticos em Java:

Algoritmos Genticos, algoritmos de busca e otimizao inspirados na teoria da


evoluo das espcies, compreendem uma importante subrea da Inteligncia Artificial,
que pode agregar valor a produtos de software de diferentes reas. A linguagem Java
possui diversas bibliotecas que permitem a implementao dessa famlia de algoritmos,
sendo a JGAP uma das mais completas e com maior comunidade em atividade. Para
exemplificar os conceitos de Algoritmos Genticos apresentados no artigo e o uso da
biblioteca JGAP, utilizado um cenrio de distribuio de produtos pertencente a uma
classe de problemas conhecida como Problema do Caixeiro Viajante.

O aumento da concorrncia no mercado de software tem direcionado a ateno de


desenvolvedores para conceitos, tcnicas e tecnologias que criem diferenciais
competitivos e contribuam para que seus produtos ocupem uma posio de destaque.
Neste contexto, tcnicas de Inteligncia Artificial (IA) desempenham um papel
importante, uma vez que, se utilizadas com bom senso, bem planejadas e desenvolvidas,
podem ampliar e tornar mais teis e interessantes as funcionalidades de uma aplicao.
Para chegar a tal concluso, basta comparar a utilidade de um software de controle de
emprstimos bancrios, por exemplo, que possui apenas funcionalidades para o registro
e consulta de emprstimos realizados, com outro que utiliza tcnicas de IA1 para
determinar o risco da concesso de um emprstimo para um cliente em funo do seu
perfil e de dados histricos de inadimplncia.
Exemplos de aplicaes de tcnicas de IA incluem a criao de interfaces adaptativas,
alocao de profissionais em tarefas, deteco de intruso e predio de falhas em redes
de computadores, deteco de SPAM, inteligncia em jogos, entre outros. Veja as
referncias, no final do artigo, com links para alguns exemplos disponveis na Web.
Pode-se definir Inteligncia Artificial como sendo uma rea multidisciplinar, inspirada
em processos naturais e relacionada reproduo de capacidades normalmente
associadas inteligncia humana, como a aprendizagem, adaptao, o raciocnio, entre
outras.
Para reproduzir estas capacidades, diversas foram as abordagens adotadas no decorrer
da histria da IA, como a abordagem simbolista, tambm conhecida como simblica ou
cognitiva, baseada em aspectos cognitivos e algortmicos procurando reduzir a
inteligncia a um conjunto de smbolos, regras e passos , a conexionista, baseada na
simulao das estruturas consideradas responsveis pela produo de comportamentos
inteligentes, como os neurnios, e a evolutiva, inspirada na teoria da evoluo das
espcies.
Na Tabela 1, esto listados, para as abordagens citadas, exemplos de subreas e suas
respectivas inspiraes.
Abordagem

Subrea

Inspirao

Conexionista Redes Neurais Artificiais Neurnios biolgicos


Simbolista
Sistemas Especialistas
Inferncia humana
Evolutiva
Algoritmos Genticos
Evoluo das espcies
Tabela 1. Principais abordagens da IA, exemplos de subreas e suas respectivas inspiraes.

As Redes Neurais Artificiais (RNA) so modelos computacionais inspirados na


estrutura e comportamento do crebro humano e so geralmente utilizadas na
reproduo do processo de aprendizagem, associao e generalizao. So efetivas
principalmente no aprendizado de padres reconhecimento de caracteres e voz, dados
em imagens, entre outros.
Os Sistemas Especialistas (SE) so sistemas computacionais que procuram apresentar
um comportamento semelhante ao de um especialista de um determinado domnio,
possuindo a capacidade de armazenar conhecimentos e os utilizar na soluo de
problemas.

Na anlise de risco de crdito, a subrea da IA conhecida como Redes Neurais Artificiais geralmente
empregada algumas vezes em conjunto com Algoritmos Genticos. Alm de tcnicas de IA, existem
outras que podem ser empregadas com este mesmo fim, tais como: regresso linear mltipla,
programao linear, rvore de deciso, entre outras.

Por sua vez, os Algoritmos Genticos (AG) so algoritmos de busca e otimizao


inspirados na teoria da evoluo das espcies, e consideram a busca pela soluo de um
problema como um processo de competio entre solues candidatas.
Devido ao seu potencial de uso em diferentes reas, h um crescente nmero de
aplicaes de AGs, incluindo a gerao de casos de teste de software, reduo do
acoplamento e o aumento da coeso em modelos de classes, a alocao de profissionais
em tarefas, alocao de docentes e salas em instituies de ensino, definio de escalas
de planto mdico, rotas de entrega, otimizao de projetos de carros e avies,
inteligncia em jogos, entre outras.
Neste artigo, sero apresentados os principais conceitos de Algoritmos Genticos e
uma biblioteca voltada para a implementao deste tipo de algoritmo em Java JGAP.
Para ilustrar a aplicao deste tipo de algoritmo e da biblioteca, ser apresentado um
exemplo de otimizao de rotas de distribuio de produtos.

Algoritmos Genticos
Inspirao Biolgica

Os Algoritmos Genticos fazem parte de uma classe de algoritmos, conhecidos como


Algoritmos Evolutivos, inspirados na teoria da evoluo das espcies, proposta
simultaneamente por Charles Robert Darwin e Alfred Russel Wallace.
Esta teoria descreve os mecanismos regentes do processo de evoluo das espcies e,
para entend-la, apresentada, a seguir, uma breve descrio dos seus principais
conceitos.
Em uma comunidade biolgica qualquer, a limitao na disponibilidade de recursos
necessrios sobrevivncia como alimento e abrigo faz com que haja uma
competio, direta ou indireta, entre os indivduos da comunidade.
Os indivduos que possuem diferenciais competitivos que so mais fortes, rpidos,
com maior tolerncia ao frio ou ao calor, entre outros tm maior chance de acesso a
esses recursos ou fazem melhor uso deles e maior tolerncia s agresses impostas
pelo ambiente, o que, consequentemente, aumenta suas chances de sobrevivncia. Estes
diferenciais competitivos, bem como outras caractersticas desejveis e indesejveis,
surgem da combinao gentica decorrente do processo de reproduo e de mutao. A
informao gentica envolvida nesse processo de combinao representada nos
indivduos atravs de uma sequncia de genes, conhecida como cromossomo.
Aqueles indivduos que sobrevivem podem transmitir a seus descendentes algumas das
caractersticas genticas que lhes conferem uma condio privilegiada, caso estas sejam
hereditrias. Em longo prazo, a tendncia que as caractersticas genticas dos
indivduos melhor adaptados ao ambiente estejam presentes em grande parte da
populao.
Este processo, que tende a preservar a informao gentica que gera diferenciais
competitivos em um determinando ambiente, conhecido como seleo natural e a
base da teoria da evoluo das espcies e tambm dos Algoritmos Genticos. O quadro
Exemplo de seleo natural apresenta um exemplo clssico de seleo natural.
Resumindo os conceitos apresentados, pode-se dizer que a teoria fundamenta-se na
ideia de que um processo de seleo, associado a mecanismos de reproduo e mutao
de indivduos, possibilita a evoluo gradual da qualidade gentica de populaes.

Exemplo de seleo natural


Um bom exemplo de seleo natural o fenmeno conhecido como
melanismo industrial, percebido inicialmente na segunda metade do sculo
XIX. Antes da industrializao, os indivduos de uma espcie de mariposas

Biston betularia da regio de Manchester, na Inglaterra, eram


predominantemente claros, sendo que os indivduos escuros correspondiam
minoria.
Aps a instalao de indstrias na regio, foi observada uma inverso neste
cenrio: as mariposas claras passaram a ser minoria, enquanto as escuras
tornaram-se maioria (Figura Q1).

Figura Q1. Mudana na populao de mariposas aps a industrializao fenmeno


conhecido como melanismo industrial.

A seleo natural pode ser utilizada para explicar o porqu de tal mudana2.
As mariposas desta espcie tm o hbito de pousar sobre troncos de rvores
que, em locais no poludos, so cobertos por liquens, que do aos troncos
uma colorao clara. Nesses locais, ao pousar sobre troncos cobertos por
liquens, as mariposas claras no so to visveis, enquanto as mariposas
escuras se tornam presas fceis de seus predadores os pssaros. Para este
ambiente, a cor da mariposa clara lhe conferia um diferencial competitivo.
Na Figura Q2, lado esquerdo, difcil perceber a presena de uma mariposa
clara, destacada no lado direito.

Figura Q2. Diferencial competitivo das mariposas claras antes da industrializao.

Com a industrializao, a fumaa e a fuligem lanadas pelas fbricas


provocaram a morte dos liquens, deixando os troncos das rvores expostos.
Dessa forma, o substrato utilizado pelas mariposas para pouso adquiriu
colorao escura e, com isso, as mariposas claras tornaram-se mais facilmente
identificadas do que as escuras (Figura Q3). Com o tempo, os indivduos
escuros passaram a predominar sobre os claros. Para este novo ambiente, a
cor da mariposa escura lhe conferia um diferencial competitivo.

Apesar de existirem alguns autores contrrios ideia de que a seleo natural seja o processo regente
no melanismo industrial, h um nmero muito maior de autores e trabalhos que corroboram o papel da
seleo natural.

Figura Q3. Diferencial competitivo das mariposas escuras aps a industrializao.

Com o tempo, nos dois casos, os indivduos que apresentavam colorao que
os camuflava apresentavam maior chance de sobrevivncia e, portanto, de
transmitir tal caracterstica aos descendentes. O resultado foi a mudana
gradual na frequncia de indivduos de cada uma das cores.
Aplicao da Teoria da Evoluo na Soluo de Problemas

Baseados nesta ideia, diversos procedimentos para a soluo de problemas surgiram a


partir de meados do sculo XX, entre eles, os Algoritmos Genticos. Estes
procedimentos procuram simular computacionalmente os processos de reproduo,
mutao e seleo natural.
Nesta simulao, solues de um problema representam os indivduos de uma
populao. Cada soluo representada atravs de uma estrutura, formada por
sequncias de smbolos, que deve ser definida de forma a permitir que os processos
citados sejam realizados. Estas estruturas representam os cromossomos dos indivduos,
enquanto seus smbolos representam os genes.
A seleo natural simulada atravs de uma funo que associa s estruturas, valores
numricos que especificam a qualidade das solues. Os processos de reproduo e
mutao so simulados atravs da combinao e alterao das estruturas das solues.
Os princpios bsicos do AG podem ser aplicados de diferentes maneiras, produzindo
algoritmos ligeiramente diferentes. Na Figura 1, apresentado um diagrama de
atividades de uma forma bastante comum de aplicao de AGs.
A primeira etapa para a aplicao de um AG consiste na criao de uma populao
um conjunto de solues candidatas para o problema que se deseja resolver. A partir
da populao de solues candidatas, novas solues so geradas atravs de processos
que simulam a reproduo e a mutao.
Em seguida, os indivduos so avaliados e o processo de seleo natural simulado
para escolher as solues que permanecero na prxima execuo do algoritmo. Caso os
critrios de parada que determinam quando o algoritmo deve deixar de ser executado
no sejam atendidos, as etapas, a partir da reproduo, so novamente executadas.
Caso contrrio, o algoritmo deixa de ser executado e a melhor soluo encontrada
retornada.

Figura 1. Etapas bsicas de um Algoritmo Gentico.

Para ilustrar estas etapas, ser apresentado um exemplo de distribuio de produtos3:


Uma empresa distribuidora de produtos recebeu a lista de vrios clientes e precisa lhes
entregar produtos. Procurando reduzir custos, a empresa deseja encontrar a rota mais
curta de entrega, o que, neste caso, acarreta em um gasto menor. Este problema, da
forma como foi descrito, pertence a uma classe de problemas conhecida como Problema
do Caixeiro Viajante (Travelling Salesman Problem TSP)4
3

Mais adiante, no artigo, ser abordada a implementao deste exemplo utilizando a biblioteca JGAP.
Substituindo os produtos por pacotes de rede e os clientes por roteadores, o mesmo problema poderia
ser estendido para um cenrio de otimizao na transmisso de pacotes de redes.
4

Uma primeira ideia para encontrar a melhor rota seria listar todas as rotas possveis e
compar-las umas com as outras, o que conhecido como mtodo da fora bruta ou
busca exaustiva. No entanto, pode no ser vivel resolver este problema dessa forma, j
que para apenas 20 clientes, por exemplo, o nmero de rotas possveis superior a dois
quintilhes calculado atravs do fatorial de 20 , o que exigiria muito tempo e
capacidade de processamento. Neste caso, os AGs podem ser utilizados5.
Para simplificar a estrutura das solues do problema, ser suposto que so apenas 10
os clientes da distribuidora, embora o mesmo raciocnio seja extensvel para um nmero
qualquer de clientes.
Conforme citado anteriormente, no incio de um algoritmo gentico, deve ser criada
uma populao de solues rotas que podem ser seguidas para o problema. Uma
ideia de estrutura para essas solues seria determinar, em ordem, os clientes que sero
visitados.
Desta forma, estas estruturas cromossomos so compostas por uma sequncia de
dez genes, cada um podendo assumir um valor que vai de C 1 a C10. Estes valores que
um gene pode assumir so conhecidos como alelos.
Na Figura 2, so apresentados dois exemplos de solues, cada uma representando
uma rota de viagem para a distribuio dos produtos. A primeira soluo, por exemplo,
determina que, aps sair da distribuidora, o cliente 1 visitado. Em seguida, o cliente 7,
e assim por diante.

Figura 2. Exemplo de estruturas de solues candidatas (vetores) para o problema de


distribuio de produtos e as rotas que elas representam (grafo).

A definio do nmero de solues geradas geralmente baseada em experincias


anteriores com a mesma classe de problemas que se deseja resolver. Um nmero muito
pequeno de solues pode no garantir a variabilidade adequada resoluo do
problema, enquanto um nmero muito grande pode tornar o processo de resoluo mais
lento. Em muitos trabalhos da rea, o nmero de solues geradas prximo de 100.
Aps a criao de uma populao de solues, deve-se realizar a reproduo entre os
indivduos para a produo de novos indivduos. Existem diversas formas de realizao
da reproduo (veja o quadro Reproduo). Uma delas, no to apropriada para este
tipo de problema, mas simples para o momento, envolve a criao de duas novas
solues a partir da combinao de partes de duas solues (cruzamento de um ponto

Diversos mtodos e heursticas o algoritmo de Dijkstra, vizinho mais prximo, cobertura mnima,
entre outros podem ser empregados na soluo desse tipo de problema. Trata-se de um exemplo simples
para o entendimento dos algoritmos genticos.
5

1PX). Para que isso seja feito, definido um ponto de corte que quebra as duas solues
em duas partes e estas partes so combinadas para a produo de novas solues.
Supondo um corte no meio das solues, as novas solues geradas ficariam conforme
representao da Figura 3.

Figura 3. Solues geradas a partir do processo de reproduo.

Aps a realizao da reproduo, a populao conta com quatro indivduos: A, B, C e


D. A mutao, por sua vez, poderia ser aplicada a algumas solues da populao,
representando uma alterao na estrutura das solues (veja o quadro Mutao). Na
Figura 4, possvel observar o resultado da aplicao da mutao na soluo A,
envolvendo a troca do quarto com o nono gene de sua estrutura.

Figura 4. Mutao realizada em uma das solues da populao.

Aps a realizao da reproduo e mutao, entra em cena a seleo natural.


Inicialmente, todas as solues da populao so avaliadas atravs de uma funo de
avaliao, que verifica a qualidade de cada soluo.

Para o exemplo apresentado, a avaliao de cada soluo pode ser feita a partir da
distncia percorrida pelo entregador. A soluo que apresentar a menor distncia
aquela que apresenta a maior qualidade. Para tanto, pode-se utilizar uma tabela de
distncias, como a apresentada na Tabela 2, para a realizao dos clculos.

C1

C2

C3

C5

C6

C7

C8

C9

C10

Distribuidora

10

C1

10

10

10

C2

10

C3

C4

10

10

C5

10

C6

C7

10

C8

10

10

C9

C10

10

Origem

C4

Distribuidora

Destino

Tabela 2. Distncias (em KM) entre a distribuidora e os diferentes clientes.

Como exemplo, a avaliao da soluo A considerando que ela sofreu mutao e


agora sua estrutura aquela obtida aps o processo de mutao poderia ser feita a
partir da soma das distncias entre cada um dos clientes e a distribuidora, conforme
Figura 5.

Figura 5. Clculo da distncia de uma soluo.

Seguindo o mesmo processo, o valor para cada uma das solues da populao est
representado na Figura 6.

Figura 6. Qualidade de cada soluo da populao.

A prxima etapa envolve a seleo das solues que devero seguir para a prxima
gerao. Isto pode ser feito de vrias formas (veja o quadro Seleo). Uma delas
seria selecionar apenas os dois indivduos melhores, que, no exemplo apresentado,
corresponderiam s solues C e D aquelas que possuem a maior qualidade (menor
distncia).
Em seguida, deve-se verificar se as etapas do algoritmo devem ser repetidas,
definindo-se, por exemplo, um nmero mximo de execues do algoritmo ou mesmo
um critrio de encontro de uma soluo aceitvel por exemplo, uma soluo com
percurso inferior a 60 aceitvel. Caso o algoritmo deva continuar, as etapas, a partir da
reproduo, so repetidas, at que o critrio de parada seja atendido.
O algoritmo apresentado, embora no possa garantir que a melhor soluo seja
encontrada, tem trazido excelentes resultados em diferentes reas de aplicao.
A seguir, ser visto como este problema poderia ser implementado em Java com a
biblioteca JGAP.

Reproduo
O processo de reproduo pode ser simulado atravs da criao de cpias
simples ou da combinao de solues atravs de operadores genticos de
cruzamento/recombinao. A escolha do operador gentico que ser
empregado em um AG geralmente baseada em dados obtidos empiricamente
em trabalhos anteriores ou em testes com diferentes operadores e na anlise
dos resultados.
Operadores Genticos de Cruzamento

Os operadores genticos de cruzamento criam novas solues a partir da


combinao de duas ou mais solues existentes. Existem diversos
operadores disponveis, tais como: cruzamento de um ponto (1PX one-point
crossover), dois pontos (2PX two-point crossover) e uniforme (UX uniform
crossover).
Nos exemplos apresentados a seguir, so assumidas estruturas de solues
que aceitam valores binrios.
No operador 1PX, sorteado um nmero inteiro p entre 0 e ng, onde ng igual
ao nmero de genes do cromossomo das solues pais. O primeiro filho
recebe todos os genes de 1 at p do primeiro pai e todos os genes de p+1 at
ng do segundo pai. Com o segundo filho, ocorre o inverso (Figura Q1).
Pai 1

Pai 2

0 1 0
x.
1 1 1

Pai 1
1 0

1o filho
1

1 1 1
Pai 2

2o filho

Pai 1
1 0 1

0 1
Pai 2

Figura Q1. Exemplo de reproduo com um ponto de corte utilizada para gerar dois filhos.

O operador 2PX difere-se do 1PX apenas pelo sorteio de dois pontos, ao


invs de apenas um (Figura Q2).
Pai 1
(P1)

0
x.

1 0

P1
1o filho

P1
1

P1
2ofilho

P2
P2
P2
Pai 2
0 1 1 1 1
(P2)
Figura Q2. Exemplo de reproduo com dois pontos de corte utilizada para gerar dois filhos.

No operador UX, cada gene do cromossomo das solues filhas definido a


partir de um sorteio, que determina de qual das solues pais o gene ser
herdado. Este sorteio pode ser implementado, por exemplo, atravs da gerao
de um nmero pseudoaleatrio inteiro igual a 0 ou 1. Caso o nmero seja 0, a
soluo filha herdar o gene de uma das solues pais. Caso contrrio,
herdar o gene da outra (Figura Q3).
Parente
1 (P1)

1 0

1
1ofilho

x.
Parente
2 (P2)

0 1

P
1
1

1
P
2

P
1
1

P
1
0

1
P
2

2ofilho

0
P
2

1
P
2

P
1
1

1
P
2

1
P
2

Figura Q3. Exemplo de reproduo uniforme utilizada para gerar dois filhos.

Mutao
O processo de mutao pode ser simulado atravs da realizao de pequenas
alteraes na estrutura de solues existentes. Este processo fundamental
para um AG, pois ele que garante a diversidade gentica na populao de
solues.
Operadores Genticos de Mutao

Existem diversos operadores genticos de mutao, entre eles:


Inverso de bit: Um operador de negao (not), que inverte o valor de um
gene binrio do cromossomo de uma soluo se o gene for igual a 0,
passa a ser 1; se for igual a 1, passa a ser 0. Este operador pode ser
aplicado apenas a cromossomos com genes binrios;
Uniforme: Um operador que substitui o valor de um dos genes do
cromossomo por um valor vlido qualquer.
Para alguns tipos de algoritmos, pode ser necessria a adoo de um
operador de mutao diferente: como a inverso da posio de dois genes do
cromossomo, conforme exemplo apresentado no artigo.

Seleo
Operadores Genticos de Seleo Natural

Os principais operadores para seleo de indivduos so: roleta, porcentagem


superior, melhor e aleatria:
1. Mtodo da roleta: Neste operador, criada uma roleta com vrias sees,
uma para cada soluo que pode ser selecionada. O tamanho da seo
proporcional a qualidade da soluo. Em seguida, simulado o giro da
roleta e a soluo para a qual a roleta apontar selecionada;
2. Porcentagem superior n%: Seleciona aleatoriamente um indivduo dos
melhores n% da populao;
3. Melhor: Seleciona o melhor indivduo da populao;
4. Aleatria: Seleciona aleatoriamente um indivduo da populao.

Bibliotecas Java para Algoritmos Genticos


A implementao de algoritmos genticos em Java pode ser feita atravs de diversas
bibliotecas, como JGAP (Java Genetic Algorithms Package), GA Playground, JAGA

(Java API for Genetic Algorithms), GAJIT (Genetic Algorithm Java Implementation
Toolkit), Jenetics, JGAL, jmona, entra outras.
Destas bibliotecas, a JGAP apresenta a vantagem de continuar sendo atualizada e
possuir um frum e comunidade ativos atravs do qual possvel tirar dvidas. A
biblioteca jmona tambm tem sido constantemente atualizada, mas nova e, portanto,
no atingiu a maturidade da JGAP. Por esse motivo, os exemplos apresentados neste
trabalho utilizaro a biblioteca JGAP.
JGAP

Para utilizar a biblioteca JGAP, deve-se copiar uma de suas distribuies do site
http://jgap.sourceforge.net/. At a publicao deste artigo, a verso mais recente da
biblioteca era a 3.4.4. Para copiar essa verso, no site do projeto, selecione a opo
Download para obter o arquivo jgap_3.4.4_full.zip.
Neste arquivo, esto disponveis o cdigo-fonte, a documentao e o arquivo da
biblioteca j compilada jgap.jar , que deve ser importado em projetos que utilizam a
biblioteca.

Figura 7. Classes da biblioteca JGAP para a definio de cromossomos e genes

A classe central da biblioteca JGAP, que representa um algoritmo gentico, a


Configuration (Figura 7). Atravs dela, possvel parametrizar diversas caractersticas
de um algoritmo, como a forma de representao dos cromossomos
(setSampleChromosome()), a funo de avaliao (setFitnessFunction() e
setFitnessEvaluator()),
os
operadores
genticos
que
sero
utilizados
(addNaturalSelector() e addGeneticOperator()), o tamanho da populao
(setPopulationSize()), entre outras.

As solues e seus cromossomos so representados na biblioteca atravs de classes que


implementam a interface IChromosome. A classe BaseChromosome fornece uma
implementao padro para esta interface. Para vrios problemas, incluindo o problema
de distribuio, a classe Chromosome, subclasse de BaseChromosome, que representa
um cromossomo de tamanho fixo, pode ser utilizada.
Os cromossomos so especificados a partir da definio dos seus genes (Gene). A
biblioteca fornece a implementao de vrios tipos de genes, incluindo nmeros inteiros
(IntegerGene) ou reais (DoubleGene), verdadeiro ou falso (BooleanGene), valor binrio 1
ou 0 (FixedBinaryGene), textual (StringGene), entre outros. A definio dos valores dos
genes pode ser feita atravs do mtodo setAllele().

Figura 8. Classes da biblioteca JGAP para a definio de operadores genticos e funo de


avaliao.

Para definir uma funo de avaliao, deve-se implementar uma subclasse de


FitnessFunction (Figura 8). Essa classe possui um mtodo abstrato (evaluate()), que
recebe um cromossomo e retorna um nmero real referente a sua qualidade. A funo
de avaliao, por si s, no define se um cromossomo melhor ou pior. Ela apenas
retorna um valor numrico associado soluo. Dessa forma, preciso definir se o

cromossomo com o maior ou o menor valor ou algum outro critrio , calculado pela
funo de avaliao, tem maior qualidade.
Para isso, necessrio definir um avaliador, atravs da interface FitnessEvaluator. O
avaliador padro, DefaultFitnessEvaluator, considera o indivduo com o maior valor de
avaliao como tendo maior qualidade. Esta interface define dois mtodos isFitter(), um
que recebe como parmetros dois cromossomos e outro que recebe os valores de
avaliao desses cromossomos. Estes mtodos verificam se o primeiro parmetro do
mtodo mais adequado que o segundo para a soluo do problema.
possvel adicionar configurao de um algoritmo vrios operadores de seleo
(addNaturalSelector()), de reproduo e mutao (addGeneticOperator()). Os operadores
genticos so representados na biblioteca por classes que implementam a interface
GeneticOperator. Esta interface possui apenas um mtodo, operate(), que recebe uma
populao de cromossomos nos quais ser aplicado o operador e uma lista dos
cromossomos onde devero ser adicionados os cromossomos resultantes da operao.
Entre os operadores de mutao implementados na biblioteca, esto os operadores de
troca de genes SwappingMutationOperator e RangedSwappingMutationOperator.
Entre os operadores de reproduo, est o CrossoverOperator, que implementa o
operador 1PX. A classe GreedyCrossover, por sua vez, implementa um operador que
pode ser aplicado para problemas nos quais o que altera no cromossomo apenas a
ordem dos genes, ou seja, no h repetio nos valores de genes como o cromossomo
do problema de distribuio, no qual o mesmo cliente no aparece duas vezes.
Este operador foi implementado de forma a realizar n/2 crossovers, onde n
corresponde ao nmero de solues na populao, e pode ser melhor explicado a partir
do exemplo do problema de distribuio. Para cada crossover, aps sortear dois
cromossomos aleatoriamente, o operador seleciona o valor de um gene um cliente
de um dos pais e verifica qual dos dois pais possui o trecho de viagem mais curto com
origem nesse cliente, e o adiciona sequncia. Se o cliente j tiver sido adicionado
sequncia, ele adiciona o presente no outro pai, mesmo que no resulte no caminho mais
curto. Se este tambm j tiver sido adicionado, ele seleciona um dos clientes ainda no
selecionados aleatoriamente.
Para adicionar operadores de seleo natural, subclasses da classe abstrata
NaturalSelector podem ser utilizadas. Estas subclasses compreendem a seleo dos
melhores cromossomos (BestChromosomesSelector), roleta (WeightedRouletteSelector),
porcentagem superior (ThresholdSelector), entre outros.
Finalmente, para executar o algoritmo, o mtodo evolve(), da classe Genotype (Figura
9) pode ser executado. Esse mtodo pode receber por parmetro o nmero de geraes
ou pode ser executado passo-a-passo. Aps a execuo do algoritmo, o melhor
cromossomo pode ser recuperado atravs do mtodo getFittestChromosome().

Figura 9. Classes da biblioteca JGAP para a soluo do algoritmo gentico e recuperao da


melhor soluo.
Implementao do Problema de Distribuio

Para o algoritmo gentico do problema de distribuio, foram implementadas duas


classes, Problema (Listagem 1) e Local (Listagem 2), utilizadas na representao de

problemas de distribuio com suas reas de cobertura, localidades de entrega e


distncias entre estas localidades.
Na definio dessas classes, foi assumido que um problema de distribuio envolve
uma rea bidimensional onde esto localizados os clientes e a distribuidora. Para
representar a posio dos clientes e da distribuidora na rea de entrega, foi criada a
classe Local, que possui, alm de uma identificao, os atributos x e y, que representam
as coordenadas do local em relao rea.
Alm desses dados, a classe Local possui um mtodo (calcularDistanciaAte()) que
calcula a distncia entre dois locais. Em um problema real, essas distncias podem ser
calculadas de diferentes formas, como atravs do tempo mdio de viagem entre os
trechos, obtido empiricamente, ou da distncia e velocidade mdia do entregador. Para
simplificar a codificao, a distncia entre localidades foi assumida como sendo igual
distncia euclidiana entre dois pontos (Figura 10).

Figura 10. Distncia euclidiana entre dois pontos.

A rea do problema especificada atravs dos atributos largura e altura da classe


Problema. Alm desses atributos, essa classe possui uma coleo de localidades, que
representam os clientes/pontos de entrega e a localidade da distribuidora. Essas
localidades podem ser geradas dinamicamente atravs do mtodo gerarLocalidades(),
que gera aleatoriamente coordenadas (x,y) para um nmero especificado de
localidades.
Listagem 1. Classe que representa um problema de distribuio.
1 package quadrans.ag.distribuicao;
2
3 import java.util.HashMap;
4 import java.util.Iterator;
5 import java.util.Random;
6
7 // A classe Problema representa um problema de distribuio de produtos.
8 public class Problema {
9
10
// Local onde est a distribuidora.
11
Local distribuidora;
12
// Locais onde sero feitas as entregas.
13
private HashMap<Integer, Local> localidades = new HashMap<Integer, Local>();
14
// Largura e altura da rea de distribuio.
15
private int largura, altura;
16
17
// Adiciona um local ao problema.
18
public Local add(Local localidade) {
19
return(this.localidades.put(localidade.getId(), localidade));
20
}
21
22
// Remove um local do problema.
23
public Local remove(Local localidade) {
24
return(this.localidades.remove(localidade.getId()));
25
}
26

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 }

// Retorna um local do problema a partir da sua identificao.


public Local getLocalidade(Integer id) {
return(this.localidades.get(id));
}
// Retorna todos os locais do problema.
public Iterator<Local> getLocalidades() {
return(this.localidades.values().iterator());
}
// Retorna o local da distribuidora.
public Local getDistribuidora() {
return distribuidora;
}
// Define o local da distribuidora.
public void setDistribuidora(Local distribuidora) {
this.distribuidora = distribuidora;
}
// Retorna o nmero de locais.
public int countLocalidades() {
return(localidades.size());
}
// Gera, "aleatoriamente", os locais de entrega e da distribuidora,
// na quantidade especificada, considerando uma rea com a largura e
// altura definidas.
public void gerarLocalidades(int quantidade, int largura, int altura) {
// verifica se a quantidade de localidades de entrega vlido.
if(quantidade < 1) {
throw new IllegalArgumentException("A quantidade de localidades deve ser
maior que 1.");
}
if(largura<1 || altura<1) { // verifica se o tamanho da rea vlido.
throw new IllegalArgumentException("A largura e a altura devem ser maiores
que 1.");
}
this.largura = largura;
this.altura = altura;
// Gera os locais de entrega e suas posies.
Random geradorAleatorio = new Random();
for(int contador=0; contador<quantidade; contador++) {
// Sorteia uma posio x na rea.
int sorteioLargura = geradorAleatorio.nextInt(largura);
// Sorteia uma posio y na rea.
int sorteioAltura = geradorAleatorio.nextInt(altura);
// Cria um novo local.
Local local = new Local(contador, sorteioLargura, sorteioAltura);
this.add(local);
}
// Gera um local para a distribuidora.
int sorteioLargura = geradorAleatorio.nextInt(largura);
int sorteioAltura = geradorAleatorio.nextInt(altura);
// A identificao da distribuidora assumida como sendo igual ao
// nmero de locais de entrega.
distribuidora = new Local(quantidade, sorteioLargura, sorteioAltura);
}

Listagem 2. Classe que representa um local do problema de distribuio.


1 package quadrans.ag.distribuicao;
2
3 // A classe Local representa um local em alguma rea bidimensional.
4 public class Local {
5
private int id; // Identificao do local.
6
private int x; // Posio x do local.
7
private int y; // Posio y do local.
8
9
public Local(int id, int x, int y) {
10
setId(id);
11
setX(x);
12
setY(y);
13
}

14
15
16
17
18
19
20
21
22
23
24
25
26
27

public int getId() { return this.id; }


public void setId(int id) { this.id = id; }
public int getX() { return this.x; }
public void setX(int x) { this.x = x; }
public int getY() { return y; }
public void setY(int y) { this.y = y; }

// Calcula a distncia euclidiana deste local at o local


// recebido por parmetro.
public double calculaDistanciaAte(Local destino) {
return(Math.sqrt(Math.pow(getX()-destino.getX(),2) + Math.pow(getY()destino.getY(),2)));
28
}
29 }

Aps a definio do problema, a implementao do cdigo que utiliza a biblioteca


JGAP foi realizada (Listagem 3). Aps criar uma nova configurao, o mtodo
setSampleChromosome() foi utilizado para definir um cromossomo modelo para o
problema, que ser utilizado na criao dos outros cromossomos da populao.
Para o exemplo apresentado, foi criado um cromossomo modelo que possui o nmero
de genes igual ao nmero de locais de entrega (linhas 4 a 9 da Listagem 3). Para a
definio desse cromossomo, criou-se um vetor com dez genes, cujos valores podem ser
iguais a qualquer nmero inteiro entre 1 e 10 representando cada uma das localidades.
O valor dos genes no cromossomo modelo foi definido como sendo igual a posio do
gene no vetor do cromossomo, ou seja, o primeiro gene teve valor igual a 1, o segundo
igual a 2 etc. (Figura 11).

Figura 11. Cromossomo modelo.

Aps a definio do cromossomo modelo, foi definido o tamanho inicial da populao


como sendo igual a 500 e tambm a funo que ir avaliar a utilidade dos cromossomos.
Foi criada uma classe chamada FuncaoAvaliacao (Listagem 4), que retorna a distncia
do percurso de entrega como valor de avaliao do cromossomo. Para definir um
avaliador adequado, foi criada a classe ComparadorUtilidade (Listagem 5) que
implementa a interface FitnessEvaluator. No cdigo implementado, o primeiro
parmetro mais adequado quando seu valor menor.
Em seguida, foram definidos os operadores genticos que devem ser empregados no
algoritmo: GreedyCrossover, BestChromosomesSelector e SwappingMutation. Ao ser
adicionado configurao, o operador de seleo teve sua execuo programada para
depois dos outros operadores genticos. Isso foi especificado atravs do segundo
parmetro do mtodo addNaturalSelector() da classe Configuration, que, quando definido
como falso, determina a execuo da seleo aps os outros operadores.
Foi tambm definido um gerenciador de eventos, que pode ser utilizado como um
observador de eventos do algoritmo gentico sendo informado, por exemplo, quando
uma nova melhor soluo for encontrada.
Antes de iniciar a execuo do algoritmo, os cromossomos da populao foram
criados. Isto pode ser feito atravs do mtodo randomInitialGenotype() da classe
Genotype, que gera aleatoriamente cromossomos com genes cujos valores so sorteados
entre os valores vlidos entre 1 e 10. Porm, este mtodo no garante que no
existiro genes com valores repetidos no cromossomo o que acarretaria em

cromossomos invlidos para o problema de distribuio, j que o mesmo cliente no


deve ser visitado duas vezes.
Portanto, para o exemplo citado, foram criados 500 cromossomos iguais ao
cromossomo modelo (linhas 29 a 37). Por fim, o algoritmo foi executado atravs do
mtodo evolve() da classe Genotype.
Listagem 3. Configurao dos parmetros de um algoritmo gentico.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

Configuration configuracao = new Configuration();


// Define os genes do cromossomo modelo.
Gene[] genes = new Gene[problema.countLocalidades()];
for(int contador=0; contador<genes.length; contador++) {
genes[contador] = new IntegerGene(configuracao, 0, problema.countLocalidades());
genes[contador].setAllele(new Integer(contador));
}
configuracao.setSampleChromosome(new Chromosome(configuracao, genes));
// Define o tamanho da populao como 500.
configuracao.setPopulationSize(500);
// Cria uma funo para avaliar a utilidade dos cromossomos.
FuncaoAvaliacao funcaoAvaliacao = new FuncaoAvaliacao(problema);
configuracao.setFitnessFunction(funcaoAvaliacao);
configuracao.setFitnessEvaluator(new ComparadorUtilidade());
// Define os operadores do algoritmo.
BestChromosomesSelector opSelecaoMelhor = new BestChromosomesSelector(configuracao);
configuracao.addNaturalSelector(opSelecaoMelhor, false);
configuracao.addGeneticOperator(new GreedyCrossover(configuracao));
configuracao.addGeneticOperator(new SwappingMutationOperator(configuracao, 5));
configuracao.setRandomGenerator(new StockRandomGenerator());
configuracao.setEventManager(new EventManager());
// Cria a populao de cromossomos.
IChromosome[] cromossomos = new IChromosome[configuracao.getPopulationSize()];
Gene[] genesModelos = configuracao.getSampleChromosome().getGenes();
for (int contador=0; contador<cromossomos.length; contador++) {
Gene[] genes = new Gene[genesModelos.length];
for(int contador1=0; contador1<genes.length; contador1++) {
genes[contador1] = genesModelos[contador1].newGene();
genes[contador1].setAllele(genesModelos[contador1].getAllele());
}
cromossomos[contador] = new Chromosome(configuracao, genes);
}
Genotype populacao = new Genotype(configuracao, new Population(configuracao,
cromossomos));
IChromosome melhor = null;
populacao.evolve(500);
melhor = populacao.getFittestChromosome();

Listagem 4. Funo de avaliao.


1 package quadrans.ag.distribuicao;
2
3 import org.jgap.FitnessFunction;
4 import org.jgap.IChromosome;
5
6 /**
7 * A classe FuncaoAvaliacao implementa uma funo de avaliao para o
8 * problema de distribuio de produtos.
9 * @author Leandro Luque
10 */
11 public class FuncaoAvaliacao extends FitnessFunction {
12
13
/**
14
* O problema para o qual a funo de avaliar solues.
15
*/
16
private Problema problema;
17
18
/**
19
* Cria uma nova funo de avaliao especificando o problema para o

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

41
42
43
44
45
46
47 }

* qual as solues devero ser avaliadas.


* @param problema o problema para o qual a funo de avaliar solues.
*/
public FuncaoAvaliacao(Problema problema) {
this.problema = problema;
}
/**
* Avalia o cromossomo recebido por parmetro. Esta avaliao feita
* a partir do clculo da distncia total percorrida no processo de
* entrega para o cromossomo especificado.
* @param cromossomo o cromossomo que deve ser avaliado.
* @return o valor da avaliao do cromossomo.
*/
@Override
protected double evaluate(IChromosome cromossomo) {
double distanciaTotal = 0;
// Adiciona a distncia da distribuidora at a primeira localidade.
distanciaTotal +=
problema.getDistribuidora().calculaDistanciaAte(problema.getLocalidade((Integer)crom
ossomo.getGene(0).getAllele()));
for(int contador=0; contador<cromossomo.getGenes().length-1; contador++) {
distanciaTotal +=
problema.getLocalidade((Integer)cromossomo.getGene(contador).getAllele()).calculaDis
tanciaAte(problema.getLocalidade((Integer)cromossomo.getGene(contador+1).getAllele()
));
}
// Adiciona a distncia da ltima localidade at a distribuidora.
distanciaTotal +=
problema.getLocalidade((Integer)cromossomo.getGene(cromossomo.getGenes().length1).getAllele()).calculaDistanciaAte(problema.getDistribuidora());
return(distanciaTotal);
}

Listagem 5. Cdigo do avaliador.


1 package quadrans.ag.distribuicao;
2
3 import org.jgap.FitnessEvaluator;
4 import org.jgap.IChromosome;
5
6 /**
7 *
8 * @author Internet
9 */
10 public class ComparadorUtilidade implements FitnessEvaluator {
11
12
public boolean isFitter(double d, double d1) {
13
if(d<d1) {return true;}
14
return(false);
15
}
16
17
public boolean isFitter(IChromosome ic, IChromosome ic1) {
18
return(isFitter(ic.getFitnessValue(), ic1.getFitnessValue()));
19
}
20
21 }

Para que a execuo do algoritmo possa ser acompanhada passo-a-passo, foi criada
uma interface grfica com um JFrame e um JPanel que exibem a rea e a melhor
soluo, a cada etapa (Figura 12). Nesta figura, a marca preta representa a distribuidora
e as marcas azuis representam os clientes.

Figura 12. Interface grfica para acompanhamento do algoritmo.

Aps apenas 20 segundos de execuo do algoritmo, cuja soluo inicial tinha um


percurso de 3181 metros, foi obtida uma soluo de 1962 metros. A execuo do
algoritmo gentico por um tempo maior poderia resultar em uma soluo ainda melhor.
Por tratar-se de um problema relevante para a rea de Algoritmos Genticos, a
biblioteca JGAP define uma implementao similar apresentada para o problema de
distribuio atravs das classes do pacote org.jgap.impl.salesman.

Concluso
Embora no garantam que a melhor soluo para um problema seja encontrada,
Algoritmos Genticos constituem uma importante ferramenta para a soluo de
problemas complexos e tm sido aplicados com sucesso em diferentes reas. Apesar de
tratar-se de uma rea de conhecimento ampla, os conceitos da AGs e as funcionalidades
da biblioteca JGAP apresentados neste artigo j possibilitam o emprego dessa famlia de
algoritmos a uma ampla gama de aplicaes.

Referncias
http://www.scielo.br/scielo.php?pid=S0104-530X2009000300007&script=sci_arttext
Artigo sobre algumas tcnicas que podem ser empregadas na anlise de risco de crdito.
http://www.algoritmosgeneticos.com.br
Site com materiais sobre o livro Algoritmos Genticos, de Ricardo Linden.
http://www.obitko.com/tutorials/genetic-algorithms/portuguese/
Material sobre Algoritmos Genticos definio de conceitos e exemplos.
http://www.ridelust.com/evolve-a-car-with-a-genetic-algorithm/
Exemplo de algoritmo gentico que evolui um carro, procurando a estrutura melhor adaptada a diferentes
tipos de terreno.
http://math.hws.edu/xJava/GA/
Exemplo de algoritmo gentico para a evoluo de uma populao virtual.
http://www.sambee.co.th/MazeSolver/mazega.htm
Exemplo de algoritmo gentico para encontrar a sada de labirintos.
http://brainz.org/15-real-world-applications-genetic-algorithms/
Site com 15 exemplos de aplicaes de Algoritmos Genticos.

Leandro Luque (leandro.luque@gmail.com) professor da Faculdade de Tecnologia de Mogi das Cruzes (FATEC)
e da Universidade de Mogi das Cruzes (UMC). Tem formao em Cincia da Computao e mestrado em
Computao Aplicada pelo Instituto Nacional de Pesquisas Espaciais (INPE). Trabalha com Java h 10 anos, tendo
atuado no desenvolvimento de aplicaes de grande porte tanto no segmento empresarial quanto governamental.

Rodrigo Rocha Silva (rrochas@gmail.com) Formado em Cincia da Computao pela Universidade de Mogi das
Cruzes (UMC), mestre em Computao Aplicada pelo INPE e Doutorando pelo ITA. Trabalha com Java h mais de
6 anos, atuando como desenvolvedor, analista e arquiteto em empresas de pequeno e grande porte, nos segmentos
de gesto empresarial, sade e governo. Atua tambm como professor na UMC e na Veris Faculdades. Possui
certificao SCJP 1.4.

You might also like