Você está na página 1de 52

Introduo Lgica

Fuzzy com Java


Aprenda a utilizar esta importante tcnica de
Inteligncia Computacional em sistemas Java.
Autores: Diogo da Silva Magalhes Gomes e Max de Castro Rodrigues

O que fazer quando um processo de deciso inerentemente humano deve ser


automatizado? Como modelar e implementar uma aplicao de forma que ela
responda a estmulos de natureza imprecisa? Que ferramentas e tcnicas
podemos utilizar para simular computacionalmente o comportamento de um
motorista de carro, ou mesmo de um operador de bolsa de valores? Para
responder a estas perguntas, o presente artigo apresenta os conceitos,
modelagem e aplicaes prticas da lgica fuzzy, tcnica utilizada para que
processos automatizados se apropriem de particularidades do raciocnio
humano, como o processo decisrio multidisciplinar e a ponderao imprecisa.

Diariamente, precisamos lidar com informaes que, por sua natureza, no


podem ser representadas por valores numricos precisos e, apesar disso,
precisamos ter a habilidade de analis-las para tomarmos nossas decises.
So informaes que, embora possam ser mensuradas, envolvem certo grau
de incerteza e interpretao subjetiva, sujeitas a concluses divergentes se
apuradas por diferentes indivduos.

Por exemplo, quando precisamos nos deslocar de um ponto para outro no


pensamos no nmero de passos que teremos de caminhar para decidir se
tomaremos um nibus ou se iremos a p, analisamos somente se o destino
perto ou longe. Neste contexto, os termos perto e longe esto, portanto,
intrinsecamente ligados medida de distncia, mas de uma forma subjetiva e
imprecisa. O que para um indivduo considerado perto, para outro pode ser
longe.

A maneira como interpretamos e analisamos estes conceitos ocorre de forma


subjetiva, uma caracterstica do raciocnio humano. Esta abstrao e a
impreciso nela envolvida nos permitem, porm, levantar um interessante
questionamento: a partir de qual nmero de passos um determinado destino
deixa de ser considerado perto e passa a ser considerado longe? Para ilustrar
melhor esse cenrio, imagine que uma pessoa esteja dentro de sua casa. Em
um dado momento, ela comea a caminhar e se afasta de casa, um nico
passo de cada vez. A cada passo, ela analisa se a distncia para retornar para
casa considerada como perto ou longe. Em que momento especfico a
distncia percorrida deixa de ser considerada perto e passa ser considerada
longe? Um nico passo percorrido entre um instante e outro poder fazer
diferena em sua avaliao, ou seja, um destino considerado perto, com um
passo a mais, poder passar a ser considerado longe?

Este mesmo raciocnio foi empregado no sculo IV a.C. pelo filsofo Eubulides
de Mileto, na proposio que ficou conhecida como Paradoxo Sorites. Ele
questiona: quando um monte de areia deixa de ser um monte de areia, caso
retiremos um gro de cada vez?. Em sua proposio, ele define que se n
gros de areia so um monte, tambm o seriam (n1) gros. Ou seja, um nico

gro de areia no deveria fazer diferena nesta classificao. O mesmo se diz


do cenrio oposto: um gro de areia no faz um monte, e adicionando mais um
nico gro, tambm no faria diferena. Mas isso significa, por induo, que
nunca teremos um monte de areia, por mais que juntemos os gros um a um.

Outro exemplo que demonstra como a impreciso est inerentemente presente


em problemas no mundo real se refere ao clssico cenrio de classificao de
um copo como cheio ou vazio (Figura 1). Considere que um copo esteja
inicialmente vazio e gradativamente vai sendo preenchido com gua, uma
nica gota sendo adicionada a cada vez. At que momento poderamos dizer
que o copo est vazio? A partir de que momento especfico este copo poderia
ser considerado cheio?

Figura 1. Em que momento o copo deixa de ser considerado vazio, e passa a


ser considerado cheio?

De fato, o que ocorre que, assim como um nico gro de areia no poder
afetar de imediato a classificao no cenrio ilustrado pelo Paradoxo Sorites,
tambm no poder faz-lo aps uma nica gota ser adicionada ao copo, ou
aps um nico passo percorrido, no exemplo anterior. No mundo real, a
impreciso est inerentemente presente nestas situaes. Nestes cenrios,
tanto o copo quanto o monte de areia no podem ser considerados, de

imediato, como transitados de um conjunto (vazio) para o outro (cheio), aps


adicionar uma nica unidade. Na realidade, a cada unidade adicionada, esta
classificao gradativamente vai deixando de pertencer a um conjunto (ou
categoria), e aumentando sua participao (ou pertinncia) no conjunto
adjacente. Ou seja, a cada gota adicionada, o copo gradativamente vai
deixando de ser considerado vazio, e aumentando a sua correspondncia com
o que se define como sendo considerado cheio.

Na rea de computao, porm, comum buscarmos representaes precisas


para modelar este tipo de cenrio, desenvolvendo algoritmos que tentam
quantificar estes fatores utilizando valores precisos. Nestes casos, muitas
vezes especificado um valor limtrofe, a partir do qual a classificao para o
cenrio muda de um conjunto para o outro, ignorando sua natureza
invariavelmente imprecisa, podendo ocasionar perda de informaes
importantes que deixaram de ser consideradas. Por exemplo, um processo
tradicional de classificao poder arbitrar como longe a distncia entre dois
pontos a partir de um valor pr-estabelecido, no permitindo ponderaes
subjetivas.

A lgica fuzzy, tambm conhecida como lgica nebulosa ou difusa, uma


tcnica da rea de inteligncia computacional que nos permite representar
modelos que contenham certo grau de incerteza ou impreciso, caractersticas
de situaes do mundo real. Estas tcnicas nos permitem codificar softwares
que representem algoritmos mais prximos da forma como funciona o
raciocnio humano, obtendo resultados satisfatrios uma vez que valores
limtrofes e incertezas do modelo no so ignorados. Na lgica fuzzy,

diferentemente da lgica clssica, um elemento pode pertencer parcialmente a


um conjunto.

O surgimento do conceito de conjuntos fuzzy atribudo Lotfi Zadeh, da


Universidade da Califrnia, que, em 1965, lanou o artigo Fuzzy Sets,
introduzindo o assunto no meio acadmico [1]. Os precursores no uso prtico
desta tcnica em projetos so os japoneses, construindo um dos primeiros
sistemas de controle fuzzy de uso crtico na estrada de ferro de Sendai, no
Japo, no ano de 1987, controlando acelerao, frenagem e parada das
composies nas estaes metrovirias.

Sistemas baseados em lgica fuzzy podem ser utilizados em praticamente


todas as reas de conhecimento, como engenharia, matemtica, biologia,
medicina, etc. Como exemplos de sua utilizao prtica, podem ser citados os
seguintes tipos de sistemas: de controle embarcado, de apoio deciso, de
reconhecimento de faces ou de padres, de diagnstico mdico, de previso
do tempo, de clculo e gerenciamento de risco, de controle de trfego, de
conduo de veculos autnomos e de diversas outras finalidades [2]. O
universo dos sistemas de controle embarcados um caso especial, pois os
exemplos so facilmente encontrados em nosso dia-a-dia. Diversos
equipamentos domsticos e urbanos possuem modelos que contemplam a
lgica fuzzy em suas diretrizes internas [3], tais como: mquinas de lavar,
aspiradores de p, televisores, caixas registradoras, sistemas de alarme,
copiadoras, micro-ondas, foco automtico em cmeras fotogrficas, etc.

Uma das reas de aplicao em que tcnicas de lgica fuzzy so fortemente


empregadas a de desenvolvimento de jogos de computador, em funo de

sua caracterstica de tentar reproduzir em um ambiente virtual particularidades


do mundo real, inclusive suas imprecises e aleatoriedades.

Sistemas que utilizam lgica nebulosa podem ter suas instrues em software
e utilizar processadores de uso geral, optando por um custo mais baixo; ou ter
suas instrues presentes em hardware em Circuitos Integrados de Aplicao
Especfica (Application Specific Integrated Circuits), que acarreta em custos
mais elevados, porm obtm um processamento mais rpido.

Este artigo apresenta os principais conceitos sobre lgica fuzzy e sistemas de


inferncia fuzzy, demonstrando como utilizar estas tcnicas em sistemas Java
com o componente JFuzzyLogic. Para ilustrar estes conceitos so
apresentados dois casos hipotticos: a modelagem de um sistema de apoio a
deciso da rea de RH de uma empresa; e um simulador baseado em um
sistema de inferncias fuzzy, que utiliza uma base de regras para representar o
algoritmo de conduo de um veculo em direo a uma vaga de
estacionamento.

Lgica Fuzzy x Lgica Clssica


Tradicionalmente, uma proposio lgica clssica possui dois extremos: ou a
premissa completamente falsa, ou completamente verdadeira. S existe um
resultado possvel. Portanto, na matemtica clssica, a funo que define se
um elemento pertence ou no pertence a um determinado conjunto somente
poder assumir os valores 0 (falso), ou 1 (verdadeiro), conforme a Figura 2.

Figura 2. Funo de pertinncia de um conjunto clssico;

Entretanto, na lgica fuzzy, o resultado desta proposio poder variar em


graus de verdade, em que poderemos consider-lo como parcialmente
verdadeiro, ou parcialmente falso. Isto , um elemento pode pertencer
parcialmente a um conjunto. Desta forma, a funo de pertinncia (x) de um
elemento a um conjunto fuzzy pode assumir infinitos valores no intervalo [0,1],
entre o totalmente falso e o totalmente verdadeiro, conforme descrito na Figura
3.

Figura 3. Funo de pertinncia de um conjunto fuzzy.

Portanto, cada elemento do conjunto fuzzy tem um grau de pertinncia,


tambm chamado de grau de incluso, definido no intervalo [0,1], que descreve
a possibilidade do elemento pertencer a este conjunto. Quanto maior o valor,
mais compatvel o elemento ser em relao ao conjunto que o descreve.

Como o elemento pode pertencer parcialmente a um conjunto, possvel haver


uma transio gradual da classificao de um elemento entre um conjunto e
outro. Ou seja, entre o falso e o verdadeiro que definem se um elemento
pertence a um conjunto na matemtica clssica, infinitos valores podem ser
assumidos utilizando a lgica fuzzy (Figura 4).

Figura 4. Ilustrao com representao conceitual da pertinncia entre


conjuntos clssicos e as infinitas possibilidades tratadas pela lgica nebulosa.

Retornando ao exemplo apresentado pelo Paradoxo Sorites, a cada gro de


areia adicionado, o cenrio gradativamente aumenta sua participao no
conjunto que o descreve como um monte de areia, aumentando o valor do seu
grau de incluso neste conjunto.

Podemos observar cenrios desta natureza em diversas situaes cotidianas


como, por exemplo, quando precisamos classificar um determinado indivduo
por sua faixa etria. Para ilustrar, tomemos como base a classificao
oficialmente utilizada pelo Instituto Nacional do Semirido (INSA), em que a
populao brasileira classificada conforme o seguinte critrio, ilustrado na
Figura 5.

Figura 5. Tabela de classificao etria da populao, conforme o INSA.


Fonte:
http://www.insa.gov.br/censosab/index.php?option=com_content&view=article&i
d=101&Itemid=100

Este exemplo demonstra claramente um modelo em que so definidos valores


limtrofes entre os conjuntos, de maneira que a classificao de um indivduo
em cada faixa etria sofrer transies abruptas medida que sua idade
avana. Segundo a tabela, uma pessoa com 11 anos, 11 meses e 30 dias
considerada como uma criana. Mas, no dia seguinte, ao completar doze anos,
esta mesma pessoa ser diretamente reclassificada como adolescente, mesmo
que no tenham ocorrido mudanas biolgicas ou psicomotoras em sua
constituio neste curto perodo de um dia transcorrido (um nico gro de
areia, na analogia do Paradoxo Sorites). De fato, assim como ocorre com os
gros de areia, a pessoa, a cada dia que passa, vai gradativamente mudando
sua participao (grau de incluso) de um conjunto para o outro.

Na matemtica clssica, esta classificao poderia ser descrita pelo diagrama


exposto na Figura 6.

Figura 6. Grfico ilustrando conjuntos clssicos para classificao etria da


populao.

Utilizando a notao de conjuntos fuzzy, este mesmo cenrio poderia ser


representado pelo diagrama ilustrado na Figura 7.

Figura 7. Diagrama ilustrando a classificao etria da populao utilizando


conjuntos fuzzy.

Destaca-se que as fronteiras entre os conjuntos no so nitidamente definidas,


havendo inclusive certa interseo entre elas e, por isso, ocorre uma transio
gradativa dos graus de pertinncia entre os conjuntos medida que a idade do
indivduo avana. Podemos observar que o conjunto adolescente assumiu um
formato trapezoidal, iniciando-se a partir dos 10 anos, com um grau de
pertinncia zero, aumentando gradativamente at chegar a um pico aos 14
anos (onde um indivduo ser claramente definido como adolescente) com grau
de pertinncia igual a um, e depois diminuindo medida que sua classificao
transita para o conjunto seguinte, chegando novamente ao valor zero aos 21
anos.

Portanto, podemos definir que, neste exemplo, uma pessoa de treze anos
pertence aos conjuntos Criana e Adolescente em diferentes graus de
incluso, mas no pertence aos conjuntos Adulto e Idoso, pois nestes dois
ltimos casos o grau de pertinncia zero. Este indivduo com treze anos
pertence predominantemente ao conjunto adolescente, mas no deixando de
ser, porm, classificado tambm como criana em um menor grau de
pertinncia.

Este modelo de representao aproxima-se da forma como o entendimento


humano naturalmente compreende as imprecises inerentemente presentes
nas situaes cotidianas, pois no h fronteiras nitidamente definidas entre os
conjuntos, e facilita a maneira como podemos represent-las ao traduzi-las em
algoritmos matemticos.

Sistemas de Inferncia Fuzzy

Uma vez apresentado como os conjuntos fuzzy podem ser utilizados para
representar as incertezas e imprecises de um modelo, necessrio
compreender como se dar a modelagem de um algoritmo que ir utiliz-los
em um sistema real.

Sistemas de inferncia fuzzy, ou Fuzzy Inference Systems (FIS), buscam


representar a modelagem do raciocnio humano em forma de regras, ao invs
de um algoritmo explicitamente restrito a modelos matemticos exatos.

Comumente, quando procuramos expressar nosso raciocnio, naturalmente


desenvolvemos uma descrio no formato de um conjunto de implicaes
lgicas, do tipo se (antecedente) ento (consequente). medida que a
descrio se desenvolve, combinamos diversas sentenas atravs da utilizao
de operadores lgicos e e ou, como na sentena a seguir: se
(antecedente1) e (antecedente2) ento (consequente).

Para exemplificar, consideremos um cenrio hipottico de um sistema de


controle de velocidade de um veculo, que analisa sua velocidade atual e se
existe algum obstculo sua frente (como outro veculo), para ento decidir a
acelerao final ou frenagem a ser empregada, conforme o caso.
Naturalmente, se houver algum obstculo, o veculo dever frear, seno dever
acelerar, at atingir uma velocidade de cruzeiro satisfatria.

Neste cenrio, poderamos formar a seguinte proposio, considerando como


entrada as variveis velocidade e distncia do obstculo: se (velocidade alta)
e (obstculo perto) ento (acelerao frear). Neste caso, analisando as
entradas, o sistema decidir que o veculo deve acionar a frenagem
(acelerao negativa) caso haja um obstculo sua frente e sua velocidade

seja considerada alta. Observe que as regras foram descritas sem utilizar
valores precisos como entrada, mas apenas os conjuntos (ou parties) fuzzy
que descrevem o intervalo lgico a ser considerado em cada proposio. Na
lgica tradicional, esta regra provavelmente seria descrita como: se
(velocidade > 100km\h) e (obstculo <50m) ento (acelerao = -3m\s).

Cabe destacar, porm, que na lgica clssica, uma sentena somente seria
inferida caso todas as suas condies fossem verdadeiras. Isto ocorre de forma
diferente nos sistemas de inferncia fuzzy, pois as premissas assumem graus
de verdade. Isto se reflete no resultado do processamento da sentena.
Portanto, quanto maiores os graus de incluso das variveis de entrada
(velocidade e distncia do obstculo), maior ser o grau de incluso da varivel
de sada no conjunto correspondente, permitindo que a ao de acelerao ou
frenagem possa ser executada de maneira suave e progressiva.

O conjunto de regras pode ser considerado como o principal elemento de um


sistema de inferncias fuzzy, uma vez que representa a descrio do
conhecimento de um especialista a respeito do problema a que o sistema se
prope a tratar. O BOX 1 ilustra a arquitetura geral de um sistema de inferncia
fuzzy.

BOX 1. Arquitetura de um Sistema de Inferncias Fuzzy

A arquitetura de um sistema de inferncia fuzzy possui quatro componentes


principais: um processador de entrada (fuzzyfier), que transforma os dados de
entrada precisos em representaes nebulosas; uma base de conhecimento,
representada pelas variveis nebulosas, suas funes de pertinncia e um

conjunto de regras descritas por um especialista; uma mquina de inferncia


fuzzy, responsvel pela avaliao das regras e inferncia da sada; e um
processador de sada (defuzzifier), que fornece um nmero real como sada da
inferncia. A Figura 8 ilustra conceitualmente a arquitetura geral de um sistema
de inferncias fuzzy.

Figura 8. Arquitetura geral de um sistema de inferncias fuzzy

Desta forma, os dados precisos fornecidos como entradas para o sistema de


inferncias so transformados em dados nebulosos (fuzzification). Estes so
processados pelo ncleo de clculo, em funo do mapeamento de regras
definidas e ento, transformados novamente em dados precisos
(defuzzification), que so retornados como sada pelo sistema de inferncias.
importante destacar que tanto as entradas como a sada de um sistema de

inferncias fuzzy so valores numricos, que so internamente processados


utilizando-se definies fuzzy.

Apoio a deciso em um sistema de RH


O exemplo a seguir um estudo de caso simples [4], que demonstra como
realizado o processo completo de modelagem de uma funcionalidade utilizando
lgica fuzzy. Hipoteticamente, a necessidade sinalizada pelo setor de RH de
uma empresa, informando que preciso agregar uma nova funcionalidade ao
sistema atual. O objetivo da nova funcionalidade poupar o analista de RH da
tarefa de determinao dos valores de gratificaes dadas aos funcionrios,
evitando a parcialidade e promovendo a iseno reivindicada pelo quadro de
funcionrios insatisfeitos.

Atualmente, o especialista (analista de RH) atem-se a dois critrios: tempo de


experincia e tempo de formao/capacitao. De posse das informaes
preliminares, o projetista (analista/desenvolvedor/programador) observa que a
nova funcionalidade possui critrios nos quais as fronteiras de deciso no so
bvias, possuindo caractersticas de uma deciso estritamente humana,
suscetvel parcialidade e equvocos tendenciosos. O projetista ento conclui
que a lgica da nova funcionalidade se encaixa nos conceitos da lgica fuzzy e
decide pela tcnica para a soluo desejada.

Consultando mais detalhadamente o especialista, fonte de informao


fundamental em um projeto com lgica fuzzy, o projetista conclui que os
critrios de experincia e de capacitao sero usados como variveis de
entrada do sistema, sendo a experincia expressa entre 0 e 30 anos, enquanto

o tempo de capacitao expresso entre 0 e 15 anos. A gratificao a


varivel de sada, com valores entre R$0,00 e R$1.000,00. Estes intervalos so
conhecidos como o universo de discurso das variveis.

A prxima etapa do projeto particionar o universo de discurso, ou seja,


segmentar os intervalos de modo a poder atribuir a cada um deles um termo
lingustico. Tais termos so a representao de como o especialista
compreende as divises internas dos critrios. Sendo assim, o especialista
definiu que a varivel de entrada experincia se divide em trs segmentos:
pouca, mdia e muita; conforme a Figura 9. A varivel de entrada capacitao
seguiu uma diviso similar em trs parties: fraca, mdia e forte; conforme a
Figura 10. E a sada, representada pela varivel gratificao, foi dividida em
cinco termos: muito baixa, baixa, mdia, alta e muito alta; conforme a Figura
11.

Com os intervalos e suas parties j especificados, o projetista precisa definir


a forma dos conjuntos fuzzy, ou seja, a geometria da rea de incluso dos
conjuntos, podendo ter diversas feies como: triangular, trapezoidal,
gaussiana, etc.; sendo a mais simples e usual a forma triangular de
comportamento linear. Os critrios usados para a seleo da forma do conjunto
podem ser imprecisos e incertos, por isso geralmente eles so selecionados
atravs de tentativa e erro, atravs de experimentao continuada. Para os
objetivos deste exemplo, foi arbitrada a feio triangular para todos os
conjuntos.

Figura 9. Conjunto fuzzy definido para a varivel experincia.

Figura 10. Conjunto fuzzy definido para a varivel capacitao.

Figura 11. Conjunto fuzzy definido para a varivel de sada gratificao.

Observando a Figura 10, nota-se que o profissional com 10 anos de


capacitao seria avaliado pelo processo como parcialmente Mdia e
parcialmente Forte, pois existe um grau de incluso para estes dois
conjuntos, sendo mais presente em Mdia. De forma similar, algum com
uma experincia de 20 anos estaria includo nos conjuntos Mdia e Muita.
Nota-se que os conjuntos de pertinncia, ou seja, as formas triangulares,
encaminham a ponderao feita pela lgica fuzzy, determinando a proporo
de incluso nos critrios especficos.

Na sequncia, o especialista determina as regras que direcionaro a deciso


feita pelo sistema. A constituio das mesmas se faz com o encadeamento de
condies e uma concluso, na forma: SE <condio1> E <condio2> ENTO
<concluso>. A concluso indica a qual conjunto a varivel de sada pertence.
As regras para o problema de valorao de gratificao, definidas pelo
especialista, so as seguintes:
1. SE capacitao Fraca E experincia Pouca ENTO gratificao
Muito-Baixa

2. SE capacitao Fraca E experincia Mdia ENTO gratificao


Baixa
3. SE capacitao Fraca E experincia Muita ENTO gratificao
Mdia
4. SE capacitao Mdia E experincia Pouca ENTO gratificao
Baixa
5. SE capacitao Mdia E experincia Mdia ENTO gratificao
Mdia
6. SE capacitao Mdia E experincia Muita ENTO gratificao
Alta
7. SE capacitao Forte E experincia Pouca ENTO gratificao
Mdia
8. SE capacitao Forte E experincia Mdia ENTO gratificao
Alta
9. SE capacitao Forte E experincia Muita ENTO gratificao
Muito-Alta

Uma vez definidos os conjuntos de pertinncia e as regras, o sistema usando


lgica fuzzy j pode ser implementado utilizando uma linguagem qualquer e
uma API especialista que ser responsvel pela fuzzificao e defuzzificao.
A API receber as regras e os conjuntos fuzzy como parmetros alm das
variveis de entrada, de forma que gere a varivel de sada gratificao.
Existem diversas APIs disponveis para executar a tarefa, sendo a JFuzzyLogic
a indicada aqui.

Uma viso segmentada do processo de fuzzificao e defuzzificao pode ser


observada no diagrama da Figura 12, onde avaliado o caso de um

profissional com 10 anos de capacitao e 20 anos de experincia. O processo


usa a capacitao e a experincia informada para rastrear as regras que foram
ativadas e conclui que o profissional merecedor de uma gratificao de
R$600,00. Observando as regras j definidas e o diagrama da Figura 12, notase que as regras 5, 6, 8 e 9 foram ativadas por atenderem as condies
impostas. Por exemplo, a regra 5 foi ativada porque atendeu s duas condies
necessrias: a capacitao Mdia e a experincia Mdia, levando a
varivel de sada gratificao a ter um valor proporcional ao grau de incluso
das duas condies atendidas. O grau de incluso obtido no conjunto de sada
em cada regra, representado pela rea em negrito dos tringulos da varivel
gratificao, definido por um clculo matemtico de responsabilidade da API.
Com os graus de incluso dos conjuntos fuzzy de gratificao j ponderados
pela API (terceira coluna na direita do diagrama), a defuzzificao efetuada,
gerando a sada nica, que o valor de gratificao esperado como resultado
final do processo de deciso nebuloso.

Figura 12. Processo de fuzzificao e defuzzificao.

Neste exemplo, o mtodo de defuzzificao utilizado para obter o valor final,


descrito no ltimo grfico, foi o Centro de Gravidade. Existem diversos mtodos
possveis de serem utilizados nos processos de fuzzificao e defuzzificao
executados pela API, de maneira que cada mtodo efetua sua formulao
matemtica prpria. O que ocorre no interior da API, como esperado, fica
totalmente transparente para o projetista e seu detalhamento no faz parte do
escopo deste trabalho. Caso o leitor deseje saber mais, preciso um estudo
mais aprofundado por parte do mesmo em literatura especializada [1].

O exemplo da determinao do valor de gratificao, apoiado pela lgica fuzzy,


esclarece o processo de modelagem de uma soluo orientada a regras de

negcio, encontrada no dia-a-dia de muitos sistemas corporativos. No prximo


exemplo, mais extenso, o enfoque ser dado a um sistema de controle, onde a
modelagem, a formulao matemtica e a codificao so bem detalhadas.

O Simulador de Estacionamento de um
Veculo
Para demonstrar na prtica a construo de um sistema fuzzy, ser
apresentada a implementao em Java de um controlador baseado no clssico
problema do estacionamento de um veculo, amplamente referenciado na
literatura tcnica acadmica [5]. Este controlador utiliza um sistema de
inferncias baseado em regras para conduzir um veculo autnomo em direo
a um local predeterminado, representado por uma vaga de estacionamento.

O simulador ser desenvolvido em dois passos: o primeiro corresponde


implementao do controlador fuzzy, que o ncleo de inferncias, que
efetivamente processa as entradas e a sada em cada passo, e o
responsvel por calcular a trajetria do veculo. O segundo passo o simulador
grfico, utilizado para testar e validar o comportamento do controlador fuzzy,
permitindo ao usurio visualizar a trajetria percorrida e efetuar ajustes na
modelagem dos parmetros do controlador, caso necessrio.

O objetivo do simulador estabelecer um algoritmo inteligente capaz de guiar


um veculo, localizado em uma determinada posio do ptio, em direo a
uma vaga de estacionamento previamente demarcada. O veculo pode estar
em uma determinada posio x em relao ao eixo horizontal, e rotacionado

em um ngulo em relao a este eixo. O sistema de inferncias fuzzy ir


atuar como se fosse o motorista do veculo, especificando o ngulo em que a
roda deve ser girada para que o veculo seja guiado em direo ao local
definido. A condio de parada que o veculo esteja localizado na posio
central em relao ao eixo horizontal, e alinhado perpendicularmente a este
eixo, na rea demarcada como sendo a vaga de estacionamento.

Como anteriormente apresentado, os sistemas de inferncia fuzzy so


modelados semelhana do raciocnio de um especialista humano. Neste
caso, o especialista que poder descrever como um veculo deve ser
estacionado seria um motorista. Para descrever os passos necessrios,
basicamente ele explicaria que: se o veculo est localizado direita do ponto
de destino, o volante deve ser girado para a esquerda; se o veculo est
direita, o volante deve ser girado para a esquerda. Se o veculo, porm, estiver
alinhado com a vaga de estacionamento, o volante deve ser mantido na
posio central, para o veculo seguir em frente. As regras devem considerar
ainda o ngulo do veculo em relao ao ponto de destino, que deve ser
rotacionado para que fique alinhado verticalmente na vaga de estacionamento.

Dito isso, inicialmente iremos identificar as parties fuzzy para cada varivel
de entrada e estabelecer o conjunto de regras para representar o
conhecimento do motorista na forma de um sistema de inferncias fuzzy.

Neste cenrio, consideraremos duas variveis de entrada: a posio x


(distncia no eixo horizontal), e (ngulo do veculo em relao ao eixo
horizontal). O sistema de inferncias ir calcular o valor da varivel de sada
(ngulo da roda do veculo), que corresponde direo em que o veculo deve

ser encaminhado enquanto se desloca a cada passo. A condio de parada


de que ele deve estar posicionado dentro da rea demarcada (posio central
no eixo horizontal), em um ngulo de aproximadamente 90 (ngulo vertical).
Para simplificao do problema, a posio y do veculo no ser considerada
no clculo da inferncia. A Figura 13 representa as variveis de entrada e
sada consideradas pelo simulador.

Figura 13. Esquema das variveis de entrada e sada consideradas pelo


controlador fuzzy.

Ao iniciar a simulao, o veculo deve ser automaticamente direcionado por


uma trajetria que o conduza para a posio final determinada pela vaga no
estacionamento. O deslocamento do veculo simulado pelo sistema em uma
sequncia de passos, de forma que a cada passo o sistema de inferncias

receba como entrada a posio x e o ngulo , e calcule o ngulo para a


roda. A nova posio x e o novo ngulo do veculo sero, portanto,
atualizados em funo do valor retornado pelo controlador. A varivel w a
constante que representa a distncia fixa em que o veculo deslocado a cada
passo.

A Figura 14 descreve as funes que determinam como o veculo ser


movimentado a cada passo. Estas equaes de deslocamento sero utilizadas
pelo simulador grfico para movimentar o veculo em sua trajetria calculada
pelo controlador.
Cabe destacar que no passo seguinte da iterao as variveis x e
atualizadas sero novamente submetidas como entradas para o controlador, e
um novo valor de sada ser calculado em cada passo. Este lao de
repetio ser executado at que a condio de parada seja atendida: a
posio x deve estar prxima ao ponto central, e o ngulo prximo a 90.

Figura 14. Equaes que descrevem as funes de movimento do veculo a


cada passo.

A interface proposta para o simulador de


estacionamento

O processo de construo e modelagem de um sistema de inferncias fuzzy


ocorre de maneira iterativa. Neste cenrio, o sistema deve ser submetido a
diversos testes e ajustes em seus parmetros de modelagem, at que os
resultados obtidos sejam satisfatrios.

Uma vez construdo o controlador fuzzy, utiliza-se um ambiente de simulao


que fornece uma interface para visualizar graficamente a resposta do
controlador em funo dos valores de entrada, permitindo uma melhor
interpretao dos resultados para providenciar os ajustes necessrios. A
interface grfica para o ambiente de simulao objetiva reproduzir todos os
requisitos que foram especificados na construo do controlador fuzzy,
simulando um ambiente prximo ao real para a execuo dos testes. Obtendose resultados satisfatrios, o controlador poder ento ser implantado
definitivamente no dispositivo ou software para o qual foi projetado.

A Figura 15 ilustra a interface grfica proposta para o simulador, demonstrando


a imagem estilizada do veculo a ser movimentado, os botes para permitir o
incio/pausa da simulao, o boto para rotao do veculo em ambas as
direes e a opo para habilitar o recurso de rastro de trajetria. O boto de
rastro possibilita visualizar as diferentes trajetrias percorridas pelo veculo em
sucessivas simulaes. Ademais, o veculo pode ser arrastado com o mouse
para qualquer posio da tela, e rotacionado a partir dos botes de rotao,
para determinar a configurao inicial da simulao. Esta interface construda
com Swing e utiliza recursos simples de Java2D para posicionamento e rotao
do veculo.

No canto superior direito, um quadro apresenta a situao atual das variveis


envolvidas na simulao: a posio do veculo, seu ngulo de rotao e o
ngulo da roda.

Figura 15. Interface grfica para o simulador de estacionamento.

Construo do Controlador Fuzzy


O Controlador Fuzzy corresponde ao ncleo de inferncias responsvel por
calcular o valor apropriado para a sada, a partir dos valores fornecidos como
entrada, considerando os parmetros definidos em uma base de conhecimento
fuzzy. Neste caso, o controlador ir determinar o ngulo da roda em funo
da posio x e do ngulo de rotao do veculo.

Este ncleo de processamento deve ser independente de interface grfica. Ou


seja, objetiva-se que o controlador possa ser desenvolvido, testado e ajustado

de maneira a ser posteriormente implantado em um sistema especfico, seja


ele um sistema embarcado (em um veculo autnomo), um carrinho de
brinquedo ou um jogo de computador, por exemplo. Se os critrios utilizados na
modelagem permanecerem vlidos, o controlador dever responder da mesma
forma em quaisquer desses ambientes.

Identificao das parties Fuzzy


O primeiro passo para a construo do sistema de inferncias determinar as
parties nebulosas (ou conjuntos) em que cada varivel de entrada pode ser
dividida. Cada partio representa um intervalo de dados em que o universo de
discurso poder ser dividido, e possui um termo lingustico a ela associada.

Recorrendo ao exemplo anterior da classificao etria da populao, a


varivel idade foi dividida em quatro parties nebulosas, definidas pelos
termos lingusticos: criana, adolescente, adulto e idoso. Cada partio possui
um intervalo de dados vlido para cada faixa etria.

De forma semelhante, necessrio dividir as variveis de entrada em parties


que representem a localizao e a rotao do veculo, assim como o ngulo da
roda a ser calculado como sada. Esta diviso feita de forma a representar a
maneira como o entendimento humano interpreta o universo de possibilidades
para cada varivel, e determinada pelo especialista que est analisando o
problema.

Portanto, em relao posio do veculo (posio x), definiu-se que ele se


desloca ao longo de um eixo horizontal, podendo ocupar diferentes regies

neste eixo. Analisando subjetivamente o intervalo de dados, poderamos


estabelecer, a princpio, que o veculo pode estar localizado em uma posio
central neste eixo, ou estar localizado esquerda, ou direita. Especificando
um pouco melhor as possibilidades, podemos inserir mais duas regies (ou
parties) a este cenrio: a posio centro-esquerda e a posio centro-direita,
localizadas respectivamente entre as posies central e esquerda, e central e
direita.

O universo de discurso referente posio x pode ser ento subdividido em


cinco parties nebulosas: esquerda (LE), centro-esquerda (LC), centro (CE),
centro-direita (RC) e direita (RI). Cada partio representa um intervalo em que
o veculo pode ser posicionado. Neste exemplo, assumiremos que o eixo
horizontal possui 100 pontos no total (universo de discurso) e os intervalos para
cada partio nebulosa poderiam ser especificados conforme a Figura 16,
onde a posio central concentra-se no entorno do ponto x=50.

Figura 16. Parties fuzzy para a varivel de entrada posio do veculo.

Observe no grfico (Figura 16) que as funes de pertinncia fuzzy possuem


formatos triangulares ou trapezoidais, que definem o intervalo vlido para cada
conjunto. O conjunto CE, por exemplo, comea no ponto x=45 com grau de
incluso zero, chega a um pice no ponto x=50, que possui grau de incluso
igual a um, e por fim, no ponto x=55, retorna ao grau de incluso zero. Esta
funo triangular, portanto, definida pelos pontos {45, 50, 55}.

Seguindo a mesma linha de raciocnio, deve-se estabelecer as parties para a


varivel ngulo do veculo (), considerando que o veculo pode estar
rotacionado em um ngulo qualquer dentro do universo de discurso de 360.
Para que o veculo seja corretamente estacionado, ele deve estar alinhado com
a vaga de estacionamento, de maneira perpendicular ao eixo horizontal e,
portanto, em um ngulo de 90. Desta forma, a primeira regio facilmente
identificvel a que representa o ngulo vertical do veculo (VE), situada no
entorno de 90. A partir dela, podemos especificar as demais parties,
medida que o veculo estiver rotacionado um pouco mais para a direita ou para
a esquerda. Neste caso, optou-se por considerar o universo de discurso no
intervalo entre -90 e 270, totalizando 360, para que o conjunto vertical,
correspondendo ao ngulo de 90, possa ser representado no centro das
demais parties. A Figura 17 ilustra graficamente como estas parties esto
dispostas ao longo do universo de discurso, tomando por base a posio
vertical como referncia inicial, alinhada vaga de estacionamento. Observase que entre as parties as fronteiras no so claramente definidas, ou seja,
existe uma gradao na transio entre as parties.

Figura 17. Representao grfica das parties para a varivel rotao do


veculo ().

Desta forma, as seguintes possibilidades poderiam ser consideradas para as


parties nebulosas da varivel : inferior-direito (RB), superior-direito (RU),
vertical direita (RV), vertical (VE), vertical esquerda (LV), superior
esquerda (LU) e inferior esquerda (LB). Os intervalos de dados esto
descritos conforme ilustrado pela Figura 18.

Figura 18. Parties fuzzy para a varivel de entrada ngulo do veculo.


Para a varivel de sada , que corresponde ao ngulo da roda, optou-se por
criar sete parties para subdividir o universo de discurso, que se situa no
intervalo entre -30 a +30. Em termos gerais, esta varivel define o quanto a
roda deve ser girada para a direita, para a esquerda, ou mantida alinhada ao
centro, para direcionar o veculo ao local desejado. A roda alinhada ao centro,
no entorno do ngulo de rotao de 0, representada pela partio Zero (ZE).
As demais parties foram definidas tomando esta por referncia, caso a roda
seja girada em maior ou menor ngulo, positivo (para a esquerda) ou negativo
(para a direita). Portanto, as seguintes parties foram especificadas para esta
varivel (Figura 19): negativo grande (NB), negativo mdio (NM), negativo
pequeno (NS), zero (ZE), positivo pequeno (PS), positivo mdio (PM) e positivo
grande (PB).

Figura 19. Parties fuzzy para a varivel de sada ngulo da roda.

A Tabela 1 resume como foram determinadas as parties nebulosas para


cada varivel de entrada e para a varivel de sada, e os respectivos intervalos
para as suas funes de pertinncia. Os valores de cada intervalo sero
utilizados posteriormente, no tpico que apresenta a implementao do
controlador, para definir os parmetros necessrios aos clculos da inferncia.

Parties Nebulosas e Rtulos


Varivel de entrada ngulo do veculo

Varivel de Entrada x
deslocamento horizontal

Varivel de Sada ngulo da roda

RB

Right Below (-90, 45, -15)

LE

Left (0, 0, 10, 35)

NB

Negative Big
(-30, -30, -15)

RU

Right Upper (-15,


30, 60)

LC

Left Center (30, 40,


50)

NM

Negative Med
(-28, -15, -5)

RV

Right Vertical (45,


67, 90)

CE

Center (45, 50, 55)

NS

Negative
Small (-10, -5,
0)

VE

Vertical (75, 90,


105)

RC

Right Center (50, 60,


70)

ZE

Zero (-5, 0, 5)

LV

Left Vertical (90,


112, 135)

RI

Right (65, 90, 100,


100)

OS

Positive Small
(0, 5, 10)

LU

Left Upper (120,


150, 195)

PM

Positive Med
(5, 15, 25)

LB

Left Below (165,


225, 270)

PB

Positive Big
(15, 30, 30)

Tabela 1. Parties fuzzy e intervalos utilizados pelo sistema de inferncias.

Construo da base de regras


Uma vez definidos todos os conjuntos fuzzy para as variveis de entrada e de
sada, o prximo passo definir o conjunto de regras do sistema de inferncias
fuzzy, que correlaciona as implicaes lgicas entre os conjuntos de entrada
(condies) e o conjunto de sada (consequncia).

Estas regras so construdas semelhana de como seria o raciocnio de um


condutor humano nesta situao. Ou seja: se o veculo estiver esquerda da
vaga, a roda dever ser girada para a direita. Se o veculo estiver alinhado com
o centro da vaga, o ngulo da roda deve ser mantido.

Depois, algumas regras devem ser combinadas para concluir a lgica da


inferncia: se o veculo estiver localizado na posio central, mas estiver
rotacionado um pouco direita (ngulo menor que 90), ento a roda deve ser
girada um pouco esquerda (em um ngulo positivo), para redirecionar o
veculo.

Estas regras so ento transcritas na forma de sentenas lgicas que


correlacionam as parties definidas para as variveis de entrada com sua
correspondente consequncia lgica da varivel de sada.

Utilizando as definies anteriormente descritas para as parties fuzzy, o


exemplo acima seria transcrito como: se o veculo estiver localizado na
posio central (CE) e estiver rotacionado um pouco direita, em ngulo
menor que 90 (RV), ento a roda deve ser girada um pouco em um ngulo
positivo (OS), para redirecionar o veculo. Isto , a regra para o controlador
fuzzy seria interpretada como: se (posio x CE) e (ngulo do veculo RV)
ento (ngulo da roda OS).

A Tabela 2 descreve uma configurao completa utilizada para esta base de


regras, que determina o comportamento do algoritmo do veculo. Observe que
o nmero de regras resultado da combinao direta entre o nmero de
conjuntos fuzzy disponveis nas variveis de entrada. Portanto, uma vez que a
varivel posio x possui cinco conjuntos, e a varivel ngulo do veculo
possui sete conjuntos, teremos um total de 35 regras descritas para definir a
cobertura de regras completa para todas as situaes possveis. A Tabela 2
deve ser lida da seguinte maneira:

Se (x LE) e ( RB) ento ( PS);

Se (x LC) e ( VE) ento ( NM).

x
LE

LC

CE

RC

RI

RB

PS

PM

PM

PB

PB

RU

NS

OS

PM

PB

PB

RV

NM

NS

OS

PM

PB

VE

NM

NM

ZE

PM

PM

LV

NB

NM

NS

OS

PM

LU

NB

NB

NM

NS

OS

LB

NB

NB

NM

NM

NS

Tabela 2. Base de regras para o sistema de inferncias, combinando as


entradas para determinar o valor de .

Cabe destacar que no modelo do simulador ocorre um retro-processamento.


Ou seja, a cada iterao, o sistema de inferncias avalia as regras descritas
para a posio atual das variveis de entrada e retorna um valor de sada. As
variveis de entrada (posio e ngulo do veculo) so atualizadas em funo
do ngulo da roda calculado pelo controlador, e no passo seguinte so
novamente submetidas para processamento pelo sistema de inferncias. Por
isso, durante o trajeto do veculo, diferentes regies e regras sero ativadas,
at que a condio de parada do veculo seja atendida.

A base de regras inicialmente construda a partir da representao do


raciocnio de um especialista, e deve ser ajustada em sucessivas iteraes at
que os resultados sejam satisfatrios. Portanto, em sistemas fuzzy,
fundamental que sejam executados diversos ciclos de testes e ajustes nos
parmetros de configurao para que se possa obter os resultados desejados.
Observado os resultados dos testes, deve-se avaliar se a base de regras est

correta e oportunamente promover ajustes no formato ou no intervalo das


parties nebulosas para as variveis de entrada e sada.

Implementao do controlador com


JFuzzyLogic
O processamento dos clculos da inferncia envolve diversos clculos
matemticos, que ficam a cargo do JFuzzyLogic [6], um componente open
source inteiramente escrito em Java e que implementa um Fuzzy Logic
Controller (FLC) completo, baseado na especificao IEC 61131-7. Sua
utilizao objetiva evitar reescrever todo um conjunto de algoritmos e modelos
matemticos complexos necessrios ao processamento das informaes fuzzy,
adotando uma ferramenta robusta e amplamente utilizada, concentrando-se
apenas no assunto principal do artigo.

As definies dos parmetros do controlador fuzzy so realizadas atravs de


um arquivo texto no formato FLC, que ser utilizado pelo JFuzzyLogic. O
arquivo FLC define as variveis e parties fuzzy, alm da base de regras,
sendo composto pelos seguintes blocos:

Um bloco para declarao das variveis de entrada e sada;

Interface fuzzification, que traduz os valores numricos das entradas em


representaes fuzzy;

Interface defuzzification, que traduz os valores fuzzy em uma sada com


valor numrico.

A Listagem 1 apresenta o formato geral de um arquivo do tipo FLC. Cada


bloco de definies do arquivo FLC ser descrito nos tpicos a seguir.

Listagem 1. Formato geral de um arquivo FLC.


FUNCTION_BLOCK simulador

// Incio do bloco de definies

VAR_INPUT

// Definio das variveis de entrada

nome_variavel_entrada: REAL;
END_VAR
VAR_OUTPUT

// Definio das variveis de sada

nome_variavel_saida: REAL;
END_VAR
FUZZIFY nome_variavel_entrada
// definio das parties fuzzy e seus intervalos para cada
varivel de entrada
TERM PARTICAO_X := (0.0, 0) (10.0, 1) (20.0, 0)
END_FUZZIFY
DEFUZZIFY nome_variavel_saida
// definio das parties fuzzy e seus intervalos para cada
varivel de sada
TERM PARTICAO_Y := (0.0, 0) (50.0, 1) (100.0, 0) ;
METHOD : COG;

// Mtodo de defuzzificao (Padro o

Centro de Gravidade)
DEFAULT := 0;

// Valor default caso nenhuma regra seja

ativada
END_DEFUZZIFY
RULEBLOCK No1
// Definio do conjunto de regras para o controlador Fuzzy.
Este bloco ir descrever
// as correlaes entre as parties da varivel de entrada
com uma partio da varivel
// de sada
AND : MIN;

// Mtodo MIN utilizado no processamento do

operador lgico AND


ACT : MIN;

// Mtodo de ativao

ACCU : MAX; // mtodo de acumulao


// Incio da descrio de cada regra
// RULE 1 : IF variavel_entrada1 IS PARTICAO1 AND
variavel_entrada1 IS particao2

THEN variavel_saida IS particaoX;

END_RULEBLOCK
END_FUNCTION_BLOCK

Definies do arquivo FLC


O primeiro bloco do arquivo FLC declara as variveis de entrada (VAR_INPUT)
e de sada (VAR_ OUTPUT) que sero consideradas pelo controlador,
atribuindo-lhes um nome que ser utilizado nos demais blocos do arquivo e
tambm no cdigo Java para a passagem de parmetros durante o clculo da
inferncia. No caso do simulador de estacionamento, as variveis de entrada
so posicao_x e angulo_veiculo e a varivel de sada angulo_roda (Listagem
2).

Listagem 2. Declarao das variveis de entrada e sada no arquivo FLC.


VAR_INPUT

// Define variveis de entrada

posicao_x: REAL;
angulo_veiculo: REAL;
END_VAR
VAR_OUTPUT

// Define variveis de sada

angulo_roda: REAL;
END_VAR

O segundo bloco (FUZZIFY) define quais parmetros sero considerados na


etapa de fuzzificao para cada partio, ou seja, como os valores de entrada

sero transformados em representaes fuzzy. Esta declarao realizada a


partir das definies dos intervalos para os conjuntos fuzzy de cada varivel,
conforme anteriormente apresentado. Por exemplo, a varivel de entrada
posicao_x composta por cinco conjuntos fuzzy: esquerda (LE), centroesquerda (LC), centro (CE), centro-direita (RC) e direita (RI). Cada conjunto
possui uma funo de pertinncia que define seu grau de incluso dentro de
um intervalo vlido. Pode-se observar na Figura 11 que a funo de
pertinncia para o conjunto CE inicia com um valor zero no ponto x=45, chega
ao pice (com valor 1) no ponto x=50, e retorna ao valor zero no ponto x=55.
Portanto, a funo de pertinncia triangular para este conjunto definida pelos
pontos em que a funo possui o valor de mnimo inicial, mximo e mnimo
final: {45; 50; 55}. No arquivo FLC, o conjunto ser descrito pela seguinte
representao: TERM CE := (45.0, 0) (50.0, 1) (55.0, 0);.

As definies dos conjuntos fuzzy para as variveis de entrada posicao_x e


angulo_veiculo esto descritas na Tabela 1, e sua correspondente declarao
no arquivo FLC ser realizada conforme a Listagem 3.

Listagem 3. Descrio dos intervalos para cada conjunto fuzzy considerado


pelas variveis de entrada.
FUZZIFY posicao_x
TERM LE := (0.0, 0) (0.0, 1) (10.0, 1) (35.0, 0) ;
TERM LC := (30.0, 0) (40.0, 1) (50.0, 0) ;
TERM CE := (45.0, 0) (50.0, 1) (55.0, 0) ;
TERM RC := (50.0, 0) (60.0, 1) (70.0, 0) ;
TERM RI := (65.0, 0) (90.0, 1) (100.0, 1) (100.0, 0) ;
END_FUZZIFY
FUZZIFY angulo_veiculo
TERM RB := (-90.0, 0) (-45.0, 1) (15.0, 0) ;
TERM RU := (-15.0, 0) (30.0, 1) (60.0, 0) ;

TERM RV := (45.0, 0) (67.0, 1) (90.0, 0) ;


TERM VE := (75.0, 0) (90.0, 1) (105.0, 0) ;
TERM LV := (90.0, 0) (112.0, 1) (135.0, 0) ;
TERM LU := (120.0, 0) (150.0, 1) (195.0, 0) ;
TERM LB := (165.0, 0) (225.0, 1) (270.0, 0) ;
END_FUZZIFY

O prximo bloco (DEFUZZIFY) corresponde s definies que sero utilizadas


na etapa de defuzzificao, ou seja, como as informaes processadas pelo
controlador fuzzy sero traduzidas em nmeros precisos a serem fornecidos
como sada. Este bloco descrito da mesma maneira como o anterior,
especificando as representaes do intervalo de cada conjunto fuzzy utilizado
na varivel de sada (Tabela 1), conforme a Listagem 4. Este bloco tambm
define qual mtodo de defuzzificao ser utilizado para ponderar o valor final
da inferncia a partir das regras ativadas. Neste exemplo, utilizamos o mtodo
Centro de Gravidade (COG Center of Gravity), que melhor atende a maioria
dos casos. Para necessidades mais especficas, a API do JFuzzyLogic oferece
outros mtodos disponveis, que podem ser consultados em sua
documentao.

Listagem 4. Descrio dos conjuntos e intervalos considerados para a varivel


de sada.
DEFUZZIFY angulo_roda
TERM NB := (-30.0, 0) (-30.0, 1) (-15.0, 0) ;
TERM NM := (-25.0, 0) (-15.0, 1) (-5.0, 0) ;
TERM NS := (-10.0, 0) (-5.0, 1) (0.0, 0) ;
TERM ZE := (-5.0, 0) (0.0, 1) (5.0, 0) ;
TERM PS := (0.0, 0) (5.0, 1) (10.0, 0) ;
TERM PM := (5.0, 0) (15.0, 1) (25.0, 0) ;
TERM PB := (15.0, 0) (30.0, 1) (30.0, 1) ;
METHOD : COG; // Mtodo de defuzzificao. Utilizando Center of
Gravity

DEFAULT := 0; // Valor a ser utilizado caso nenhuma regra seja


ativada
END_DEFUZZIFY

A quarta e ltima etapa corresponde definio das regras que representam


as implicaes lgicas entre os conjuntos fuzzy das variveis de entrada e da
varivel de sada. Esta base de regras representa o comportamento do
algoritmo do controlador, e so descritas a partir da composio apresentada
pela Tabela 2. A sintaxe de declarao da regra segue o formato if-then: if
posicao_x is LE and angulo_veiculo is RB then angulo_roda is OS. A Listagem
5 apresenta as 35 regras que compem a base de conhecimento para as
inferncias do controlador fuzzy.

Ao utilizar operadores lgicos AND e OR, necessrio especificar o mtodo


que ser utilizado para o processamento das regras. comum utilizar o
mtodo MIN para o operador AND, e o mtodo MAX para o operador OR.
Devem-se definir tambm os mtodos de ativao e de acumulao, onde na
maioria dos casos os valores default que vm disponibilizados no template do
arquivo FLC podem ser utilizados, ou seja, MIN para ativao e MAX para
acumulao. O mtodo de ativao define como as parties de entrada de
uma regra ativada afetaro a sada correspondente. O mtodo de acumulao
determina o fator de ponderao a ser aplicado quando mltiplas regras so
ativadas. Alm destes, outros mtodos tambm so disponibilizados pelo
JFuzzyLogic em sua documentao, e podem ser utilizados em necessidades
mais especficas de customizao.

Listagem 5. Declarao do mapeamento das regras para o controlador fuzzy.


RULEBLOCK No1

AND : MIN;

// Mtodo MIN utilizado no processamento do operador

lgico AND
ACT : MIN;

// Mtodo de ativao

ACCU : MAX; // mtodo de acumulao


RULE 1 : IF Posicao_x IS LE AND Angulo_veiculo IS RB

THEN

Angulo_Roda IS PS;
RULE 2 : IF Posicao_x IS LE AND Angulo_veiculo IS RU

THEN

Angulo_Roda IS NS;
RULE 3 : IF Posicao_x IS LE AND Angulo_veiculo IS RV

THEN

Angulo_Roda IS NM;
RULE 4 : IF Posicao_x IS LE AND Angulo_veiculo IS VE

THEN

Angulo_Roda IS NM;
RULE 5 : IF Posicao_x IS LE AND Angulo_veiculo IS LV

THEN

Angulo_Roda IS NB;
RULE 6 : IF Posicao_x IS LE AND Angulo_veiculo IS LU

THEN

Angulo_Roda IS NB;
RULE 7 : IF Posicao_x IS LE AND Angulo_veiculo IS LB

THEN

Angulo_Roda IS NB;
RULE 8 : IF Posicao_x IS LC AND Angulo_veiculo IS RB

THEN

Angulo_Roda IS PM;
RULE 9 : IF Posicao_x IS LC AND Angulo_veiculo IS RU

THEN

Angulo_Roda IS PS;
RULE 10 : IF Posicao_x IS LC AND Angulo_veiculo IS RV

THEN

Angulo_Roda IS NS;
RULE 11 : IF Posicao_x IS LC AND Angulo_veiculo IS VE

THEN

Angulo_Roda IS NM;
RULE 12 : IF Posicao_x IS LC AND Angulo_veiculo IS LV

THEN

Angulo_Roda IS NM;
RULE 13 : IF Posicao_x IS LC AND Angulo_veiculo IS LU

THEN

Angulo_Roda IS NB;
RULE 14 : IF Posicao_x IS LC AND Angulo_veiculo IS LB

THEN

Angulo_Roda IS NB;
RULE 15 : IF Posicao_x IS CE AND Angulo_veiculo IS RB

THEN

Angulo_Roda IS PM;
RULE 16 : IF Posicao_x IS CE AND Angulo_veiculo IS RU

THEN

Angulo_Roda IS PM;
RULE 17 : IF Posicao_x IS CE AND Angulo_veiculo IS RV

THEN

Angulo_Roda IS PS;
RULE 18 : IF Posicao_x IS CE AND Angulo_veiculo IS VE

THEN

Angulo_Roda IS ZE;
RULE 19 : IF Posicao_x IS CE AND Angulo_veiculo IS LV
Angulo_Roda IS NS;

THEN

RULE 20 : IF Posicao_x IS CE AND Angulo_veiculo IS LU

THEN

Angulo_Roda IS NB;
RULE 21 : IF Posicao_x IS CE AND Angulo_veiculo IS LB

THEN

Angulo_Roda IS NM;
RULE 22 : IF Posicao_x IS RC AND Angulo_veiculo IS RB

THEN

Angulo_Roda IS PB;
RULE 23 : IF Posicao_x IS RC AND Angulo_veiculo IS RU

THEN

Angulo_Roda IS PB;
RULE 24 : IF Posicao_x IS RC AND Angulo_veiculo IS RV

THEN

Angulo_Roda IS PM;
RULE 25 : IF Posicao_x IS RC AND Angulo_veiculo IS VE

THEN

Angulo_Roda IS PM;
RULE 26 : IF Posicao_x IS RC AND Angulo_veiculo IS LV

THEN

Angulo_Roda IS PS;
RULE 27 : IF Posicao_x IS RC AND Angulo_veiculo IS LU

THEN

Angulo_Roda IS NS;
RULE 28 : IF Posicao_x IS RC AND Angulo_veiculo IS LB

THEN

Angulo_Roda IS NM;
RULE 29 : IF Posicao_x IS RI AND Angulo_veiculo IS RB

THEN

Angulo_Roda IS PB;
RULE 30 : IF Posicao_x IS RI AND Angulo_veiculo IS RU

THEN

Angulo_Roda IS PB;
RULE 31 : IF Posicao_x IS RI AND Angulo_veiculo IS RV

THEN

Angulo_Roda IS PB;
RULE 32 : IF Posicao_x IS RI AND Angulo_veiculo IS VE

THEN

Angulo_Roda IS PM;
RULE 33 : IF Posicao_x IS RI AND Angulo_veiculo IS LV

THEN

Angulo_Roda IS PS;
RULE 34 : IF Posicao_x IS RI AND Angulo_veiculo IS LU

THEN

Angulo_Roda IS PS;
RULE 35 : IF Posicao_x IS RI AND Angulo_veiculo IS LB

THEN

Angulo_Roda IS NS;
END_RULEBLOCK
END_FUNCTION_BLOCK

// Final do bloco de definies do algoritmo

Para facilitar a descrio do arquivo FLC, o JFuzzyLogic oferece tambm um


plugin para o Eclipse, com alguns recursos muito teis ao desenvolvedor,
como: autocomplete, cdigo com sintaxe colorida, visualizao grfica das

parties das variveis, etc. As instrues para instalao e uso do plugin do


Eclipse est disponvel no manual do JFuzzyLogic [7].

Implementao do controlador em Java


Uma vez concludas as definies descritas no arquivo FLC, a implementao
da classe Java para o controlador fuzzy torna-se muito simples. O primeiro
passo carregar o arquivo FLC e obter uma instncia da classe FIS, que
representa o controlador fuzzy. Esta mesma instncia ser utilizada durante
toda a simulao. Para isto, utiliza-se o mtodo load(), especificando o local do
arquivo FLC:
// Instancia o controlador a partir das definies do arquivo FLC
FIS fis = FIS.load(estacionamento.fis);

Opcionalmente, a instncia de FIS tambm pode ser carregada


dinamicamente, a partir do contedo com as definies do arquivo FLC,
permitindo maior flexibilidade, uma vez que ele pode ser gerado
dinamicamente pela aplicao:
File arquivoFis = new
File(SimuladorEstacionamento.class.getResource("estacionamento.fis").t
oURI());
String conteudoArquivoFis = new
String(Files.readAllBytes(arquivoFis.toPath()));
fis = FIS.createFromString(conteudoArquivoFis, true);

Em cada iterao da simulao, os dados referentes posio e ngulo atuais


do veculo so passados para o controlador utilizando o mtodo setVariable()

da classe FIS. O primeiro parmetro do mtodo corresponde ao nome da


varivel, como declarado no arquivo FLC, e o segundo o valor de entrada
para esta varivel. Aps definir os parmetros de entrada, deve-se chamar o
mtodo evaluate() da instncia FIS do controlador, que ir processar os
clculos para a inferncia, de acordo com a base de conhecimento definida no
arquivo FLC. O valor calculado para a sada, correspondente ao ngulo da
roda, obtido atravs do mtodo getVariable(ngulo_roda).getValue().

A passagem dos parmetros para a classe FIS e a lgica para o clculo da


inferncia em cada passo esto encapsuladas pelo mtodo
calculaInferencia(), da classe Controlador. Este mtodo recebe como
parmetros a posio e o ngulo atuais do veculo, e retorna o valor do ngulo
da roda calculado pelo controlador (Listagem 6).

O cdigo completo da classe Controlador, responsvel por instanciar a classe


FIS e calcular a inferncia apresentado Listagem 7.

Listagem 6. Passagem de parmetros e chamada ao clculo da inferncia pelo


controlador FIS.
public double calculaInferencia(double posicaoX, double
anguloVeiculo){
this.fis.setVariable("Posicao_x", posicaoX);
this.fis.setVariable("Angulo_veiculo", anguloVeiculo);
this.fis.evaluate();
double anguloRoda =
this.fis.getVariable("Angulo_Roda").getValue();
return anguloRoda;
}

Listagem 7. Classe responsvel pelo Controlador.

package br.nebula.veiculo;
import java.io.File;
import java.nio.file.Files;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sourceforge.jFuzzyLogic.FIS;
public class Controlador {
private FIS fis;
public Controlador() {
iniciaInferencia();
}
private void iniciaInferencia() {
try {
File arquivoFis = new
File(SimuladorEstacionamento.class.getResource("estacionamento.fis").t
oURI());
String conteudoArquivoFis = new
String(Files.readAllBytes(arquivoFis.toPath()));
fis = FIS.createFromString(conteudoArquivoFis, true);
System.out.println("Instancia de inferencias carregada
com sucesso");
} catch (Exception ex) {
Logger.getLogger(SimuladorEstacionamento.class.getName()).log(Level.SE
VERE, "Erro ao abrir o arquivo", ex);
}
}
public double calculaInferencia(double posicaoX, double
anguloVeiculo){
this.fis.setVariable("Posicao_x", posicaoX);
this.fis.setVariable("Angulo_veiculo", anguloVeiculo);
this.fis.evaluate();
double anguloRoda =
this.fis.getVariable("Angulo_Roda").getLatestDefuzzifiedValue();
return anguloRoda;
}

Para realizar a movimentao do veculo, o valor do ngulo da roda retornado


pelo controlador deve ser utilizado para calcular o novo ngulo de rotao e a
nova posio do veculo, que ser deslocado em uma distncia fixa em cada
iterao. Este clculo realizado conforme descrito pela equao apresentada
na Figura 14. A Listagem 8 apresenta o cdigo em Java do simulador,
responsvel por reposicionar e rotacionar o veculo em funo do valor
retornado pela inferncia a cada passo.

Listagem 8. Movimentao do veculo, a partir do valor retornado pelo sistema


de inferncias.
anguloRoda =
controlador.calculaInferencia(this.veiculo.getPosX(),this.veiculo.getA
ngulo());
int delta = 10; // constante que indica a distncia fixa deslocada a
cada passo
this.veiculo.setAngulo( this.veiculo.getAngulo() + anguloRoda);
double angulo_rad = (Math.PI * this.veiculo.getAngulo()) / 180; //
obtendo angulo em radianos
// calculando nova posio x e y, deslocando o veculo na distncia
delta
double posicaoX = this.veiculo.getPosX() + (delta *
Math.cos(angulo_rad));
double posicaoY = this.veiculo.getPosY() + (delta *
Math.sin(angulo_rad));
this.veiculo.setPosXY(posicaoX , posicaoX );
this.veiculo.rotate(anguloVeiculo);

Este simples algoritmo, implementado com o componente JFuzzyLogic,


suficiente para que o veculo se desloque em sua trajetria em direo ao local

pr-determinado. Cabe observar que toda a modelagem do algoritmo


inteligente foi definida no arquivo FLC, restando ao cdigo Java apenas a
passagem dos parmetros e as atualizaes da interface em funo dos
valores calculados pelo controlador fuzzy.

Com o controlador fuzzy implementado, podemos utilizar a interface grfica do


simulador para executar algumas rodadas de simulao, considerando
diferentes posies e ngulos iniciais para o veculo. Habilitando o recurso de
rastro, podemos observar que as trajetrias descritas durante as simulaes
foram satisfatoriamente encaminhadas para a posio final sinalizada pelo local
de estacionamento, conforme ilustrado na Figura 20.

Figura 20. Interface grfica ilustrando as trajetrias do veculo em simulaes


utilizando diferentes configuraes iniciais.

Aps uma bateria de experimentos para testar o controlador atravs do


simulador, o controlador est pronto para se tornar parte de um sistema de
controle embarcado.

Uma interessante aplicao futura seria implementar este simulador em um


modelo fsico, utilizando uma placa Arduino como integrador de hardware e
sensores de posicionamento para determinar as variveis de entrada. As
mesmas definies para o controlador fuzzy poderiam ser reutilizadas neste
caso.

O exemplo do sistema autnomo de controle de direo, apoiado por lgica


fuzzy, tenta elucidar o processo de modelagem e codificao de uma soluo
de automao simplificada. Solues similares so muito encontradas em
plantas industriais, onde um controlador projetado e um simulador
construdo para testar a eficincia do controlador ainda em ambiente
computacional. Uma vez homologado o controlador em ambiente simulado, ele
promovido para os experimentos em ambiente real. Aps o processo de
homologao, ele incorporado a um software ou hardware para uso na linha
de produo.

Alguns processos de deciso so prprios do raciocnio humano, normalmente


entendidos pela maioria das pessoas como impossveis de serem absorvidos
por um processo automtico. Noo vlida, porm superada, pois h algum
tempo a lgica fuzzy j existe para contrariar este entendimento. Assim, alguns
processos de deciso baseados em incerteza podem, atravs da lgica fuzzy,
ser modelados e aplicados a software e hardware de modo a serem
automatizados.

A automao desejada, seja ela para um sistema corporativo, seja ela para um
sistema de controle de automao industrial, deve ser elaborada por um
projetista (desenvolvedor) de forma a guiar o especialista na definio dos
conjuntos fuzzy e das regras. Uma vez munido destes insumos, o projetista
pode implementar a lgica em uma linguagem como Java utilizando uma
biblioteca como a JFuzzyLogic.

A partir dos exemplos prticos apresentados aqui, pode-se observar que


possvel construir solues com lgica nebulosa mesmo com pouco
conhecimento matemtico nesta rea. Inmeras necessidades podem ser
solucionadas desta forma, basta que o projetista compreenda que algumas
decises humanas so suscetveis de serem automatizadas. Alm disso,
tcnicas de inteligncia computacional baseadas em lgica fuzzy podem ser
utilizadas em diversas situaes na rea de computao, especialmente em
modelos que possuam alto grau de incerteza e impreciso.

Referncias
[1] Livro Fuzzy logic: a practical approach.

McNeill, F. M., & Thro, E. (2014).Fuzzy logic: a practical approach. Academic


Press.

[3] Exemplos de sistemas embarcados extrados do Livro Fuzzy logic for


embedded systems applications.

Ibrahim, A. (2003).Fuzzy logic for embedded systems applications. Newnes.

Links

[2] Artigo Real-Life Applications of Fuzzy Logic.


http://www.hindawi.com/journals/afs/2013/581879/

[4] Captulo do livro com o exemplo de sistema de RH.


http://ptgmedia.pearsoncmg.com/images/0135705991/samplechapter
/0135705991.pdf

[5] Artigo sobre lgica fuzzy, que menciona o clssico problema do


estacionamento de um veculo.
http://www2.ica.ele.puc-rio.br/Downloads/41/LN-Sistemas%20Fuzzy.pdf

[6] Pgina do componente JFuzzyLogic.


http://jfuzzylogic.sourceforge.net/html/index.html

[7] Manual do componente JFuzzyLogic, com instrues sobre o plugin para


Eclipse.
http://jfuzzylogic.sourceforge.net/html/manual.html#plugin

DevMedia
A DevMedia um portal para analistas, desenvolvedores de sistemas, gerentes e DBAs com
milhares de artigos, dicas, cursos e videoaulas gratuitos e exclusivos para assinantes.