Sunteți pe pagina 1din 15

java_

Algoritmos
Genticos
em Java
Existem problemas
relativamente do cotidiano
aparentemente simples,
mas que so to
complexos que no
admitem soluo
em um tempo vivel
atravs de tcnicas
tradicionais.
Para resolv-los, podemos usar os
Algoritmos Genticos, que se inspiram na evoluo das
espcies para encontrar solues para estes problemas.

A Inteligncia Artificial uma rea da computa-


o que busca desenvolver sistemas que tenham
comportamento similar a certos aspectos do com-
A verdade que, sem exageros, a busca o pro-
blema bsico da computao. Todo problema pode
ser descrito como a tentativa de alcanar um deter-
portamento inteligente, especialmente a capacidade minado objetivo, isto , de chegar a um determinado
de resolver problemas extremamente difceis ainda estado onde uma certa condio satisfeita.
que de maneira aproximada. Pensando assim, po- Um estado nada mais do que uma especifica-
demos tentar nos inspirar na biologia e na gentica o de certos aspectos da realidade relevantes para o
para criar um algoritmo que nos permita criar pro- problema. Por exemplo, se meu objetivo ganhar um
gramas de computadores mais espertos do que os milho de reais, ento o estado consiste em quan-
programas tradicionais, sendo capazes de encontrar to dinheiro eu ganhei at hoje. O meu peso neste
solues que estes ltimos no encontrariam. momento no relevante para o estado do sistema.
A palavra encontrar usada aqui apropriada, Desta maneira, pode-se dizer que um estado, na re-
porque o objetivo final de todas as tcnicas da inteli- alidade, corresponde a um conjunto de valores den-
gncia computacional a busca, podendo ser de uma tre todas as variveis que so do meu interesse. Por
soluo numrica, do significado de uma expresso exemplo, um possvel estado para o problema de fi-
lingustica, de uma previso de carga ou de qual- car rico consiste em se obter um ganho de R$10 mil.
quer outro elemento que tenha significado em uma Neste problema, este estado no leva em considera-
determinada circunstncia. No importando a rea o o meu peso naquele instante e qualquer mudan-
de aplicao, uma busca sempre tem como objetivo a de peso no afeta o estado corrente, assim como
encontrar a melhor soluo dentre todas as solues qualquer varivel adicional como meu estado civil, e
possveis (o espao de solues). outras que possam ser imaginadas.

/ 50
Ricardo Linden | rlinden@pobox.com
formado em engenharia de computao pela PUC-RJ e tem doutorado em engenharia eltrica pela COPPE-UFRJ. Trabalha
com Java h cerca de 8 anos, desenvolvendo aplicativos para o setor eltrico no CEPEL. Atualmente professor da disciplina
de sistemas digitais na Faculdade Salesiana Maria Auxiliadora (FSMA), de Maca-RJ e autor do livro Algoritmos
Genticos, atualmente em sua 3 edio.

Existem vrios problemas em nosso dia a dia que so extremamen-


te complexos e no admitem soluo exata em um tempo razovel.
Entre eles encontramos um exemplo do cotidiano que a otimiza-
o da rota de caminhes que vo distribuir produtos entre vrios
clientes. Para resolver estes problemas de otimizao ns usamos
heursticas, que encontram solues boas o suficiente para usarmos
na prtica. Uma heurstica muito importante para este tipo de pro-
blema so os algoritmos genticos, sobre os quais falaremos neste
artigo.

As diferentes aes causam modificaes no es- O que so os algoritmos genticos?


tado do sistema. Por exemplo, se o meu livro sobre Primeiramente, vamos conhecer os algoritmos
Algoritmos Gentico vender 100 mil cpias, eu che- evolucionrios (EA, Evolutionary Algorithm), que
garei mais prximo do objetivo de ganhar um mi- so ferramentas que usam modelos computacionais
lho de reais. As vrias aes que posso realizar em dos processos naturais de evoluo como uma fer-
cada instante devem ento ser avaliadas como um ramenta para resolver problemas (para entender um
caminho da busca a ser efetuada, com o intuito de pouco mais sobre como funciona a evoluo natural,
encontrar o estado final desejado. Assim, podemos leia o box intitulado Darwin, Mendel, a teoria da
dizer que resolver um problema consiste em buscar evoluo e a gentica). Apesar de haver uma gran-
um estado em que uma determinada condio seja de variedade de modelos computacionais propostos,
satisfeita, ou seja, todo problema, no fundo, um todos eles tm em comum o conceito de simulao
problema de busca. Um algoritmo de busca tal que da evoluo das espcies atravs de seleo, muta-
recebe um problema como entrada e retorna uma so- o e reproduo, processos estes que dependem do
luo sob a forma de uma sequncia de aes reco- desempenho dos indivduos desta espcie dentro
mendadas para se atingir o objetivo desejado (Russel do ambiente.
& Norvig, 2004). Os algoritmos evolucionrios funcionam man-
tendo uma populao de estruturas, denominadas
Algoritmos genticos (GA, genetic algorithms)
indivduos ou cromossomos operando sobre estas
so uma tcnica de busca extremamente eficiente
de forma semelhante evoluo das espcies. A es-
no seu objetivo de varrer o espao de solues e en-
tas estruturas so aplicados os chamados operado-
contrar solues prximas da soluo tima, quase
res genticos, como recombinao e mutao, entre
sem necessitar interferncia humana, sendo uma das
outros. Cada indivduo recebe uma avaliao que
vrias tcnicas da inteligncia computacional mais uma quantificao da sua qualidade como soluo
instigantes (ao menos na minha opinio!). O proble- do problema em questo. Com base nesta avaliao
ma dos GA que eles no so to bons assim em ter- sero aplicados os operadores genticos de forma a
mos de tempo de processamento. Logo, eles so mais simular a sobrevivncia do mais apto.
adequados em problemas especialmente difceis, en- Os operadores genticos consistem em apro-
tre os quais inclumos aqueles denominados intrat- ximaes computacionais de fenmenos vistos na
veis (sobre os quais falaremos mais no box intitulado natureza, como a reproduo sexuada, a mutao
Os caixeiros viajantes e os problemas intratveis). gentica e quaisquer outros que a imaginao dos
Agora que estamos suficientemente motivados, programadores consiga reproduzir.
podemos comear a ver o que efetivamente so e o O comportamento padro dos algoritmos evolu-
que fazem os algoritmos genticos. cionrios pode ser resumido, sem maiores detalhes,

51 \
Os caixeiros viajantes, as mochilas e os problemas intratveis
Existe uma forma de avaliar o tempo de execuo de ao algoritmo o que varia de ambiente para am-
um algoritmo que no busca avaliar o tempo de for- biente apenas o tempo absoluto de cada execuo,
ma exata, mas sim verificar como o tempo de execu- o qual dependente de fatores como poder de pro-
o cresce conforme aumentamos o volume de da- cessamento, cdigo compilado e outros difceis de
dos oferecido como entrada para um algoritmo. Isto medir. Esta funo permite analisar a complexidade
nos permite fazer uma medida que vlida (mes- de um algoritmo, fornecendo uma boa estimativa
mo que no seja precisa) no importando a CPU, o sobre qual algoritmo ser o mais rpido se o tama-
sistema operacional, o compilador e outros fatores nho das entradas crescer muito.
inerentes mquina especfica na qual o programa Com base nesta informao, podemos ento defi-
ser executado. nir os problemas intratveis, os quais so definidos
Com esta mtrica pode-se comparar dois algoritmos como aqueles cujo tempo necessrio para resolv-lo
que porventura resolvam o mesmo problema, usan- considerado inaceitvel para os requerimentos do
do esta aproximao do tempo de execuo para es- usurio da soluo. Em termos prticos, um proble-
colher aquele que mais eficiente. Para fazer esta ma tratvel se o seu limite superior de complexi-
comparao, no precisamos do clculo de tempo dade polinomial, e intratvel se o limite supe-
exato de cada algoritmo, mas sim de uma mtrica rior de sua complexidade for exponencial (Toscani,
comparativa, que seja capaz de dizer qual algorit- 2009), ou seja, se seu tempo de execuo da ordem
mo vai necessitar menos tempo e/ou recursos com- de uma funo exponencial (como 2n) ou fatorial
putacionais. Ou seja, nosso objetivo fundamental (n!).
encontrar uma maneira de comparar diferentes Um exemplo de um problema intratvel muito co-
algoritmos de forma a conseguir uma mtrica inde- mum o do caixeiro viajante que tem que visitar
pendente das circunstncias (sistema operacional, n estradas e precisa estabelecer um trajeto que de-
mquina etc.) que nos permita dizer: para o proble- more o menor tempo possvel, para ganhar o m-
ma X, o melhor algoritmo Y. ximo de dinheiro no mnimo de tempo. Todas as
Para fazer este clculo do tempo de execuo de cidades so ligadas por estradas e pode-se comear
nossos programas, comeamos com um conceito por qualquer uma delas. Como descobrir o caminho
que obviamente no preciso: determinamos que mnimo? A resposta bvia: calcule todos os cami-
todas instrues demoram o mesmo tempo para nhos e escolha o de menor custo. Esta resposta usa o
executar. Chamaremos este tempo de unidade de famoso mtodo da fora bruta ou da busca exaustiva
execuo, e para efeito de clculos atribumos a ele isto , use muito poder computacional e pronto.
valor 1. Depois, temos que determinar quantas ve- Vamos tentar calcular quantos caminhos temos:
zes cada uma de nossas instrues de tempo 1 so O caixeiro pode comear em qualquer uma das
repetidas, pois os loops so a parte mais importante n cidades.
de um programa (geralmente, 10% do cdigo to- Dali ele pode partir para qualquer uma das ou-
mam cerca de 90% do tempo de execuo). Conse- tras n-1 cidades.
quentemente, quando analisar o seu tempo de exe- Da segunda, ele pode partir para qualquer uma
cuo, preste muita ateno nestas partes, pois elas das n-2 cidades restantes.
dominam a execuo total. Para tanto, procure os E assim por diante, at chegar na ltima cidade.
loops que operam sobre as estruturas de dados do Isto nos d um nmero de opes igual a n(n-1)(n-
programa. Se voc sabe o tamanho da estrutura de 2)...(2)(1)=n!. O fatorial de um nmero cresce muito
dados, voc sabe quantas vezes o loop executado e rapidamente. Por exemplo, se tivermos 100 cidades
consequentemente o tempo de execuo do mesmo. teremos 10158 opes. Se pudermos testar um bi-
Fazendo este tipo de clculo, obtemos um tempo de lho de solues por segundo, demoraramos um
execuo do algoritmo que uma funo do nmero tempo igual a 10140 anos para encontrar a melhor
de entradas que ele recebe (n), isto , obtemos um soluo. Novamente, levaremos mais tempo do que
tempo T(n). Este tempo consiste em uma medida a idade do universo para encontrar uma soluo.
aproximada da taxa de crescimento que intrnseca Este problema pode parecer anacrnico e irreal, afi-

/ 52
pela figura 1, que descreve de forma esquemtica o
funcionamento de um EA, usando caixinhas que re-
presentam cada uma das funes do mesmo. Quan-
do formos implementar o nosso algoritmo gentico,
cada uma destas caixinhas virar um cdigo que, es-
nal praticamente no existem mais caixeiros viajan- pero eu, esclarea de forma completa a sua funo.
tes, mas ele anlogo aos problemas de distribui- Antes de partir para a implementao, vamos fa-
o enfrentados por qualquer indstria. Trocando lar um pouquinho mais sobre os elementos tericos
caixeiro viajante por caminho de mercadoria e que compem os algoritmos evolucionrios.
Na figura 1 podemos perceber o funcionamento
cidades por bares, temos o dificlimo problema
bsico dos algoritmos evolucionrios que consiste em
de realizar a distribuio de mercadorias por todos
buscar dentro da atual populao aquelas solues
os clientes da forma mais eficiente possvel, mini-
com as melhores caractersticas (caixinha de sele-
mizando o tempo e o custo associados. Outra apli- o na figura 1) e tentar combin-las de forma a ge-
cao prtica consiste em trocar caixeiro viajante rar solues ainda melhores (caixinha que contm a
por pacote de rede e cidades por roteadores ou aplicao dos operadores genticos na figura 1). Este
ns de distribuio. Assim, a questo do anacro- processo repetido at que tenha se passado tempo
nismo , para todos os efeitos, desprezvel. suficiente ou que tenhamos obtido uma soluo sa-
Outro problema extremamente interessante e im- tisfatria para nosso problema.
portante o problema da mochila, que um pro- Cada uma das repeties do lao completo (con-
blema de otimizao combinatria que consiste na trolado pelo losango que representa uma condio
necessidade de encher uma mochila com objetos de em um fluxograma) denominada de uma gerao
diferentes pesos e valores, com o maior valor poss- do algoritmo. O conceito similar ao conceito de
vel, sem ultrapassar o peso mximo que ela supor- gerao existente na vida real, com a exceo de que
ta. Mais uma vez, no se engane pela simplicidade muitas vezes nos algoritmos evolucionrios duas ge-
do enunciado: este problema similar a problemas raes no convivem, como a figura deixa implcito
prticos como alocao de recursos de produo, (veja que jogamos toda a gerao dos pais no lixo).
deciso sobre investimentos e at mesmo na aloca- Algoritmos genticos (GA) so um ramo dos al-
o de registradores em cdigo compilado. goritmos evolucionrios e como tal tambm so uma
A dificuldade deste problema tambm grande. tcnica de busca baseada numa metfora do processo
Para resolv-lo por fora bruta, teramos que checar biolgico de evoluo natural na qual populaes de
todas as combinaes possveis de objetos, primeiro indivduos so criados e submetidos aos operadores
genticos: seleo, recombinao (crossover) e mu-
cada objeto isoladamente, depois as combinaes
tao. Assim como descrevemos para os EAs, estes
de dois objetos, depois as combinaes de trs, e as-
operadores utilizam uma caracterizao da qualida-
sim por diante. Como voc lembra do ensino mdio,
de de cada indivduo como soluo do problema em
o nmero de combinaes proporcional fatorial questo chamada de avaliao. Sua atuao vai gerar
do nmero de elementos e assim, mais uma vez te- um processo de evoluo natural destes indivduos,
mos um problema cuja soluo pelo mtodo da for- que eventualmente dever gerar um indivduo que
a bruta pode demorar um tempo longo demais para caracterizar uma boa soluo (talvez at a melhor
ser realizvel. possvel) para o nosso problema.
Assim, podemos ver claramente que estes proble- Ns vamos ver mais a frente a implementao da
mas so intratveis e, tendo em vista sua importn- funo de avaliao para um problema interessante.
cia, precisamos de uma tcnica capaz de resolv-lo. Entretanto, para entender melhor o conceito de fun-
Como no podemos resolv-lo de forma exata, pre- o de avaliao, vamos aplic-la ao caso do caixeiro
cisamos de uma heurstica, isto , um programa que viajante. Para tanto, imagine que temos quatro cida-
fornea uma soluo suficientemente boa, ainda des para visitar e os custos de trafegar de uma cidade
que no tima para o problema (como, por exemplo, para a outra dada pela seguinte tabela, onde a cida-
uma soluo na qual nossos caminhes entreguem de de origem est na vertical e a cidade de destino na
todas as mercadorias a tempo para nossos clientes, horizontal:
mesmo em um tempo superior ao timo). a que 1 2 3 4
recorremos aos algoritmos genticos! 1 0 500 150 600
2 500 0 100 90
3 150 100 0 140
4 600 90 140 0

53 \
cortes a serem
efetuados Filho 1:

Filho 2:

Seleo: escolhemos os Operadores genticos: aplicamos os operadores


indivduos que participaro do de recombinao e mutao aos indivduos
processo escolhidos para pais

Avaliao: aplicamos a funo Mdulo de populao: definimos a nova


de avaliao a cada um dos populao a partir da gerao existente e
indivduos desta gerao dos filhos gerados

Satisfazemos o critrio de Toda a antiga


parada? (por nmero de geraao de pais
No geraes ou por qualidade
de solues)
Filtros gerados
sobrevivem e so
copiados sobre
Sim seus pais

FIM

Figura 1. Esquema de um algoritmo evolucionrio (e, por conseguinte, de um algoritmo gentico).

Um custo pode ser alto por que a estrada de m ritmos genticos.


qualidade, tem pedgio alto, tem assaltos ou toma Assim, podemos dizer que algoritmos genticos
muito tempo por ter trfego intenso de caminhes. so algoritmos de busca baseados nos mecanismos de
No colocamos unidade neste custo, pois ele pode seleo natural e gentica. Eles combinam a sobrevi-
ser uma combinao de vrios fatores quem deter- vncia entre os melhores com uma forma estruturada
mina os parmetros de uma soluo o especialista de troca de informao gentica entre dois indivdu-
no problema. Neste caso, o caixeiro viajante teria que os para formar uma estrutura heurstica de busca.
nos informar a qualidade relativa de cada caminho de A codificao da informao em cromossomos
acordo com sua experincia. um ponto crucial dentro do GA, e, junto com a fun-
Assim, vamos avaliar a soluo que comea na o de avaliao, o que liga o GA ao problema a ser
cidade 1, vai para a 2, depois para a 3 e para a 4. O resolvido. Se a codificao for feita de forma inteli-
custo total dado por 500 (custo do caminho 12) + gente, esta j incluir as idiossincrasias do problema
100 (custo do caminho 23) + 140 (custo do caminho (como, por exemplo, restries sobre quando pode-
34) = 740 unidades. J a soluo que faz o caminho mos ligar ou desligar uma mquina etc.) e permitir
1324 tem custo igual a 150 (custo do caminho que se evitem testes de viabilidade de cada uma das
13) + 100 (custo do caminho 32) + 90 (custo do solues geradas. Ao fim da execuo do nosso algo-
caminho 24) = 340 unidades. Como estamos bus- ritmo a soluo deve ser decodificada para ser utili-
cando minimizar nosso custo, ento a segunda solu- zada na prtica.
o claramente superior primeira. Assim como na natureza, a informao deve ser
Lembre-se de suas aulas de matemtica que para codificada nos cromossomos (ou genomas) e a repro-
minimizar uma funo f(x), s maximizar a funo duo (que no caso dos GAs equivalente reprodu-
1/f(x). Assim, o problema do caixeiro viajante ainda o sexuada e recombinao gnica) se encarregar
recai na estrutura bsica de funcionamento dos algo- de fazer com que a populao evolua. A mutao cria

/ 54
Darwin, Mendel, a teoria da evoluo e a gentica
At o sculo XIX os cientistas mais proeminentes eram transmitidas de uma planta para seus descen-
acreditavam ou na teoria do criacionismo (Deus dentes. Atravs do estudo de linhagens de plantas,
criou o universo da forma que ele hoje) ou da ge- ele desenvolveu os princpios bsicos da gentica,
rao espontnea (a vida surge de essncias pre- que derivavam da existncia de reas codificadoras
sentes no ar). das caractersticas dos seres vivos, que so conheci-
Em torno de 1850 Charles Darwin fez uma longa das com os genes.
viagem no navio HMS Beagle. Ele visitou vrios lu- Hoje ns sabemos que todo indivduo, seja ele ani-
gares e sua grande habilidade para observao per- mal, vegetal ou mesmo organismos inferiores como
mitiu que ele percebesse que animais da uma esp- vrus e bactrias, formado por uma ou mais clu-
cie eram ligeiramente diferentes que seus parentes las, e dentro de cada uma delas o organismo pos-
em outros ecossistemas, sendo mais adaptados s sui uma cpia completa do conjunto de um ou mais
necessidades e oportunidades oferecidas pelo seu cromossomos que descrevem o organismo, con-
ecossistema especfico. Estas e outras observaes
junto este denominado genoma. Um cromossomo
culminaram na teoria da evoluo das Espcies, que
consiste de genes, que so blocos de sequncias de
foram descritas meticulosamente em seu livro de
DNA. Cada gene uma regio do DNA que controla
1859, A Origem das espcies.
(sozinho ou em conjunto com outros genes) uma ou
A teoria da evoluo diz que na natureza todos os
indivduos dentro de um ecossistema competem mais caractersticas hereditrias especficas, como
entre si por recursos limitados, tais como comida e cor do cabelo, altura, cor dos olhos e outras que nos
gua. Aqueles indivduos (animais, vegetais, insetos tornam os indivduos que somos.
etc.) que no obtm xito tendem a ter uma prole Um conjunto especfico de genes no genoma cha-
menor e esta descendncia reduzida diminui a pro- mado de gentipo. O gentipo a base do fenti-
babilidade de ter seus genes propagados ao longo de po, que a expresso das caractersticas fsicas e
sucessivas geraes, processo este que denomina- mentais codificadas pelos genes e modificadas pelo
do de seleo natural. ambiente, tais como cor dos olhos, inteligncia etc.
A combinao entre as caractersticas dos indivdu- Da, podemos concluir: nosso DNA codifica toda a
os que sobrevivem pode produzir um novo indivduo informao necessria para nos descrever, mas esta
muito mais bem adaptado s caractersticas de seu informao est sob o controle de uma grande rede
meio ambiente ao mesclar caractersticas positivas de regulao gnica que, associada s condies am-
de cada um dos reprodutores. Este processo impli- bientais, gera as protenas na quantidade certa, que
ca nos descendentes de indivduos serem variaes faro de ns tudo aquilo que efetivamente somos.
dos seus pais. Assim, um descendente ligeiramen- Nos organismos que utilizam a reproduo sexua-
te diferente de seu pai, podendo esta diferena ser da, como os humanos e as moscas, cada progenitor
positiva ou negativa. fornece um pedao de material gentico chamado
Entretanto, esta evoluo natural no um pro- gametas. Estas gametas so resultado de um pro-
cesso dirigido, com o intuito de maximizar alguma cesso denominado crossing-over ou crossover, que
caracterstica das espcies. Na verdade, no existe permite que os filhos herdem caractersticas de
nenhuma garantia de que os descendentes de pais ambos os pais sem ser exatamente iguais a estes.
muito bem adaptados tambm o sejam. Existem importante considerar tambm que o processo
muitos casos de filhos de pais fortes e saudveis que
de replicao do DNA extremamente complexo.
possuem doenas terrveis ou fraquezas inerentes.
Pequenos erros podem ocorrer ao longo do tempo,
Podemos afirmar, ento, que a evoluo um pro-
gerando mutaes dentro do cdigo gentico. Alm
cesso no qual os seres vivos so alterados por um
dos erros, estas mutaes podem ser causadas por
conjunto de modificaes que eles sofrem atravs
dos tempos, podendo ser explicada por alguns fato- fatores aleatrios, tais como presena de radiao
res como mutao e recombinao gnica, seleo ambiente, causando pequenas mudanas nos ge-
natural e isolamentos. O problema que, na poca nes dos indivduos. Estas mutaes podem ser boas,
de Darwin, ainda faltava um pedao desta informa- ruins ou neutras.
o, que era a gentica. Assim, temos o funcionamento bsico da teoria da
No incio do sculo XX, um padre chamado Gregor evoluo: os genes dos bons indivduos, combina-
Mendel compreendeu que este processo de trans- dos atravs do crossover e da mutao, tendem a ge-
misso de caractersticas positivas estava associa- rar indivduos ainda mais aptos e, assim, a evoluo
do a uma unidade bsica de informao, o gene. Na natural caminha, com uma tendncia a gerar com-
dcada de 1850 ele fez uma srie de experimentos plexidade maior e maior adaptabilidade ao meio
com ervilhas e percebeu que algumas caractersticas ambiente no qual os organismos esto inseridos.
55 \
diversidade, mudando aleatoriamente genes dentro cado dentro da mochila. Por exemplo, o cromossomo
de indivduos e, assim como na natureza, aplicada dado por 10010001 representa o fato de que temos 8
de forma menos frequente que a recombinao (cros- objetos candidatos a estarem na mochila (por que a
sover). Quando implementarmos nosso GA, veremos string tem comprimento igual a 8) e os objetos 1, 4
como estes operadores funcionam com detalhes. e 8 so aqueles que sero selecionados na mochila.
A reproduo e a mutao so aplicadas em in- Assim, podemos criar uma classe chamada Cromos-
divduos selecionados dentro da nossa populao. A somo que tenha dentro dela uma String e que receba
seleo deve ser feita de tal forma que os indivduos como parmetro o tamanho do cromossomo que cada
mais aptos (isto , aqueles que tm uma funo de objeto armazena.
avaliao maior) sejam selecionados mais frequen- Entretanto, para resolver o nosso problema da
temente do que aqueles menos aptos, de forma que mochila, nosso cromossomo precisa de duas infor-
as boas caractersticas daqueles passem a predo- maes muito importantes, que so o valor e o peso
minar dentro da nova populao de solues. Nun- de cada um dos candidatos a serem carregados. As-
ca devemos descartar os indivduos menos aptos da sim, vamos colocar estes valores como parmetros
populao reprodutora, pois isto causaria uma rpi- para nosso construtor. O tamanho dos vetores pas-
da convergncia gentica de todas as solues para sados para o construtor pode, ento, ser usado para
um mesmo conjunto de caractersticas e evitaria uma inicializar o cromossomo. Temos um parmetro adi-
busca mais ampla pelo espao de solues. cional, que o limite de peso que nossa mochila pode
Falando assim, de uma perspectiva totalmente carregar ele muito importante, pois determina a
terica, tudo parece muito complicado. Vamos ento qualidade de uma soluo (uma soluo de alto valor
partir para a prtica, implementando um algoritmo que ultrapasse o nosso limite de peso , na realidade,
gentico em Java de forma que possamos entender uma m soluo). Vamos ver como us-lo quando im-
exatamente os conceitos que descrevemos at aqui plementarmos nossa funo de avaliao.
de forma abstrata. Fazemos ento a inicializao do cromossomo
de forma aleatria ns simplesmente escolhemos
uma string de bits qualquer para cada cromossomo
Algoritmos Genticos na prtica de nossa populao e depois vamos evolu-la. Nos-
Primeiro ns vamos discutir como criar um nico sa esperana que o GA transforme este conjunto
cromossomo e depois ns vamos discutir como fazer de cromossomos aleatrios em uma populao que
para manipular uma populao inteira (isto , o fun- tenha ao menos uma soluo excelente dentro dela.
cionamento do GA propriamente dito). Fazemos isto Entretanto, como faremos isto, fica para os prximos
para ir do mais especfico para o mais genrico, j que pargrafos. Neste momento, vamos inicializar nos-
os cromossomos representam os indivduos, que so so cromossomo simplesmente fazendo um loop que
os conceitos mais simples usados pelas populaes. se repete N vezes (onde N o tamanho do vetor de
valores passado como parmetro) e em cada iterao
Representando um cromossomo escolhe um ou zero, aleatoriamente. A implementa-
At agora falamos muito em termos tericos. Va- o deste construtor pode ser visto na Listagem 1, a
mos ento implementar um GA para resolver o pro- seguir.
blema da mochila e conforme formos incrementando
nossa implementao, os conceitos vistos at agora Listagem 1. O construtor de nossa classe Cromosso-
ficaro mais claros. Tudo que falarmos aqui refletir mo. A chamada ao construtor padro, sem parmetros,
nas listagens que colocaremos nesta seo, que so simplesmente inicializa as variveis correntes, criando
o StringBuffer que armazena o cromossomo e definin-
partes da classe Cromossomo. Todos os cdigos usa-
do os valores padres das variveis internas.
dos neste artigo esto disponveis para download no
site http://www.algoritmosgeneticos.com.br.
Como colocamos na seo anterior, o nosso pri- public Cromossomo(double pesos[], double valores[],
meiro passo encontrar uma representao, isto , double limitePeso) {
uma forma de codificar a informao em cromosso- this();
this.pesos=new double[pesos.length];
mos que possam ser manipulados pelo nosso algorit-
this.valores=new double[valores.length];
mo gentico. Para tanto, vamos analisar o nosso pro- for(int i=0; i<pesos.length; i++) {
blema: ns temos N objetos que podem estar ou no this.pesos[i]=pesos[i];
dentro da mochila. Isto , temos N variveis binrias. this.valores[i]=valores[i];
Se considerarmos que cada varivel um bit, pode- }
mos representar uma possvel soluo como sendo this.limitePeso=limitePeso;
uma string de bits na qual a posio i ser igual a 1 re- for(int i=1;i<=pesos.length;i++) {
presenta o fato de que o objeto de nmero i ser colo-

/ 56
if (Math.random()<0.5) {
String crom=this.getCromossomo().toString();
cromossomo.append(0);
for(int i=0;i<crom.length();i++) {
} else {
if (crom.charAt(i)==1) {
cromossomo.append(1);
retorno+=getValores()[i];
}
somaPesos+=getPesos()[i];
}
}
}
}
if (somaPesos>this.limitePeso) {
Esta forma aleatria de inicializar a populao a es-
retorno=1;
colha da maioria dos trabalhos feitos na rea por ser }
a forma mais simples possvel. A lei das probabilida- return(retorno);
des sugere que teremos uma distribuio que cobre }
praticamente todo o espao de solues, mas isto no
pode ser garantido, pois a populao tem tamanho fi- De acordo com a teoria que colocamos nas sees an-
nito (lembre-se do seu curso bsico de estatstica: as teriores (e que est exposta de forma esquematizada
probabilidades s so valores exatos para um nmero na figura 1), precisamos agora especificar dois opera-
infinito de sorteios). dores: o de mutao, que corresponde s alteraes
Existem vrias outras formas de fazer a iniciali- aleatrias na natureza e o de crossover, que corres-
zao ou de tentar garantir a diversidade da popu- ponde reproduo sexuada.
lao inicial, mas como a inicializao aleatria a Vamos comear com o operador de mutao,
forma mais simples de todas, vamos ficar com ela pois ele mais simples, operando da seguinte forma:
neste momento. Nosso objetivo tentar entender ele tem associada uma probabilidade extremamente
como uma GA funciona. Quem quiser mais detalhes, baixa (usualmente da ordem de 0,5%) e ns sortea-
pode depois consultar meu livro sobre o assunto que mos um nmero entre 0 e 1. Se ele for menor que a
est mencionado na bibliografia do artigo ou ento, probabilidade predeterminada ento o operador atua
se gostarem do artigo e quiserem uma continuao, sobre o gene em questo, alterando-lhe o valor ale-
mandem e-mails para a revista! atoriamente. Repete-se ento o processo para todos
Eu estou o tempo todo falando em qualidade do os genes do filho sobre o qual estamos operando a
cromossomo, pois isto uma coisa realmente impor- mutao.
tante. Afinal, tenho que ter uma medida de como o O cdigo da Listagem 3 apresenta o mtodo mu-
cromossomo resolve o problema, tanto para saber se tao da classe Cromossomo, que no recebe par-
ele uma soluo aceitvel quanto para poder us-lo metros e retorna um elemento da classe Cromos-
dentro do esquema de evoluo. Vamos ento criar somo. Eu o fiz usando reflexo para permitir uma
uma funo de avaliao para nosso cromossomo generalidade posterior afinal, a ideia do GA po-
corrente. der adapt-lo ao seu problema especfico. Para tanto,
A funo de avaliao que usaremos uma sim- usamos o mtodo getClass para saber qual a classe
ples transcrio do nosso problema como um todo: concreta corrente e o mtodo newInstance da classe
somamos os valores associados aos elementos que obtida para instanciar o novo cromossomo que ser o
decidimos carregar para ver o valor do nosso cromos- filho gerado. Uma vez criado este novo filho, tudo que
somo. O problema que nossa mochila tambm tem fazemos um loop em que cada operao um sorteio
um limite de peso. Assim, tambm calculamos o peso determina se vamos mudar o bit corrente ou mant-
total de nossos elementos. Se eles passarem do limite -lo igual.
de peso, ento atribumos um valor de avaliao bem
baixo. No vamos atribuir zero, pois como veremos Listagem 3. O mtodo que realiza a mutao geran-
depois, valores de avaliao negativos ou zero no do um filho para nossa nova populao. Note como
so bem tolerados por outros componentes do GA, usamos a reflexo para criar nosso filho, fazendo com
mas isto outra classe e ns vamos por enquanto que nosso cromossomo seja genrico e possa ser reu-
continuar com nossa classe Cromossomo, sem nos tilizado em vrios tipos distintos de problema.
adiantar para outras classes importantes do sistema.
public Cromossomo mutacao() {
Assim, nossa funo de avaliao fica como exposta Class c=this.getClass();
na Listagem 2. Cromossomo filho=null;
try {
Listagem 2. O mtodo que usamos para avaliar filho = (Cromossomo) c.newInstance();
nosso cromossomo. StringBuffer resultado=new StringBuffer();
public double avaliacao() { for (int i=0;i<this.cromossomo.length();i++) {
double retorno=0; if (Math.random()<this.taxaMutacao) {
double somaPesos=0; if (this.cromossomo.charAt(i)==1) {

57 \
Depois de sorteado o ponto de corte, ns separa-
resultado.append(0);
mos os pais em duas partes: uma esquerda do pon-
} else {
resultado.append(1); to de corte e outra direita. importante notar que
} no necessariamente estas duas partes tm o mesmo
} else { tamanho. Por exemplo, se selecionarmos o ponto de
resultado.append(this.cromossomo.charAt(i)); corte nmero 4 da figura, a parte esquerda de cada pai
} tem 4 genes enquanto que a parte direita tem 1. Se
} pensarmos um pouco vamos perceber que se o nme-
filho.setCromossomo(new StringBuffer(resultado)); ro de genes for mpar, impossvel que as duas partes
} catch (Exception ex) {
de cada pai tenham exatamente o mesmo tamanho.
filho=null;
}
Afinal, nmeros mpares no so divisveis por dois.
return(filho); O primeiro filho composto atravs da concate-
} nao da parte do primeiro pai esquerda do pon-
to de corte com a parte do segundo pai direita do
ponto de corte. O segundo filho composto atravs
Uma vez compreendido o operador de mutao,
da concatenao das partes que sobraram (a metade
vamos analisar o operador de crossover. Podemos
do segundo pai esquerda do ponto de corte com a
dizer que este o operador mais importante, pois
metade do primeiro pai direita do ponto de corte).
ele replica a reproduo sexuada. Entenda que a es-
Um exemplo do funcionamento do crossover de um
colha da reproduo sexuada como modelo para os
ponto pode ser visto na figura 3.
algoritmos genticos no ocasional. A reproduo
O cdigo da Listagem 4 nos permite visualizar
sexuada utilizada por todos os animais superiores e
uma implementao deste algoritmo. Note que a
garante a diversidade biolgica, visto que combinan-
essncia do funcionamento do operador est mar-
do pedaos de genomas dos dois genitores podem-se
cada pelas linhas que criam as Strings stringFilho1 e
gerar filhos mais aptos e consequentemente com o
stringFilho2 que fazem exatamente a concatenao
passar das geraes a populao tende a evoluir. J
de metades como descrevemos at agora. O resto do
a reproduo assexuada no cria diversidade, visto
processo consiste no trabalho necessrio para criar
que cada filho idntico a seu genitor e consequen-
dois filhos cuja classe desconhecemos. Assim como
temente tem exatamente as mesmas habilidades e
fizemos no caso de mutao, usamos reflexo para fa-
aptides.
z-lo. Agora, precisamos tambm usar a classe Array,
Neste artigo ns vamos usar o operador de cros-
que nos permite criar o vetor de dois filhos que sero
sover mais simples, chamado de operador de crosso-
o resultado do processo reprodutivo.
ver de um ponto. Outros operadores mais complexos
Note que ao contrrio da mutao, que gerava
(e, por consequncia, mais eficientes) existem, mas
um filho s, o operador de crossover gera dois filhos e
no sero discutidos aqui por restries de espao.
ambos sero parte da nova populao que analisare-
O crossover de um ponto extremamente sim-
mos. Mais frente, quando discutirmos a classe que
ples. Tendo dois pais (que ns vamos discutir depois
controla a populao do nosso algoritmo gentico,
como selecionar), um ponto de corte selecionado.
ns veremos como controlar esta questo do nmero
Um ponto de corte constitui uma posio entre dois
de filhos gerados.
genes de um cromossomo. Cada indivduo de n genes
contm n-1 pontos de corte, e este ponto de corte Listagem 4. O mtodo que realiza a reproduo
o ponto de separao entre cada um dos genes que dentro do algoritmo gentico. Como ela fica dentro de
compem o material gentico de cada pai. Na figura um cromossomo e um processo sexuado, o cromos-
2 podemos ver um exemplo de pontos de corte. No somo this recebe como parmetro outro cromossomo
caso, nosso cromossomo composto de 5 genes e, por com o qual ele ir reproduzir. Note como mais uma vez
conseguinte, temos 4 pontos de corte possveis. usamos a reflexo para criar ambos os descendentes,
gene fazendo com que nosso cromossomo seja genrico
e possa ser reutilizado em vrios tipos distintos de
problema.

public Cromossomo[] crossover(Cromossomo outro) {


Class c=this.getClass();
Cromossomo[] filhos=null;
Pontos de corte 1 2 3 4 filhos = (Cromossomo[]) Array.newInstance(c,2);
try {
Figura 2. Exemplo de pontos de corte.

/ 58
(a) (b) (c)

Pai 1 Pai 1 Filho 1

Depois do
Selecionamos um operador de
ponto de corte crossover

Pai 2 Pai 2 Filho 2

Figura 3. Descrio da operao do operador de crossover de um ponto.

Note que o nico construtor pblico recebe a


filhos[0] = (Cromossomo) c.newInstance(); instncia do problema da mochila que nos interessa.
filhos[1] = (Cromossomo) c.newInstance(); Afinal, um GA uma tcnica gentica, mas ns temos
int posicaoCorte=(int) Math.round(Math.random()*
um problema especfico para resolver, no mesmo?
this.cromossomo.length()); Temos ento que embutir nosso problema dentro de
String stringFilho1=outro.getCromossomo(). nosso algoritmo gentico de forma que possamos en-
substring(0, posicaoCorte+1) +this.
getCromossomo().substring(posicaoCorte +1);
contrar a soluo que buscamos, pois este o nosso
String stringFilho2=this.getCromossomo(). objetivo final.
substring(0, posicaoCorte+1)+outro. Nosso primeiro passo para executar o GA ini-
cializar a nossa populao. Como cada cromossomo
getCromossomo().substring(posicaoCorte + 1);
filhos[0].setCromossomo(new StringBuffer( sabe inicializar-se aleatoriamente, usaremos o cons-
stringFilho1)); trutor de cada cromossomo como forma de realizar
filhos[1].setCromossomo(new StringBuffer( este trabalho. Assim, podemos ter um mtodo que
stringFilho2));
faz a inicializao aleatria da populao, cujo c-
} catch (Exception ex) {
filhos=null; digo pode ser visto na Listagem 5. Este mtodo ser
} chamado no comeo de cada execuo do algoritmo
return(filhos); gentico, para que possamos reinicializar nossa ten-
} tativa de resolver o problema. Como o GA pode ser
chamado vrias vezes, podemos ter algo dentro da
populao corrente, e por isto limpamos a lista de
Dentro da nossa classe Cromossomo temos mais cromossomos no comeo do mtodo.
alguns mtodos, especialmente alguns utilitrios que
so comuns a todas as classes, como toString() e com- Listagem 5. Mtodo da classe GA que inicializa a po-
pulao. Lembre-se de que nosso cromossomo, quando
pareTo(). No vamos coment-los aqui por limitao
criado, j se inicializa de forma aleatria. Assim, usa-
de espao, mas o cdigo est disponvel para down-
mos esta facilidade para criar nossa populao.
load e anlise.

public void inicializaPopulacao(int tamanhoPopulacao) {


A Classe controladora do GA this.populacao.clear();
At agora, tudo que ns fizemos foi criar uma for(int i=0;i<tamanhoPopulacao;i++) {
classe para representar uma soluo de um proble- this.populacao.add(new CromossomoMochila(pesos,
ma especfico. Esta classe j capaz de certas aes valores, limitePeso));
necessrias para um algoritmo gentico, como a re- }
}
produo e a avaliao, mas para efetivamente exe-
cutar um GA ns temos que controlar uma populao
e fazer as vrias geraes serem avaliadas e reprodu- Lembre-se que uma importante caracterstica de um
zidas. Para tanto, vamos criar uma classe chamada GA que ele mantm uma populao de solues a
GA, que representar o arcabouo de nosso algoritmo cada instante. Para tanto, ns vamos ter dentro de
gentico. nossa classe um atributo que uma List de solues,

59 \
chamada populao. Note-se que somos capazes de A ltima parte do mtodo run() consiste na parte
obter o melhor facilmente, como podemos ver na que fica fora do loop controlado por individuosGera-
Listagem 6, que nos mostra o mtodo getMelhorCor- dos. Ela corresponde ao momento em que temos uma
rente(). Usaremos este mtodo em vrios momen- populao completa da nova gerao e uma popula-
tos, mas ele especialmente necessrio no fim da o de pais. A pergunta : como faremos para compor
execuo do GA, quando precisamos escolher uma a nova populao?
das solues e, obviamente, a que nos interessa mais Na rea de algoritmos genticos e na figura 1, ns
a melhor de todas aquelas que foram evoludas. chamamos esta parte de mdulo de populao, que
Note que como a classe CromossomoMochila imple- o responsvel pelo controle da nossa populao. Por
menta a interface Comparable, podemos nos utilizar uma questo de simplicidade, assumiremos que esta
desta facilidade para ordenar os elementos usando o populao no pode crescer. Logo, os pais tm que
mtodo sort da classe Collections. Como este ordena ser substitudos conforme os filhos vo nascendo,
em ordem ascendente, ento o ltimo o melhor de pois estamos agindo como se o mundo fosse um lugar
todos (pois a comparao em CromossomoMochila pequeno demais para ambos conviverem. Isto pode
se d atravs da avaliao). parecer estranho, visto que estamos acostumados a
ver a populao humana sempre crescendo. Afinal, da
Listagem 6. O mtodo que retorna a melhor soluo nossa experincia de vida, sabemos que quando nas-
mantida pelo GA em cada momento. ce um beb, no obrigatrio que algum de alguma
gerao anterior caia fulminado! Entretanto, em am-
public CromossomoMochila getMelhorCorrente() { bientes de recursos limitados (gua, ar, comida etc.)
Collections.sort(populacao); este crescimento sem controle no permitido e os
return(populacao.get(populacao.size()-1)); prprios organismos tendem a limitar o tamanho da
} populao, seja tendo menos filhos, seja devorando-
-os ou de qualquer outra maneira que a natureza con-
siderar adequada.
Podemos agora ver o mtodo run() da classe GA que Podemos ento considerar que o nosso GA opera
chamado para executarmos o nosso algoritmo gen- em um ambiente de recursos limitados. Diga-se de
tico. Como podemos ver na Listagem 7, ele simples- passagem, isto verdade, pois nosso computador tem
mente representa uma implementao dos conceitos uma quantidade limitada de memria e ciclos de pro-
vistos na figura 1. Temos um lao baseado na varivel cessador. claro que estamos limitando a populao
geracaoCorrente que determina quantas geraes fo- a um tamanho bem inferior ao da memria como um
ram passadas. Como a figura 1 coloca, temos que de- todo, mas poderamos aument-la, caso necessrio
terminar um critrio de trmino e, no caso de nosso fosse.
GA mais simples, este ser determinado unicamente O mdulo de populao que utilizaremos por en-
pelo nmero de geraes decorridas (valor passado quanto extremamente simples. Sabemos que a cada
como parmetro). atuao do nosso operador gentico estamos criando
Dentro deste loop temos outro loop, que contro- dois filhos. Estes vo sendo armazenados em um es-
lado pela varivel individuosGerados. Ele representa pao auxiliar at que o nmero de filhos criados seja
o fato de que temos que gerar uma nova populao a igual ao tamanho da nossa populao. Neste ponto o
cada gerao, o que fazemos aplicando os operadores mdulo de populao entra em ao. Todos os pais
de crossover e mutao a pais selecionados atravs de so ento descartados e os filhos copiados para cima
chamadas ao mtodo selecionaPai, que veremos mais de suas posies de memria, indo tornar-se os pais
frente. da nova gerao. exatamente isto que o nosso c-
Agora que estamos iniciando nossa jornada atra- digo faz: limpa a lista populao e depois acrescenta
vs dos GAs, iremos trabalhar com a verso mais sim- todos os novos indivduos gerados a ela.
ples dos operadores genticos, na qual eles atuam Como sempre, existem maneiras mais complexas
em conjunto, como se fossem um s. Existem outros de lidar com o mdulo de populao, mas por uma
modos de selecionar qual operador ser aplicado em questo de simplicidade e de limitao de espao,
um determinado momento, mas agora o objetivo no vamos lidar com elas neste momento.
entender completamente os conceitos dos operado- Note que ns imprimimos o indivduo de melhor
res. Quem estiver interessado em ver outras manei- valor em cada gerao, para que possamos acompa-
ras de selecionar os operadores, pode consultar meu nhar a evoluo de nossa populao (o que timo
livro citado nas referncias. Assim, para aplicarmos em termos didticos) e para que tenhamos a soluo
em conjunto, primeiro aplicamos o crossover, que do problema que desejamos, o que, afinal, nosso
nos retorna dois filhos e adicionamos nova gerao objetivo. Para tanto, ns usamos o nosso mtodo get-
as verses destes filhos que sofreram a mutao. MelhorCorrente(), descrito anteriormente.

/ 60
Listagem 7. Mtodo run() da classe GA que efetiva- semelhantes e faltar diversidade a esta populao
mente executa nosso algoritmo gentico. para que a evoluo possa prosseguir de forma sa-
tisfatria. A este efeito denominamos convergncia
gentica, e selecionando de forma justa os indivduos
menos aptos podemos evit-lo, ou pelo menos mini-
public void run(double taxaMutacao, int numGeracoes, miz-lo. Lembre-se de que, na natureza, os indivdu-
int tamanhoPopulacao) { os mais fracos tambm geram uma prole, apesar de
CromossomoMochila melhor;
faz-lo com menos frequncia do que os mais aptos.
List<CromossomoMochila> novaPopulacao=
new ArrayList<CromossomoMochila>(); Logo, seria interessante reproduzir esta possibilida-
inicializaPopulacao(tamanhoPopulacao); de dentro dos GAs. Por isto, vamos usar um mtodo
for(int geracaoCorrente=0;geracaoCorrente simples capaz de implementar estas caractersticas,
<numGeracoes;geracaoCorrente++) { denominado o mtodo da roleta viciada.
double somaAvaliacoes=this.somaAvaliacoes(); Neste mtodo criamos uma roleta (virtual) na
novaPopulacao.clear(); qual cada cromossomo recebe um pedao proporcio-
for(int individuosGerados=0;individuosGerados< nal sua avaliao (a soma dos pedaos no pode su-
tamanhoPopulacao;individuosGerados+=2) {
perar 100%). Depois rodamos a roleta e o selecionado
int pai1=this.selecionaPai(somaAvaliacoes);
int pai2=this.selecionaPai(somaAvaliacoes); ser o indivduo sobre o qual ela parar.
CromossomoMochila[] filhos=populacao. O ato de rodar a roleta deve ser completamente
get(pai1).crossover(populacao.get(pai2)); aleatrio, escolhendo um nmero entre 0 e 100 (re-
novaPopulacao.add(filhos[0].mutacao()); presentando a percentagem que corresponde a cada
novaPopulacao.add(filhos[1].mutacao()); indivduo) ou entre 0 e 360 (representando uma po-
} sio do crculo) ou ainda entre 0 e a soma total das
populacao.clear(); avaliaes (representando um pedao do somatrio).
populacao.addAll(novaPopulacao);
Quando se faz este sorteio um nmero suficiente de
melhor=getMelhorCorrente();
System.out.println(Geracao #+geracaoCorrente+-> vezes, cada indivduo selecionado um nmero de
+melhor+ com avaliao +melhor.avaliacao()); vezes igual sua frao na roleta (quem lembra de
} suas aulas de probabilidade no ensino mdio sabe
} que esta igualdade s vlida, como em todos os pro-
cessos probabilsticos, quando o nmero de sorteios
igual a infinito. Entretanto, para um nmero grande
de sorteios, os valores obtidos so muito prximos ao
valor percentual da avaliao).
Falta apenas entender agora como os dois pais so
Obviamente no podemos girar uma roleta den-
selecionados e teremos um algoritmo gentico com-
tro do computador, sendo obrigados a trabalhar com
pleto em nossas mos. O mtodo que usaremos
conceitos abstratos, e no roletas fsicas. Logo, pre-
chamado de mtodo da roleta viciada e antes de par-
cisamos de uma verso computacional da roleta, que
tirmos para sua implementao, vamos discutir al-
dada por um algoritmo que pressupe que nenhum
guns conceitos importantes. indivduo tenha uma avaliao nula ou negativa. O
O mtodo de seleo de pais deve simular o me- cdigo Java que implementa estes conceitos dado
canismo de seleo natural que atua sobre as esp- na Listagem 8.
cies biolgicas, em que os pais mais capazes geram
mais filhos, ao mesmo tempo em que permite que os Listagem 8. Mtodo que implementa a seleo dos
pais menos aptos tambm gerem descendentes. pais usando o conceito de roleta viciada.
O conceito fundamental que temos que privile-
giar os indivduos com funo de avaliao alta, sem
desprezar completamente aqueles indivduos com private int selecionaPai(double somaAvaliacoes) {
int retorno=-1;
funo de avaliao extremamente baixa. Esta deci-
double valorSorteado=Math.random()*somaAvaliacoes;
so razovel, pois at indivduos com pssima ava- double soma=0;
liao podem ter caractersticas genticas que sejam Iterator<CromossomoMochila> it=this.populacao.
favorveis criao de um indivduo que seja a me- iterator();
lhor soluo para o problema que est sendo atacado, do {
caractersticas estas que podem no estar presentes soma+=it.next().avaliacao();
em nenhum outro cromossomo de nossa populao. retorno++;
} while ((it.hasNext())&&(soma<valorSorteado));
importante entender que se deixarmos apenas return(retorno);
os melhores indivduos se reproduzirem, a populao }
tender a ser composta de indivduos cada vez mais

61 \
Este mtodo primeiro escolhe um valor entre 0 e a como nmero 1, no como zersimo), totalizando
soma das avaliaes (passada como parmetro para exatamente 100kg. Note entretanto que toda e qual-
pelo mtodo run). Ns usamos o mtodo random quer soluo que inclua o 6 item vai exceder o limi-
para escolher aleatoriamente um nmero entre 0 e 1 te de peso da mochila, resultando em uma avaliao
que multiplicamos, nesta linha, por somaAvaliacoes bem baixa. Este tipo de problema em que o mximo
para obter uma percentagem do valor armazenado global est cercado de valores baixos chamado de
nesta varivel. problema enganador e nenhum mtodo tradicional
capaz de resolv-lo a contento.
O loop que fazemos usando o Iterator vai soman-
Note que avaliamos apenas 150 solues (15
do os valores das avaliaes de cada um dos indivdu-
geraes de 10 indivduos cada). Este um nmero
os. Quando exceder o valor determinado pelo sorteio
comparvel ao nmero de solues existentes que a
aleatrio, o loop termina. Note que colocamos um
soma das combinaes um a um (8), dois a dois (28),
teste para sair do loop se o Iterator no tiver mais ele-
trs a trs (56), quatro a quatro (70), cinco a cinco
mentos para nos fornecer. Isto no necessrio, mas
(56), seis a seis (28), sete a sete (8) e oito a oito (1),
sempre boa prtica de programao fazer o mximo
totalizando 255 solues. Isto s ocorre por que esco-
para evitar que erros aconteam em um programa.
lhemos um problema bem pequeno. Se tivssemos 20
Note que se a populao tiver zero indivduos, a ro-
objetos ao invs de 8 o nmero de solues possvel
tina retornaria 1 (isto , nenhum indivduo vlido),
chegaria aos milhes e poderamos ainda tentar po-
causando uma exceo no mtodo run(). Isto uma
pulaes relativamente pequenas (uns 100) com um
situao esdrxula, mas se voc for fazer um cdigo
nmero baixo de geraes (uns 40), gerando uma fra-
comercial baseado nestas listagens (que s tm fins
o pequena das solues totais.
didticos), deve tomar alguma precauo para lidar
A figura 4 mostra o resultado de quatro execues
com esta situao semi-absurda.
distintas de nosso algoritmo gentico. No alterei ne-
Obviamente, s coloquei neste artigo fragmen-
nhum parmetro entre as execues, apenas deixei a
tos de cdigo de forma a tornar claros os conceitos
aleatoriedade inerente dos GAs atuar de forma livre.
de algoritmos genticos. Mais uma vez, coloco que
Cada uma delas tem caractersticas interessantes que
aqueles leitores que quiserem os cdigos completos
nos trazem alguns conceitos que precisamos apren-
podem fazer o download do projeto para Netbeans
der antes de usar os GA para nossos problemas reais.
no endereo http://www.algoritmosgeneticos.com.br
Em (a) vemos uma populao que comea bem
onde tambm podem ser encontradas aulas que pre-
ruim e que efetivamente melhora at atingir uma so-
parei sobre o assunto e muitos outros recursos liga-
luo razovel. Note que esta execuo mostra que
dos rea dos GAs.
no existe nenhuma garantia de desempenho nos
GAs: h vrias solues superiores a esta que obtive-
Executando nosso algoritmo mos. Assim, percebe-se que um GA deve ser executa-
Para testar nosso algoritmo gentico ns temos do vrias vezes para se obter melhores resultados e a
uma classe Main que cria uma pequena instncia do medida de seu desempenho dada pela melhor solu-
problema da mochila e executa nossa GA, como pode o obtida um GA uma ferramenta para soluo
ser visto na Listagem 9. de um problema prtico e como tal deve ser tratada.
Listagem 9. Mtodo main que cria uma instncia do Em (b) vemos uma situao em que a populao
problema da mochila e executa o GA. j surge com um elemento muito bom que surgiu da
public static void main(String[] args) { inicializao aleatria. Depois, a populao nunca
melhora. Isto uma possibilidade real e mais uma vez
implica em no podermos fazer uma nica execuo
public static void main(String[] args) { e tambm no fato de que existe uma tendncia a me-
double pesos[]={10,20,30,20,10,90, 70, 100, 50}; lhora das solues de acordo com a seleo natural,
double valores[]={5,30,20,20,10, 120, 60, 10, 5}; mas no uma garantia de melhora.
GA meuGA=new GA(pesos, valores, 100); Em (c) vemos um caso interessante que consiste
meuGA.run(0.01, 15, 10); em uma populao que piora durante sua execuo
} antes de melhorar. Como falamos antes, no existe
garantia de que os filhos sero melhores do que os
pais possvel que o crossover e a mutao gerem
A instncia que criamos representa um problema filhos piores. Existem mdulos de populao que pre-
particularmente difcil. Seu mximo o valor 130, servam as melhores solues, chamados de mdulos
que consiste em colocarmos na mochila o 5 e o 6 com elitismo, mas eles s garantem a estabilidade do
itens (para nossa contagem estamos tratando o 1 melhor, no a sua evoluo.

/ 62
Por ltimo, em (d), vemos um GA que evoluiu importante entender que existem vrias clas-
para a soluo ideal. No existe garantia de que isto ses de problemas com uma soluo natural, que no
vai acontecer, mas mostrar que isto uma possibili- podem ser batida por nenhuma tcnica. Por exemplo,
dade real algo que provavelmente ser reconfortan- problemas de minimizao de funes quadrticas
te para voc, meu caro leitor. devem ser atacados com o mtodo de Newton, que
capaz de resolv-los em uma nica iterao.
Consideraes finais Entretanto, podemos afirmar que, como ferra-
Espero que este artigo tenha permitido que voc menta de busca, os GAs se mostram extremamente
compreenda todos os conceitos fundamentais sobre eficientes, encontrando boas solues para proble-
os algoritmos genticos. Eles so uma interessante mas que talvez no fossem solveis de outra forma,
ferramenta para efetuar buscas em espaos pratica- alm de serem extremamente simples de implemen-
mente infinitos, mas sua aplicabilidade limitada ba- tar e modificar. O custo de pessoal para implemen-
sicamente a este tipo de problema. GAs no so uma tao de um GA relativamente pequeno, pois GA
tcnica que revolucionar toda a cincia da compu- uma tcnica que tem vrios mtodos que podem ser
tao. Os praticantes de uma rea gostam, de uma reutilizados de forma indefinida, sendo os programas
forma geral, de promov-la anunciando que ela seria quase rudimentares em sua essncia. Existe um se-
a soluo milagrosa para todos os problemas compu- no escondido nesta afirmao, que pode ser resu-
tacionais existentes, mas uma anlise cuidadosa de mido em um trecho extrado de How to solve it, de
qualquer rea desmente tal hype. Z. Michalewicz e D. B. Fogel:

Figura 4. Resultado de quatro execues distintas do nosso algoritmo gentico.

63 \
Ao invs de devotar o tempo necessrio e o pen- meiro e, somente se elas se mostrarem incapazes de
samento crtico necessrio para entender um proble- resolver o seu problema a contento, parta para um
ma e para ajustar nossa representao dos seus re- algoritmo gentico.
quisitos, ns ficamos complacentes e simplesmente Lembre-se: uma pessoa que tem uma grande cai-
buscamos a sub-rotina mais conveniente, uma plula xa de ferramentas capaz de resolver mais proble-
mgica para curar nossas doenas. mas, e cada um deles de forma mais eficiente, do que
Esta afirmao procura dizer que a abordagem de uma pessoa que s tem um martelo ou uma chave de
simplesmente pegar um GA padronizado e execut- fenda. Mantenha a sua caixa de ferramentas sempre
-lo at o computador cansar ou at que um bom re- cheia!
sultado seja obtido no a melhor possvel. Muitos
praticantes da rea tm o hbito de simplesmente
pegar um GA com representao binria, com ope-
radores competitivos e probabilidade de 80% para
o crossover, taxa de mutao de 1% e populao de
100 indivduos, para tentar aplic-lo ao problema que
eles esto enfrentando neste momento. Ser que isto /para saber mais
parece uma soluo razovel? Espero que voc tenha
respondido no para esta pergunta.
A verdade que, como Michalewicz e Fogel apon- > Na MundoJ 46 eu escrevi um artigo intitulado
tam e como o teorema da inexistncia do almoo Comeando a pensar reflexivamente que cobre os
grtis categoricamente afirma, dois mtodos no in- principais aspectos da reflexo, especialmente aqueles que
formados tero, em mdia, o mesmo desempenho ao
usamos para criar os filhos dos nossos cromossomos.
longo de uma grande srie de problemas. Voc pode
at ter sorte na resoluo de um problema especfico,
mas sorte no um bom substituto para a competn- > A rea de algoritmos genticos muito maior do que um

cia e o estudo cuidadoso. artigo de revista, apesar deste ser suficiente para transmitir

Este resultado no deve deprimi-lo nem faz-lo os conceitos fundamentais para sua compreenso.
dizer que qualquer ferramenta igual. Ao contrrio, Entretanto, aqueles que quiserem se aprofundar podem
ele deve faz-lo ficar feliz por poder optar pelo uso buscar o meu livro, Algoritmos Genticos, publicado pela
de algoritmos genticos para a resoluo de proble- Editora Cincia Moderna e que j est em sua terceira
mas. Afinal, os GAs permitem que informaes sobre edio.
o problema sejam embutidas dentro da representa-
o (proibindo solues que desrespeitem restries
do problema), dentro da funo de avaliao (recom-
pensando aquelas solues que esto mais prximas
de resolver o problema) e at mesmo dentro dos ope-
radores genticos. Isto quer dizer que se pode espe- /referncias
rar que os GAs tenham um desempenho superior aos
algoritmos no informados em vrios problemas dif-
ceis de nossa vida cotidiana.
> LINDEN, R., 2012, Algoritmos Genticos, 3 edio,
A palavra mgica neste caso informao. Isto
Editora Cincia Moderna, Rio de Janeiro, 2012.
, antes de tentar resolver um problema, voc deve
entend-lo profundamente. Assim, voc poder es- > MICHALEWICZ, Z., FOGEL, D. B., 2010, How to Solve
colher a ferramenta correta. Se porventura esta fer- It: Modern Heuristics, 2 Edio, Springer-Verlag, Berlim,
ramenta for um algoritmo gentico, a sua compre- Alemanha.
enso do problema permitir que voc faa escolhas
inteligentes de representao, funo de avaliao e > RUSSEL, S. J.; NORVIG, P., Inteligncia Artificial, 2

operadores genticos, de forma que o desempenho de edio, Elsevier Editora, Rio de Janeiro, 2004.
seu GA seja maximizado. > TOSCANI, L. V., VELOSO, P. A. S., Complexidade de
Tudo isto faz com que cheguemos concluso de Algoritmos: anlise, projetos e mtodos, Ed. Bookman,
que um GA no deve ser, necessariamente, a primei-
Porto Alegre, 2009.
ra ferramenta na sua mente. Existem vrias tcnicas
tradicionais de resoluo de problemas que podem
ser aplicadas em vrias situaes. Considere-as pri-

/ 64

S-ar putea să vă placă și