Prévia do material em texto
INTELIGÊNCIA ARTIFICIAL
APLICADA
AULA 1
Prof. Luciano Frontino de Medeiros
2
CONVERSA INICIAL
Nesta aula você verá uma introdução sobre Inteligência Artificial, como
podemos classificar as definições básicas, o conceito de agente inteligente e um
breve histórico da Inteligência Artificial. Estes conceitos iniciais dão subsídios
para se estudar na sequência as linhas de pesquisa e o detalhamento de cada
uma destas abordagens.
TEMA 1: INTRODUÇÃO À INTELIGÊNCIA ARTIFICIAL
Quando falamos das criações tecnológicas construídas pelo ser humano
ao longo da sua história, a Inteligência Artificial (IA) surge como uma das áreas
de conquistas mais importantes alcançadas pela humanidade. Quando dirigimos
um carro, fazemos uma busca na Internet, acionamos um eletrodoméstico,
conversamos com um celular, controlamos uma fábrica automatizada, já estão
envolvidos vários algoritmos e dispositivos criados para simular em certa medida
o pensamento ou a ação humana de maneira a facilitar diversas operações. A IA
permite que as ferramentas criadas pelo ser humano alcancem um alto nível de
complexidade.
Quando a IA surgiu, em meados da década de 1950, havia uma grande
expectativa de que em pouco tempo, com o avanço da tecnologia dos
computadores, chegaríamos a máquinas que teriam o mesmo patamar de
inteligência da humanidade. Apesar desta expectativa, o que aconteceu foi a
constatação de uma série de fracassos e decepções obtidos nos projetos de
construção de IA, muito disso em função da subestimação dos processos
inteligentes que acontecem em nosso cérebro ou mente. Entretanto, mesmo com
tais fracassos, surgiram uma série de produtos durante as pesquisas, que
fizeram outros campos da Ciência da Computação evoluir, surgindo áreas tais
como a Engenharia de Software, Bancos de Dados e Processamento
Compartilhado. Podemos afirmar que a IA representa o ápice da história da
tecnologia, desde as ferramentas manipuladas em pedra pelos primeiros
3
hominídeos, passando pelas idades dos metais, os primeiros dispositivos e
relógios que utilizavam rodas dentadas, até o advento da computação. O homem
exterioriza as ferramentas a partir do seu intelecto como forma de adaptar-se
melhor ao ambiente ou mesmo alterá-lo. A tecnologia conta, a partir da IA, com
a simulação de processos inteligentes que auxiliam no reconhecimento de
padrões, na tomada de decisão ou na execução de
tarefas repetitivas.
Entretanto, as pesquisas relacionadas à IA têm características
diferenciadas, de acordo com a forma com a qual se abordam as questões de
inteligência. Por um lado, pode-se considerar a forma como os neurônios se
comunicam, própria da fisiologia do cérebro. Por outro, pode-se considerar a
maneira como a mente lida com símbolos e abstrações. Antes, é necessário
conceituar a IA e, para isso, é preciso saber primeiro o que é inteligência. Como
podemos definir a inteligência? Todos os seres vivos que possuem um cérebro
são, de certa forma, inteligentes? Ou apenas o ser humano que tem este
privilégio? Máquinas podem ser inteligentes? Mas a que tipo de inteligência nos
referimos? Pode-se notar que a intenção de definir “inteligência” não parece ser
algo simples ou trivial.
TEMA 2: DEFINIÇÕES DE INTELIGÊNCIA ARTIFICIAL
Não há uma maneira única de conceituar a Inteligência Artificial, por
termos uma série de elementos que se manifestam de maneira diferenciada e
também quanto às diferentes interpretações em como os processos de IA se
correlacionam com os mecanismos do cérebro e da mente humana.
Russel e Norvig (2004, p. 5) compilam diferentes definições a partir da
classificação em processos de pensamento, relativos aos mecanismos de
raciocínio e processos de ação ou comportamento, relativos ao
comportamento do artefato. Transversalmente a estes processos, considera-se
também a similaridade com relação ao ser humano ou a alguma racionalidade
envolvida. Dessa forma, produz-se quatro quadrantes em que as definições
podem ser classificadas.
4
Figura 1: Definições de IA classificadas em quatro quadrantes
Ser humano Racionalidade
P
e
n
s
a
r
Sistemas que pensam como seres
humanos
Sistemas que pensam
racionalmente
A
g
ir Sistemas que agem como seres
humanos
Sistemas que agem racionalmente
Fonte: adaptado de Russel e Norvig (2005, p. 5).
Quadro 1: Definições conforme os quatro quadrantes
Quadrante Definições
Pensar como ser
humano
“O novo e interessante esforço para fazer os computadores
pensarem...máquinas com mentes, no sentido total e literal”.
(HAUGELAND, 1985).
“[Automatização de] atividades que associamos ao
pensamento humano, atividades como a tomada de
decisões, a resolução de problemas, o aprendizado”.
(BELLMAN, 1978).
Pensar
racionalmente
“O estudo das faculdades mentais pelo uso de modelos
computacionais”. (CHARNIAK; MCDERMOTT, 1985).
“O estudo das computações que tornam possível perceber,
raciocinar e agir”. (WINSTON, 1992).
5
Agir como ser
humano
“A arte de criar máquinas que executam funções que exigem
inteligência quando executadas por pessoas”. (KURZWEIL,
1990).
Agir racionalmente
“A Inteligência Computacional é o estudo do projeto de
agentes inteligentes”. (POOLE et al., 1998).
Fonte: adaptado de Russel e Norvig (2004, p. 5).
Enquanto o “pensar” se refere aos mecanismos implícitos existentes no
cérebro/mente, o “agir” se refere à manifestação no mundo real de um
comportamento inteligente. Por exemplo, quando falamos de um software
inteligente que envolva tomada de decisões baseadas em um ser humano
especialista, estamos de acordo com a definição sobre “pensar como
um ser humano”.
Já no caso de um sistema inteligente, que execute raciocínios de acordo
com regras da lógica (por exemplo, utilizando um programa PROLOG –
programação lógica), caracteriza a definição do “pensar racionalmente”.
Um sistema de jogo de xadrez, que execute as regras de acordo com regras
definidas, também se caracteriza por esta definição.
Para saber mais...
O computador Deep Blue, desenvolvido pela IBM na
década de 1990, tornou-se famoso por vencer o
campeão mundial de xadrez Garry Kasparov. Veja
no link a seguir ou por meio do QR Code ao lado.
<http://operamundi.uol.com.br/conteudo/noticias/97
27/hoje+na+historia+1996++kasparov+derrota+o+c
omputador+deep+blue+da+ibm.shtml>.
6
O comportamento inteligente requer que exista uma ação sobre o
ambiente, sendo característico da automação e da robótica. No caso de um robô
antropomórfico, que execute movimentos similares ao ser humano
(por exemplo, o robô Asimo, desenvolvido pela Honda, que caminha, corre,
empurra carrinho de supermercado e serve cafezinho), é classificado na
definição do “agir como um ser humano”.
Para saber mais...
Conheça o robô Asimo, um projeto
desenvolvido pela empresa japonesa Honda,
idealizado para executar diversas tarefas do
cotidiano feitas pelo ser humano, por meio do
endereço abaixo, ou do QR Code ao lado.
<https://www.youtube.com/watch?v=Mp0lJz78
zEM>.
No caso de robôs que executem alguma atividade no ambiente,
de forma diferente de como um ser humano faria, caracteriza a definição do “agir
racionalmente”. Por exemplo, um robô aspirador de pó executa um algoritmo de
limpeza desviando de obstáculos de acordo com sensoriamento de proximidade
feito por ele. Um robô de solda em uma fábrica também pode ser considerado
nesta definição.
7
Parasaber mais...
O conceito de robô (do inglês robot) provém da
palavra robota, cunhada pelo escritor nascido
onde é hoje a República Tcheca, Karel Capek,
significando trabalho compulsório ou escravo.
Karel Capek escreveu a peça de teatro R.U.R.,
contando a história do cientista Rossum, que
desenvolveu uma substância utilizada na
história para a fabricação de humanoides.
Acesse no link “Robôs do Passado”,
http://www.select.art.br/robos-do-passado/, ou
por meio do QR Code ao lado.
TEMA 3: LINHAS DE PESQUISA
Os estudos na área de Inteligência Artificial são o resultado de uma
confluência de pesquisadores de diversas áreas do conhecimento, sejam da
Filosofia, Matemática, Engenharia de Computação, Ciências Cognitivas,
Psicologia, Cibernética, dentre outras. Muitos cientistas começaram as
pesquisas nas suas áreas de origem e depois foram avançando em outras
pertinentes à pesquisa de IA.
Mas a própria dúvida que permanece referente ao funcionamento do
cérebro, ou da mente, que tem suas ramificações na Filosofia e na Psicologia
Cognitiva, influencia na forma como se constrói os dispositivos inteligentes.
Se formos pela perspectiva de que existe o cérebro e seus elementos
mais básicos, os neurônios e as sinapses conectando-os, então o desejo é o de
construir cérebros artificiais, com neurônios artificiais que simulem a forma como
a eletroquímica dos cérebros biológicos funcionam. Mas no caso da perspectiva
de que existe uma mente que funciona a partir do processamento de símbolos,
como um software que é executado sobre um hardware (o cérebro fisiológico),
8
então o desejo é o de construir dispositivos que lidem com estes símbolos da
mesma forma que a mente humana funciona.
No primeiro caso, temos uma linha de pesquisa dentro da IA que se
denomina conexionista, a qual está interessada na arquitetura de dispositivos
que simulem as células biológicas que interagem para o surgimento de
processos inteligentes. Dentro da linha conexionista, temos como exemplo as
redes neurais artificiais e os sistemas imunológicos artificiais. As redes
neurais artificiais (RNA) constituem um campo de pesquisa em que a
preocupação é lidar com tarefas tais como o reconhecimento de padrões, a
previsão e a tomada de decisão utilizando redes de unidades conectadas,
treinadas a partir de algoritmos que funcionam baseados em amostras do mundo
real e podem assim aprender a classificar padrões (HAYKIN, 2001).
Os sistemas imunológicos artificiais são baseados no funcionamento do sistema
imunológico que aprende de uma forma muito rápida sobre elementos estranhos
(antígenos) que entram em um sistema vivo e que desencadeiam uma reação
contrária, com a produção de anticorpos para eliminar os antígenos (MEDEIROS
et al., 2008).
No segundo caso, temos a linha de pesquisa denominada simbólica.
A linha simbólica busca lidar com processos inteligentes, utilizando linguagens
baseadas em lógica e construção de redes semânticas para solucionar
problemas e simular conhecimento especialista para contextos de diagnóstico.
Os sistemas derivados desta linha de pesquisa se denominam ainda de
sistemas baseados em conhecimento. Nessa linha são derivadas as
pesquisas sobre a linguagem LISP (BITTENCOURT, 1998, p.169), que trabalha
com representação de conhecimento na forma de listas, e a linguagem de
programação lógica PROLOG, (PALAZZO, 1997, p. 2), que permite a
manipulação de símbolos por meio de representação de conhecimento na forma
de fatos e regras. Os sistemas especialistas (RUSSELL; NORVIG, 2004, p. 24)
são uma das áreas mais relevantes dentro da linha simbólica, referindo-se a
sistemas em que o conhecimento de um especialista humano em uma área bem
delimitada é representado em uma linguagem, de forma a permitir o diagnóstico
de situações e a execução de ações que seriam feitas como se fosse por um ser
9
humano. Portanto, é importante salientar que na linha simbólica, a preocupação
se volta à forma como a mente pensa, e não como o cérebro nas suas partes e
divisões funciona.
Ainda na área simbólica, temos as pesquisas que são feitas na área de
ontologias. As ontologias se referem a representações de conhecimento
alcançadas por consenso, em áreas específicas de domínio do conhecimento
humano, que podem ser manipuladas tanto por seres humanos quanto por
agentes inteligentes. As ontologias permitem tanto a representação quanto os
procedimentos para inferência e raciocínio sobre tal representação,
possibilitando o desenvolvimento da Web Semântica (CORCHO et al., 2008).
Outra linha de pesquisa que se soma às linhas simbólica e conexionista e
que foge do esquema mente-cérebro é a denominada linha evolucionária. As
pesquisas da IA na linha evolucionária se baseiam na forma como se processa
a evolução biológica sobre o planeta, e busca simular tais processos
evolucionários em sistemas de computador para a resolução de problemas.
Dentro desta linha de pesquisa, podemos encontrar uma das áreas mais
exploradas que são os algoritmos genéticos. Os algoritmos genéticos são
caracterizados como uma classe de algoritmos de busca. Eles implementam o
conceito de uma solução inicial, a qual evolui ao longo da execução do algoritmo,
em que são aplicados operadores que simulam a seleção natural biológica, o
cruzamento de cromossomos e a mutação genética, produzindo soluções
melhores ao longo de várias gerações (LINDEN, 2012). Outra área bastante
estudada é a programação genética. Aqui não há a preocupação de se fazer
programas, mas o próprio algoritmo cria programas iniciais e blocos de
programas que vão se combinando e evoluindo de acordo com o objetivo a ser
alcançado, até chegar em programas capazes de executar a tarefa. Também
são aplicados à programação genética processos equivalentes à seleção natural
biológica e à mutação genética (KOZA,1992).
10
Figura 1: Inteligência Artificial e suas linhas de pesquisa
TEMA 4: BREVE HISTÓRICO
A Inteligência Artificial tem o seu surgimento oficial como um campo de
pesquisas científicas a partir de 1956, por ocasião da Conferência de
Darthmouth. A proposta era de uma conferência de verão de 2 meses no
Darthmouth College (Hanover, New Hampshire) sobre temas como computação
automática, computação com uso da linguagem natural, redes neurais,
aleatoriedade e criatividade e abstrações. Os proponentes eram John McCarthy
(Darthmouth College), Marvin Minsky (Harvard University), Nathaniel Rochester
(IBM) e Claude Shannon (Bell Laboratories). No Quadro 2, temos uma biografia
desses proponentes e mais alguns pesquisadores da então nascente área de IA.
Quadro 2: Algumas personalidades e pesquisadores que auxiliaram a criação do campo da IA
Personalidade Descrição
John McCarthy
(1927-2011)
Considerado um dos fundadores, foi o primeiro a cunhar o
termo Inteligência Artificial, um dos organizadores da
Conferência de Dartmouth. Desenvolveu a família de
linguagens de programação LISP, que trabalha basicamente
com listas de dados. Teve influência no desenvolvimento da
linguagem ALGOL e popularizou a ideia de compartilhamento
de tempo (time sharing).
11
Marvin Minsky
(1927-2016)
Cientista cognitivo, considerado cofundador da área de
Inteligência Artificial e organizador da Conferência de
Dartmouth. Foi cofundador do laboratório de Inteligência
Artificial do MIT. Tem como principal contribuição a
construção do primeiro computador baseado em redes
neurais. Escreveu com Seymour Papert o livro “Perceptrons”,
no qual descreveu a incapacidade do perceptron simples
para resolvercertos problemas, como o problema do XOR.
Desenvolveu uma teoria da mente como uma sociedade de
agentes, em que a inteligência surge como um produto da
interação de partes
não inteligentes.
Nathaniel Rochester
(1919-2001)
Considerado cofundador da Inteligência Artificial, engenheiro
e pesquisador da IBM. Liderou um grupo de estudos em
vários projetos na área de reconhecimento de padrões e
teoria da informação. Dentre outros projetos, o grupo simulou
o comportamento de redes neurais abstratas em um
computador IBM 704.
Claude Shannon
(1916-2001)
Matemático americano, engenheiro eletrônico e criptógrafo, é
considerado o pai da teoria da informação. Propôs uma
medida de incerteza de informação que é o fundamento da
teoria matemática da comunicação. Também foi participante
e organizador da Conferência de Darthmouth, e é
considerado como um dos inventores do circuito digital e do
computador digital.
Norbert Wiener
(1894-1964)
Foi um matemático estadunidense, conhecido como o
fundador da cibernética. O primeiro a visualizar que a
informação como uma quantidade era tão importante quanto
a energia ou a matéria. Trabalhou para o governo americano
no desenvolvimento de sistemas de mira automática.
Desenvolveu o estudo dos sistemas
autorregulados e o conceito de retroalimentação negativa.
Foi integrante das conferências Macy, entre 1946 e 1953,
contribuindo para a consolidação da teoria cibernética.
12
Frank Rosenblatt
(1928-1971)
Psicólogo americano, considerado uma espécie de "homem
da renascença" devido à sua excelência em várias áreas,
incluindo computação, matemática, neurofisiologia,
astronomia e música. Inventou o Perceptron em 1957, um
dispositivo eletrônico construído de acordo com princípios
biológicos e que mostrava capacidade de aprendizado.
Desenvolveu e estendeu a ideia do perceptron em diversos
artigos e no seu livro "Princípios de Neurodinâmica".
Conforme a divisão das linhas de pesquisa, também podemos dividir o
histórico da IA em diferentes eventos. De forma geral, nos dias de hoje as
aplicações em mecatrônica e robótica não utilizam apenas elementos derivados
de uma teoria ou outra, mas abordagens híbridas, buscando explorar o que de
melhor cada técnica ou algoritmo pode oferecer, de acordo com os problemas
em questão.
Para saber mais...
O link com o documento sobre a chamada do
projeto de pesquisa de verão em Inteligência
Artificial, de autoria de John McCarthy, Marvin
Minsky, Nataniel Rochester e Claude
Shannon está disponível em: <http://www-
formal.stanford.edu/jmc/history/dartmouth/dar
tmouth.html>, ou por meio do QRCode
ao lado.
Na Figura 2 temos uma linha do tempo demonstrando alguns dos eventos
que aconteceram no desenvolvimento da linha conexionista. Basicamente, os
neurônios foram descobertos no início do século XX pelo neurofisiologista
espanhol Santiago Ramon y Cajal (1852-1934). Em 1943 nasce a área de redes
neurais com a primeira modelagem de McCulloch e Pitts de um neurônio artificial.
13
As redes neurais se disseminam a partir da pesquisa de Frank Rosenblatt, com
a criação do seu perceptron, um classificador binário baseado em entradas
provenientes de sensores e que podia decidir se tais entradas pertenciam a uma
classe específica.
Figura 2: Linha do tempo com alguns eventos relativos à linha conexionista da Inteligência
Artificial
14
Para saber mais...
Frank Rosenblatt fez uma série de
contribuições com os estudos sobre o
perceptron. Acesse em:
<http://csis.pace.edu/~ctappert/srd2011/rosenb
latt-contributions.htm>, ou por meio do
QRCode ao lado.
Figura 3: Linha do tempo com alguns eventos relativos à linha simbólica da Inteligência Artificial
De forma geral, durante o desenvolvimento da IA, o otimismo quanto à
decifração dos mecanismos da inteligência humana induziu muitas promessas
15
e, na sequência, decepções. Isso se deu tanto pelo um desconhecimento dos
princípios que fundamentam a inteligência quanto pelos limites práticos relativos
à capacidade de processamento dos computadores que estavam disponíveis à
época das pesquisas (RUSSELL; NORVIG, 2004).
Os pesquisadores da área de Inteligência Artificial eram bastante ousados
quanto às previsões do sucesso das pesquisas. Em 1957, Herbert Simon previa
que em dez anos um jogo de xadrez seria campeão mundial e um teorema
matemático relevante seria provado por um computador. Ainda que não tenham
levado dez, tais previsões se realizaram em quarenta anos.
Na Figura 3, temos descrita uma linha do tempo com alguns eventos
relacionados à linha simbólica.
A história da IA simbólica é dividida em três períodos: clássica,
romântica e moderna. A era clássica (1956-1970) tinha como objetivo a
simulação da inteligência humana, utilizando solucionadores gerais de
problemas e sistemas baseados em lógica proposicional e de primeira ordem. O
principal motivo do fracasso foi a subestimação da complexidade computacional
dos problemas.
Na era romântica (1970-1980), o objetivo já era o de simular a inteligência
humana em situações predeterminadas, utilizando formalismos de
representação do conhecimento adaptados ao problema, e não mais gerais
como proposto na era anterior. Mesmo assim, o motivo do fracasso foi a
subestimação da quantidade de conhecimento necessária para resolver mesmo
o problema mais banal do cotidiano. Entretanto, surgiram vários conceitos que
impulsionaram algumas áreas da ciência da computação como a orientação a
objeto, os ambientes de desenvolvimento e software e o processamento de
tempo compartilhado.
Na era moderna (1980 até este momento), o objetivo foi o de simular o
comportamento de um especialista humano ao resolver problemas em domínios
bem específicos. Como metodologias, utilizavam-se sistemas de regras de
produção, modelos de representação de conhecimento com incerteza e também
algumas abordagens conexionistas. Ainda assim, o motivo do fracasso
continuou sendo o das subestimações do problema de aquisição de
16
conhecimento. Porém outras áreas da computação foram beneficiadas com as
pesquisas, tais como a engenharia de software e bancos de dados.
A linha evolucionária se caracteriza pelo uso da teoria da evolução natural
e seus conceitos em simulações de computador e algoritmos para resolução de
problemas. Os modelos mais conhecidos são relativos à área de algoritmos
genéticos, programação genética, autômatos celulares e vida artificial.
Algoritmos genéticos são aplicados em problemas de otimização, na busca de
soluções ótimas em problemas intratáveis. Hoje se utiliza os conceitos de
algoritmos genéticos e programação evolucionária em arquitetura de circuitos
eletrônicos, programação de jogos, previsão do tempo, descoberta de
identidades matemáticas e modelagem de sistemas planetários extrassolares.
Na Figura 4, temos descrita uma linha do tempo com alguns eventos
relacionados à linha evolucionária da Inteligência Artificial.
Figura 4: Linha do tempo com alguns eventos relativos à linha evolucionária da Inteligência
Artificial
17
SÍNTESE
Nesta primeira aula iniciamos com a introdução ao estudo da Inteligência
Artificial, sua importância como área de pesquisa em franca expansão reunindo
conhecimentos de diversas áreas e pesquisadores. Aprendemos sobre as
diferentes definições de Inteligência Artificial conforme os quatro quadrantes
originados dos critérios dos processos de raciocínio e processos de
comportamento. Foramabordadas também as linhas de pesquisa
da IA: simbólica, conexionista e evolucionária, as quais demonstram diferentes
perspectivas na construção de sistemas inteligentes de acordo,
respectivamente, com a mente, o cérebro ou a teoria da evolução de Darwin. Um
breve histórico da Inteligência Artificial foi apresentado, enfatizando alguns dos
principais pesquisadores, tais como Marvin Minsky, John McCarthy, Nathaniel
Rochester, Claude Shannon, Frank Rosenblatt. Para cada linha de pesquisa em
detalhe foram evidenciados alguns dos principais eventos e pesquisadores. A
partir deste preâmbulo, estamos aptos a começar o estudo dos diferentes
conteúdos e técnicas de Inteligência Artificial, a começar pelo próximo capítulo,
abordando os agentes inteligentes.
REFERÊNCIAS
BITTENCOURT, G. Inteligência Artificial – Ferramentas e Teorias.
Florianópolis: Ed. da UFSC, 1998.
CORCHO, O.; FERNÁNDEZ-LÓPEZ, M.; GÓMEZ-PÉREZ, A. Ontologías. In:
Inteligencia Artificial. McGraw-Hill. 2008.
HAYKIN, S. Redes Neurais: Princípios e prática. Porto Alegre, Bookman, 2001.
KOZA, J. Genetic Programming. Boston-MA: MIT Press, 1992.
18
LINDEN, R. Algoritmos Genéticos. Rio de Janeiro: Ciência Moderna, 2012.
MEADOWS, M. S. Nós, Robôs: Como a ficção científica se torna realidade. São
Paulo: Cultrix, 2011.
MEDEIROS, L. F. Redes Neurais em Delphi. 2. ed. Florianópolis: Visualbooks,
2007.
______; RAUTENBERG, S.; BASTOS, R. C.; TODESCO, J. L. A Strategy for
Minimizing the Processing Time of the AINET Algorithm in the Construction of
Radial Basis Function Networks. In: DAGLI, C. H.; ENKE, D. L.;
BRYDEN, K. L.; CEYLAN, H.; GEN, M. (Org.). Intelligent Engineering Systems
through Artificial Neural Networks: Computational Intelligence in Architecting
Engineering System. New York: ASME, 2008, v. 18, p. 479-484.
PALAZZO, L. A. M. Introdução a Prolog. Pelotas: Editora UCPel, 1997.
RUSSEL, S.; NORVIG, P. Inteligência Artificial. tradução da 2. edição. Rio de
Janeiro: Campus, 2004.
INTELIGÊNCIA ARTIFICIAL
APLICADA
AULA 2
Prof. Luciano Frontino de Medeiros
2
CONVERSA INICIAL
Nesta aula você estudará os agentes inteligentes. Estes conceitos iniciais
dão subsídios para se entender as diferentes abordagens das linhas de pesquisa
e o detalhamento de algumas implementações.
TEMA 1: AGENTES INTELIGENTES
Na perspectiva da definição de IA do agir racionalmente, podemos definir
um agente como sendo um artefato equipado com sensores com capacidade
de perceber o ambiente e com capacidade de ação sobre o ambiente por meio
de atuadores (RUSSELL; NORVIG, 2004, p. 33). Se compararmos com um ser
humano, os sensores podem ser os olhos, ouvidos, nariz e aqueles que
permitem o tato. Quanto aos atuadores, podemos relacionar as mãos, pernas e
a boca, bem como outras partes.
Hoje em dia os robôs são construídos tendo sensores, tais como câmeras,
dispositivos de infravermelho, de som e ultrassom, de gás, de temperatura e de
umidade, dentre outros. Como atuadores, podemos relacionar os servomotores,
motores de passo, pistões hidráulicos e relês. Mas um agente precisa também
processar os sinais provenientes dos sensores para efetuar alguma ação que
seja caracterizada como inteligente sobre o seu ambiente.
A interação do agente inteligente com o ambiente pode ser visualizada na
Figura 1. Podemos definir, portanto, como percepções os sinais que são
captados do ambiente pelos sensores do agente, que são processados em
algum mecanismo de raciocínio, para depois transformarem-se em ações sobre
o ambiente por meio dos atuadores. Contudo um agente não deve considerar
apenas o que está sendo percebido no momento, mas também considerar a
memória do que já foi percebido por ele, o que podemos definir como uma
sequência de percepções. Dessa forma, uma ação a ser escolhida e executada
irá depender da sequência completa de percepções que um agente observou até
o momento presente. Em matemática, diz-se que o comportamento de um
3
agente é definido pela função do agente. A função do agente tem o objetivo de
mapear as possíveis ações com as sequências de percepções disponíveis no
armazenamento do agente (RUSSELL; NORVIG, 2004, p. 34).
Figura 1: Um agente inteligente e sua interação com o ambiente
Uma das dificuldades de construção de agentes inteligentes está em quão
completa pode ser a descrição do comportamento de um agente. Agentes que
desenvolvem tarefas simples, como um robô aspirador, têm uma função de
agente bem delimitada de forma a produzir um comportamento que pode ser
aplicado a uma gama bem definida de ambientes sobre os quais pode fazer a
limpeza. Por outro lado, um robô destinado a jogar xadrez representa um desafio,
pois a quantidade de jogadas possíveis chega a valores astronômicos
(aproximadamente 10120 possibilidades – o número estimado de átomos no
Universo chega a 1080). Dessa forma, um agente inteligente para o jogo de
xadrez deve ter a sua função de agente limitada, de forma que não leve milhões
de anos para fazer uma jogada, e que tenha memória suficiente para armazenar
jogadas possíveis considerando um horizonte de poucas jogadas à frente.
Uma função de agente pode ser implementada por meio de uma tabela
de possíveis ações relacionadas a uma sequência de percepções. Esta tabela é
4
pensada como uma caracterização externa do agente. Já dentro dos limites do
agente, a sua função é implementada por meio de um programa de agente.
Dessa forma, entende-se a função do agente como uma descrição matemática
abstrata, enquanto que um programa de agente é uma implementação
concreta, ligada à forma que o agente é construído, ou seja, à sua arquitetura
(RUSSELL; NORVIG, 2004, p. 34).
Utilizando um exemplo bastante simples, na Figura 2 temos um robô
aspirador e a representação do seu mundo. Esta abstração considera que o robô
está em um quadrado central que se refere ao estado inicial. Nos quadrados
restantes pode haver ou não sujeira. A partir daí uma sequência de ações deve
ser pensada de forma que o robô cumpra o seu objetivo de limpar o ambiente.
Note a identificação de cada quadrado como sendo um elemento de uma matriz.
Figura 2: Representação do ambiente de um robô aspirador, alguns quadrados contendo sujeira
ou não
Quadro 1: Mapeamento de ações para as sequências de percepções do robô aspirador.
Ord Sequência de Percepções Ação
1 [(2,2),Limpo] Mova-se em frente
2 [(3,2),Limpo] Mova-se à direita
5
3 [(3,1), Sujo] Aspire a sujeira
4 [(3,1), Limpo] Mova-se à direita
5 [(2,1), Limpo] Mova-se em frente
6 [(1,1),Sujo] Aspire a sujeira
7 [(1,1),Limpo] Mova-se à direita
8 [(1,2),Sujo] Aspire a sujeira
9 [(1,2),Limpo] Mova-se em frente
10 [(1,3),Limpo] Mova-se à direita
11 [(2,3),Sujo] Aspire a sujeira
12 [(2,3),Limpo] Mova-se em frente
13 [(3,3),Sujo] Aspire a sujeira
14 [(3,3),Limpo] Mova-se à direita
15 [(3,2),Limpo] Mova-se à direita
16 [(2,2),Limpo] Pare
Figura 3: Representação do ambiente de um robô aspirador com as ações mapeadas de acordo
com as sequências de percepções
6
É possível, com este exemplo de mundo do robô aspirador de pó, imaginar
uma série de variações. Para a construção da tabela (a função do agente), foram
escolhidas apenas quatro ações possíveis: mover-se para frente, mover-se à
direita, aspirar o pó e parar. Pode-se conceber outra sequência que contemple
mover-se à esquerda, ou mover-se aleatoriamente, etc.
Há uma maneiracorreta de se executar a tarefa? O que faz um agente ser bom
ou não, que possa ser considerado “inteligente”? Para isso, precisamos
conceituar o agente racional: o agente que, a partir das suas ações, obterá o
maior sucesso. Assim, é necessário algum método para quantificar o sucesso de
um agente.
Por meio de medidas de desempenho, pode-se verificar se um agente
teve sucesso na execução da sua tarefa. Como visto na Figura 3 e no Quadro 1,
a sequência de ações fez com que o robô aspirador passasse por uma sequência
de estados. Se esta sequência é a desejável, então pode ser dito que o robô
funcionou bem. A medida de desempenho precisa ser uma medida objetiva,
que seja planejada pelo projetista na construção do robô (RUSSELL; NORVIG,
2004, p.36). Nem sempre a definição de uma medida de desempenho é uma
tarefa fácil. Por exemplo, uma medida para o robô aspirador poderia ser o
número de ações ou o tempo consumido para executar a tarefa ou a qualidade
de limpeza em relação ao tempo consumido.
Com isso, podemos, agora, definir um agente racional da seguinte forma:
“Para cada sequência de percepções possível, um agente racional deve
selecionar uma ação que se espera venha a maximizar sua medida de
desempenho, dada a evidência fornecida pela sequência de percepções e por
qualquer conhecimento interno do agente” (RUSSELL; NORVIG, 2004, p. 36).
Assim, a racionalidade em qualquer instante depende de quatro fatores
(RUSSELL; NORVIG, 2004, p. 36):
A medida de desempenho como critério para obtenção do
sucesso da tarefa;
O conhecimento prévio do agente com relação ao ambiente;
7
As ações que o agente pode executar;
A sequência de percepções que o agente tem até o momento.
Analisando-se o exemplo do robô aspirador, uma medida de desempenho
pode ser feita a partir de uma pontuação para cada quadrado limpo em um
período definido de tempo (por exemplo, 9 quadrados limpos a cada minuto).
O ambiente do robô é previamente conhecido, ainda que a sujeira possa variar
de quadro a quadro. As ações que o robô pode executar são: mover-se à frente,
mover-se à direita, aspirar e parar. Na sequência de percepções, o robô percebe
o quadrado no qual se encontra (a partir de um leitor de posição ou acelerômetro,
por exemplo) e se neste há sujeira ou não (utilizando uma câmera). Assim,
podemos definir o robô aspirador como um agente racional.
A racionalidade em um agente significa que ele buscará maximizar o
desempenho esperado, não o desempenho real. Mas não quer dizer que ele
realizará de fato a melhor ação quando esperado. As situações no ambiente
podem mudar e outras variáveis que não sejam consideradas poderão
interferir, modificando o comportamento. A racionalidade é uma medida de quão
inteligente o agente poderá ser, mas não quer dizer que seu comportamento será
robusto o bastante para abarcar todas as possibilidades, quando exigido o seu
desempenho real.
Em outras situações, é necessário que o agente não reaja apenas às
informações que são coletadas, mas também possa aprender a partir das suas
percepções. O agente pode iniciar a sua tarefa tendo algum conhecimento prévio
e, à medida que vai interagindo com o ambiente, vai adquirindo mais experiência.
Nas situações em que o ambiente é completamente conhecido, o agente pode
apenas agir de acordo com a sua função de agente. Em ambientes que mudam
ao longo do tempo, é necessário projetar o agente de forma que esse possa
guardar novas regras que venham surgir.
Aliado a isso, temos o conceito de autonomia. A autonomia significa o
quanto o agente depende de um conhecimento prévio ou deve aprender ao longo
da sua tarefa para compensar premissas incorretas que foram planejadas.
8
Um agente que aprende novas regras do ambiente demonstra a sua autonomia.
Por exemplo, o robô aspirador, que prevê a probabilidade de aparecer mais
sujeira trabalhará melhor do que aquele que tenha as regras de atuação
predefinidas (RUSSELL; NORVIG, 2004, p. 38).
TEMA 2: NATUREZA DOS AMBIENTES
A caracterização do ambiente no qual o agente irá atuar determinará o
sucesso da sua execução. Quando o robô aspirador foi caracterizado como um
agente racional, foi preciso especificar a medida de desempenho, o ambiente
onde seria feita a limpeza e os sensores e atuadores do robô. Na modelagem de
um agente racional, precisamos definir de maneira tão completa e precisa
possível o ambiente de tarefa (RUSSELL; NORVIG, 2004, p. 39). O ambiente
de tarefa pode ser definido por meio do PEAS (Performance, Environment,
Actuators and Sensors – Desempenho, Ambiente, Atuadores e Sensores).
No Quadro 2 estão descritos alguns exemplos de tipos de agentes e as
descrições do PEAS.
Quadro 2: Exemplos de agentes racionais e as descrições do PEAS
Tipo de Agente
Medida de
desempenho
Ambiente Atuadores Sensores
Sistema de
diagnóstico
médico
Paciente
saudável,
minimizar custos
Quarto de
hospital,
paciente,
equipe
Mostrar
perguntas,
testes,
diagnósticos,
tratamentos
Entrada por
teclado, voz,
descoberta de
informação
Sistema de
xadrez
Calcular a
jogada ótima,
ganhar a partida
Tabuleiro 8x8,
peças de
xadrez,
posições
iniciais, jogadas
possíveis
Braço articulado
para mover as
peças
Câmera para
ver as posições
das peças
Tutor
inteligente
Maximizar as
notas dos alunos
nos testes
Área de
interação do
software, chat
de mensagens
Mostrar
conteúdos,
exibir exercícios
Entrada pelo
teclado
Robô de solda Efetuar os
pontos de solda
no tempo
Linha de
montagem.
Braço articulado
para
movimentos no
Identificação de
novo objeto a
ser soldado,
9
previsto,
qualidade da
solda
espaço, ponteira
de solda
quantidade de
solda,
temperatura de
solda
Fonte: adaptado de Russell e Norvig (2004, p. 40).
TEMA 3: PROPRIEDADES DOS AMBIENTES DE TAREFAS
Em IA, a variedade de ambientes para atender a diferentes tipos de
problemas é muito grande. Por isso, é interessante classificar os ambientes de
tarefas conforme categorias que influenciam na definição dos parâmetros dos
projetos. No Quadro 3, temos em detalhes a descrição de como os agentes
podem ser classificados de acordo com diversos critérios. No Quadro 4, estão
descritos alguns exemplos relativos a essas propriedades, que ilustram como
diferentes agentes inteligentes podem ser caracterizados.
Quadro 3: Descrição das propriedades dos ambientes de tarefa
Critérios Descrição Exemplo
Completamente
observável x
parcialmente
observável
Se os sensores do agente acessam de
forma completa os estados do ambiente
em cada instante, o ambiente é
completamente observável. Se houver
ruído, sensoriamento impreciso ou
lacunas nos estados, é parcialmente
observável.
Um jogo de xadrez á
completamente observável.
Um sistema de busca na
internet é parcialmente
observável.
Determinístico x
Estocástico
Se o próximo estado é completamente
determinado pelo estado atual e pela
ação executada pelo agente, o ambiente
é dito determinístico, senão, é
estocástico. Se o sistema é
determinístico mas apresenta elementos
estocásticos, o ambiente é dito
estratégico.
O exemplo do robô aspirador
de pó é determinístico. Um
carro com direção autônoma
é estocástico.
Episódico x
Sequencial
Num ambiente de tarefa episódico, o
agente experimenta os eventos de
maneira atômica, com os episódios
Um jogo de xadrez é
sequencial. Um robô10
começando com a percepção do agente
e na execução de uma única ação. Num
ambiente sequencial, há a dependência
dos estados atuais com os estados
anteriores.
aspirador de movimento
aleatório é episódico.
Estático x
Dinâmico
Caso o ambiente se altere enquanto o
agente está executando a tarefa, ele é
dinâmico. Se o ambiente não se modifica
ao longo da execução, é estático (Há
situações em que os ambientes podem
ser caracterizados como
semidinâmicos)
Um jogo de xadrez é estático.
Um carro com direção
autônoma é dinâmico (ou
semidinâmico, considerando
as rotas predefinidas).
Discreto x
Contínuo
Refere-se ao modo como o tempo é
considerado, e também ao estado do
ambiente e das percepções e ações.
Uma sequência de estados discretos
muda de forma brusca de um estado
para outro. Uma sequência de estados
contínua muda de forma suave.
Um jogo de xadrez é
considerado discreto. Um
sistema de refrigeração de
temperatura pode ser
contínuo.
Individual x
Multiagente
Se no ambiente existe apenas um
agente atuando para resolver o
problema, ou se o sistema considerado
é multiagente.
Um jogo de xadrez pode ser
um agente individual (Se um
agente joga contra outro, é
multiagente). Um sistema de
busca na internet pode ser
multiagente por utilizar vários
bots que encontram e
organizam a informação.
Fonte: adaptado de Russell e Norvig (2004, p. 41-42).
Quadro 4: Alguns exemplos com ambientes de tarefa e as propriedades
Ambientes Observável Determinístico Episódico Estático Discreto Agentes
Palavras
Cruzadas
Completamente Determinístico Sequencial Estático Discreto Individual
11
Jogo de
Xadrez
Completamente Estratégico Sequencial Semi Discreto Multi
Jogo de
pôquer
Parcialmente Estratégico Sequencial Estático Discreto Multi
Carro
autônomo
Parcialmente Estocástico Sequencial Dinâmico Contínuo Multi
Diagnóstico
médico
Parcialmente Estocástico Sequencial Dinâmico Contínuo Individual
Analista de
imagens
Completamente Determinístico Episódico Semi Contínuo Individual
Robô
seletor de
peças
Parcialmente Estocástico Episódico Dinâmico Contínuo Individual
Controlador
de
manufatura
química
Parcialmente Estocástico Sequencial Dinâmico Contínuo Individual
Sistema
Tutorial
Inteligente
Parcialmente Estocástico Sequencial Dinâmico Discreto Multi
Fonte: Russell e Norvig (2004, p. 44).
TEMA 4: ESTRUTURAS DE AGENTES
O estudo da natureza do ambiente de tarefa e as suas propriedades
envolveu apenas as questões de comportamento, ou seja, as ações que são
executadas para uma sequência de percepções determinada. A partir de agora,
é necessário estudar o funcionamento interno dos agentes. O programa do
agente faz parte do trabalho envolvendo IA, que implementa a função do agente
por meio do mapeamento das percepções com as ações. Assim, o agente
funciona por meio de uma arquitetura que implementa os sensores e atuadores
com algum processador que executa o programa do agente (RUSSELL;
NORVIG, 2004, p. 44).
12
Os agentes podem ser classificados em quatro tipos (RUSSELLL; NORVIG,
2004, p. 48):
Agentes reativos simples;
Agentes reativos baseados em modelo;
Agentes baseados em objetivos;
Agentes baseados na utilidade.
Agentes reativos simples
Os agentes reativos simples selecionam as ações a serem executadas
com base na percepção atual, desconsiderando o histórico de percepções.
No exemplo do robô aspirador de pó, o agente se baseia na sua posição atual
após o movimento e verifica se existe ou não sujeira.
Agentes reativos podem ser implementados utilizando as regras de produção
ou regras se-então (BITTENCOURT, 1998, p. 252). Uma regra faz o teste de
uma condição envolvendo as variáveis alimentadas pelos sensores e executa
uma ação específica quando esta condição é verdadeira.
SE <condição> ENTÃO <ação>
Por exemplo, o robô aspirador mostrado anteriormente pode possuir 4
(quatro) regras quanto à execução da limpeza e da movimentação:
1. SE estado = Sujo ENTÃO Aspirar
2. SE estado = Limpo ENTÃO faça movimento = SIM SENÃO faça
movimento = NÃO
3. SE faça movimento = SIM E quadrado na frente = SIM ENTÃO
direção do movimento = FRENTE
4. SE faça movimento = SIM E quadrado na frente = NÃO ENTÃO
direção do movimento = DIREITA
13
Neste sistema de quatro regras, a regra 1 se encarrega da limpeza do
quadrado por meio da variável estado. No caso de o quadrado estar limpo, então
a variável faça movimento recebe o valor SIM, o que é feito pela regra 2. Com
isso, as regras 3 e 4 ficam habilitadas para operarem. É testada então a variável
quadrado na frente (ou seja, armazena o valor do sensor que identifica o
quadrado). Se houver um quadrado à frente, então a variável de ação direção do
movimento recebe o valor FRENTE. Caso não houver (ou seja, o
quadrado estará à direita), então a variável direção de movimento recebe o valor
DIREITA.
É claro que essas regras são simples e presumem outras situações. Uma
destas pode ser quando o robô não encontra um quadrado à frente e assim ele
vai primeiro para a direita, para depois ficar na mesma direção do movimento.
Porém, servem para demonstrar de forma clara o agente reativo simples. O
programa do agente fica explícito na forma de regras que são executadas
durante a movimentação do robô. Entretanto, o robô deve ficar em constante
movimentação para fazer a limpeza, continuando a executar os movimentos
mesmo quando não existir sujeira. Se o robô puder manter um estado interno
relativo a todas as posições (ou seja, puder fazer uma varredura antes do
movimento), ele pode se movimentar de forma mais eficiente para executar a
tarefa de limpeza.
Figura 4: Esquema de um agente reativo simples
Fonte: adaptado de Russell e Norvig (2004, p. 47).
14
Agentes reativos baseados em modelos
Em um ambiente caracterizado por ser observável parcialmente, se o
agente puder manter internamente estados internos que sejam dependentes da
sequência de percepções, ele pode lidar de forma mais efetiva na resolução do
problema. Nesse caso, o agente trabalha com um estado interno que é
dependente das informações sobre como o mundo (ambiente) evolui. Voltando
ao robô aspirador, se ele tiver uma forma de armazenar o histórico das
percepções dos quadrados que ficam mais sujos que outros, então o programa
pode ser melhorado no sentido de o robô se movimentar mais pelos quadrados
nos quais é mais provável de aparecer sujeira. Outra situação é fazer com que
o robô consiga se atualizar, em um único momento, com relação à informação
de todos os quadrados.
Um agente que tem o conhecimento de “como o mundo funciona”, possui
o que se denomina de modelo do mundo. Assim, o agente que utiliza este
modelo é chamado de agente reativo baseado em modelo.
Figura 5: Esquema de um agente reativo baseado em modelo
Fonte: adaptado de Russell e Norvig (2004, p. 49).
15
Agentes baseados em objetivos
Ter o conhecimento do estado atual do ambiente não é condição
suficiente para que se decida o que fazer. Além de o agente saber uma descrição
do estado atual, é necessário ainda alguma informação quanto aos objetivos
que se relacionam a situações ou cenários desejáveis. Uma tomada de decisão
baseada em objetivos é diferente da utilização de regras se-então, por envolver
uma consideração sobre o futuro. O agente então se pergunta: “o que vai
acontecer se eu fizer esta ação ou aquela outra?” ou “isso irá me fazerfeliz?”.
Tais informações nos agentes reativos não são representadas de maneira
explícita, devido ao mapeamento direto das percepções para as ações. Ainda
que o agente baseado em objetivos possa parecer menos eficiente, ele tende a
ser mais flexível. O conhecimento que dá o suporte às suas decisões é
representado explicitamente, podendo ser atualizado ou modificado
(RUSSELLL; NORVIG, 2004, p. 49).
Aprimorando o exemplo um pouco mais, o robô aspirador pode ter um
objetivo de executar a sua tarefa, porém levando em consideração o custo de
operação ou consumo de energia. Com a execução ao longo do tempo, o robô
pode calcular a frequência com que as limpezas são feitas, e nos intervalos ele
pode entrar em modo de economia de energia para alcançar este objetivo.
Os objetivos permitem que se distingam entre estados “felizes e “infelizes”
de forma binária. Quando um agente precisa lidar com mais de um objetivo,
diferentes objetivos podem entrar em contradição ou nenhum deles pode ser
alcançado com certeza, então é necessário especificar o programa com uma
função que possa lidar com situações de forma mais adequada ou útil
(RUSSELLL; NORVIG, 2004, p. 50).
16
Figura 6: Esquema de um agente baseado em objetivo
Fonte: adaptado de Russell e Norvig (2004, p. 50).
Agentes baseados em utilidade
Uma função de utilidade permite quantificar o mapeamento de um estado
ou uma sequência de estados em um número que descreve o grau de “felicidade”
alcançado. Dessa forma, uma especificação de uma função de utilidade permite
a tomada de decisões racionais em dois casos em que os objetivos são
inadequados (RUSSELL; NORVIG, 2004, p. 50):
Quando são contraditórios e apenas alguns deles podem ser
alcançados;
Quando há vários objetivos e nenhum deles pode ser alcançado
com certeza.
No primeiro caso, uma função de utilidade pode especificar o grau de
compromisso mais apropriado. No segundo caso, uma função de utilidade pode
17
fornecer um número que expresse um grau de probabilidade de sucesso que
possa ponderar a importância dos objetivos.
TEMA 5: AGENTES COM APRENDIZAGEM
Até agora, temos visto a estrutura de diferentes agentes, alguns cujos
programas respondem diretamente às percepções, e outros com estados
internos que permitem a representação de algum conhecimento da evolução do
ambiente, tornando os agentes mais flexíveis às variações externas.
Estes agentes são criados com conhecimento prévio. Porém, é possível imaginar
uma situação na qual o agente possa atuar em um ambiente
que seja desconhecido inicialmente e ao longo do tempo ele possa
adquirir conhecimento?
O agente com aprendizagem permite ir além do conhecimento prévio na
construção do agente, dotando-o de mecanismos para que possa aprender na
experiência com o ambiente, tornando-se mais competente ao longo da sua
operação. Um agente de aprendizado pode ser dividido em quatro elementos
conceituais (RUSSELLL; NORVIG, 2004, p. 51-52):
Elemento de desempenho: é a parte considerada até agora sobre
agentes, que recebe as percepções e decide qual ação executar.
Crítico: elemento do agente que informa como o agente está se
comportando em relação ao seu padrão constante de desempenho.
Elemento de aprendizado: utiliza a informação proveniente do
crítico para modificar o elemento de desempenho em direção a um melhor
funcionamento no futuro.
Gerador de problemas: elemento responsável para sugestão de
novas regras e ações que podem levar a novas experiências.
18
Figura 7: Esquema de um agente com aprendizagem
Fonte: adaptado de Russell e Norvig (2004, p. 52).
Por exemplo, um carro autônomo pode dirigir numa estrada de acordo
com o elemento de desempenho embutido em sua programação, numa
velocidade definida e em uma faixa à esquerda. O crítico recebe informações do
mundo e vai repassando-as ao elemento de aprendizado. Caso algum carro que
está posicionado logo atrás esteja buzinando, o elemento de aprendizado pode
formular uma regra definindo que este cenário de direção em uma faixa central
ou à esquerda seja uma situação ruim, e assim o elemento de desempenho é
modificado para fazer com que o carro autônomo siga na
faixa da direita.
SÍNTESE
O conceito de agente inteligente é um dos mais importantes, pois é por
meio dele que iremos executar alguma tarefa que necessite de um processo de
19
pensamento ou de ação inteligente. Vimos também que um agente possui
sensores para monitorar o ambiente e atuadores para agir sobre ele. Assim, um
agente trabalha com percepções e ações. O comportamento do agente é
definido pela função do agente, a qual mapeia as possíveis ações com as
sequências de percepções à disposição no armazenamento de memória do
agente. A função do agente é entendida como o mapeamento abstrato, enquanto
que o programa do agente é uma implementação concreta deste mapeamento.
Foi estudado também que a racionalidade do agente depende da medida de
desempenho, do conhecimento prévio que este possui, da sequência de
percepções e das ações que o agente está apto a executar. Vimos também que
os ambientes possuem diferentes naturezas e propriedades que os definem. De
acordo com a estrutura, os agentes podem ser classificados em reativos simples,
reativos baseados em modelo, baseados em objetivos e baseados na utilidade.
Os agentes com aprendizagem podem ampliar o seu conhecimento prévio de
forma que ele tenha capacidade de aprender conforme executa a sua operação.
REFERÊNCIAS
RUSSELL, S.; NORVIG, P. Inteligência Artificial – tradução da 2. ed. Rio de
Janeiro: Campus, 2004.
MEDEIROS, L. F. Redes Neurais em Delphi. 2. ed. Florianópolis: Visualbooks,
2007.
LINDEN, R. Algoritmos Genéticos. Rio de Janeiro: Ciência Moderna, 2012.
BITTENCOURT, G. Inteligência Artificial – Ferramentas e Teorias.
Florianópolis: Ed. da UFSC, 1998.
PALAZZO, L. A. M. Introdução a Prolog. Pelotas: Editora UCPel, 1997.
MEADOWS, M. S. Nós, Robôs: Como a ficção científica se torna realidade. São
Paulo: Cultrix, 2011.
1
INTELIGÊNCIA ARTIFICIAL
APLICADA
AULA 3
Prof. Luciano Frontino de Medeiros
2
CONVERSA INICIAL
Nesta aula você estudará sobre os elementos relacionados à resolução de
problemas de busca, à formulação de problemas e exemplos, bem como às
estratégias de busca categorizadas em dois tipos: a busca sem informação e a
busca com informação, finalizando com a escolha de funções heurísticas.
CONTEXTUALIZANDO
Resolver problemas é uma das atividades mais nobres desenvolvidas pelo
intelecto humano (e mesmo outros seres vivos). Um dos tipos de agentes
inteligentes mais utilizados se refere aos que estão relacionados à resolução de
problemas. Encontramos tais problemas em diversas situações do dia a dia:
programar uma linha de produção em uma fábrica, encontrar a rota mais curta entre
um conjunto de cidades, programação de robôs que precisam operar buscando
mínimo custo, etc. Várias são as situações nas quais o agente precisa aplicar a
racionalidade para encontrar uma solução. Os problemas variam conforme o
número de elementos envolvidos e as regras que estes propõem. Portanto, o
conhecimento dos processos de resolução de buscas é um dos tópicos mais
importantes, estudados desde o início da Inteligência Artificial, os quais serão
abordados a partir de agora.
TEMA 1: RESOLUÇÃO DE PROBLEMAS POR BUSCA
Os agentes inteligentes mais simples, os reativos, conferem as suas ações
ao mapeamentodireto dos estados. Em ambientes nos quais tal mapeamento é
grande demais, tanto em termos de memória quanto de tempo de processamento,
os agentes não são eficientes. Nestes casos, os agentes que são baseados em
objetivos saem-se melhor por considerarem os possíveis cenários e o quanto os
resultados são bons ou não.
3
Os agentes de resolução de problemas tomam decisões sobre os próximos
passos, encontrando as sequências de ações que resultam estados desejáveis
(RUSSELL; NORVIG, 2004, p. 62). Por exemplo, um dos problemas presentes em
várias situações é o de roteirização. Este problema está presente na área de
logística e turismo, dentre outras. Quando se tem um conjunto de locais que
precisam ser visitados, considerando a existência de rotas definidas para estes
locais, um dos problemas típicos é como percorrer todos os locais considerando
um custo mínimo ótimo. Este problema foi descrito inicialmente na IA como o
problema do viajante.
Se considerarmos um mapa rodoviário, tal como o da Figura 1, se o objetivo
é sair da cidade de Foz do Iguaçu em direção até a cidade de Curitiba, o agente
deve escolher aquelas rotas ou cursos de ação que permitem chegar ao destino, e
aqueles que não permitem chegar em um tempo aceitável podem ser rejeitados,
simplificando assim a tarefa do agente. Dessa forma, a formulação de objetivos se
baseia na situação atual do agente e na sua medida de desempenho, configurando
o primeiro passo para a resolução do problema.
Aliado a este passo, a formulação de problemas é outro ponto essencial,
pois é o processo no qual se decidem quais estados e ações deverão ser
considerados na abordagem do problema, dado um determinado objetivo
(RUSSELL; NORVIG, 2004, p. 62). Supondo que, no exemplo anterior, o agente
esteja considerando as ações de dirigir de uma cidade até a próxima, os estados
da rota adotada corresponderão a estados do problema.
4
Figura 1: Mapa rodoviário simplificado do Estado do Paraná
Supondo-se que o agente esteja em Cascavel, ele considera qual caminho
pegar, podendo decidir ir por Campo Mourão, Guarapuava ou por União da Vitória.
Entretanto, nenhuma destas cidades é o objetivo, que é o de chegar até Curitiba.
Se o agente não tiver familiaridade com o trajeto, ele não saberá qual dos caminhos
seguir. Em suma, o agente não poderá escolher um curso de ação porque não terá
o conhecimento de qual estado resulta na execução de uma determinada ação.
Caso ele não tenha nenhum conhecimento, se o agente não for programado para
escolher aleatoriamente um caminho, ele ficará paralisado.
Se o agente possui um mapa, ele pode obter informações sobre os estados
em que pode entrar e quais ações ele pode perfazer. O agente considera então as
possíveis rotas a partir das cidades consideradas. Dessa forma, um agente que
possua uma série de opções imediatas de valor desconhecido pode decidir o que
fazer, avaliando primeiro as diferentes sequências de ações possíveis que irão
levar a estados de valor conhecido, tendo condições de escolher a melhor
sequência. O processo de procurar esta sequência é denominado de busca
(RUSSEL; NORVIG, 2004, p. 62).
Um algoritmo de busca recebe na sua entrada um problema e apresenta na
sua saída uma solução, descrita sob a forma de uma sequência de ações definidas.
A partir da obtenção da solução, as ações recomendadas por ela são colocadas
5
em execução. O algoritmo para a resolução de problemas simples pode ser então
descrito nos seguintes passos (RUSSELL; NORVIG, 2004, p. 63):
formulação do objetivo e do problema;
busca de uma sequência de ações que resolvem o problema;
execução das ações uma por uma.
Quando a sequência se completa, o agente formula outro objetivo e então
recomeça. É importante observar que na execução da sequência, ele não leva em
conta as percepções, baseia-se na suposição de que a solução que encontrou na
busca sempre irá funcionar.
Um problema pode ser definido de maneira formal em quatro componentes:
Um estado inicial: o estado no qual o agente começa. Por exemplo, se o
agente do exemplo da viagem estiver em Foz do Iguaçu, o estado inicial pode ser
descrito como Origem(Foz do Iguaçu).
Uma função sucessor: Dado um estado particular x, SUCESSOR(x) retorna
um conjunto de pares ordenados <ação,sucessor> em que cada ação é uma das
ações válidas no estado x, e cada sucessor pode ser alcançado partindo-se de x.
Como exemplo, no caso do estado inicial ser Origem(Foz do Iguaçu), a função
sucessor para o problema retornaria
{<Destino(Cascavel), Origem(Foz do Iguaçu)>,
<Destino(Pato Branco), Origem(Foz do Iguaçu)>}
O estado inicial e a função sucessor definem o espaço de estados do
problema, ou seja, o conjunto de todos os estados acessíveis, tendo como partida
o estado inicial. O espaço de estados representa um grafo no qual os nós são os
estados e os arcos entre os nós são as ações.
O teste de objetivo: determina se um estado é um estado objetivo.
O objetivo do exemplo é o estado final Origem(Curitiba). Em alguns casos, um
objetivo pode ser definido como uma propriedade abstrata e não por um estado ou
6
conjunto de estados específicos. Por exemplo, num jogo de xadrez, o objetivo é
alcançar o xeque-mate.
A função de custo: também chamada de função de custo de caminho, que
atribui um custo numérico a cada caminho. O agente irá escolher, portanto, uma
função de custo que irá significar a sua própria medida de desempenho. No caso
do agente do exemplo, a função de custo seria a distância em quilômetros
(Figura 1). Há então um custo de passo para ir de um estado a outro.
Definidos os quatro elementos da formulação do problema, uma solução
para um problema é um caminho que leva o agente desde o estado inicial até o
estado objetivo. Considerando a qualidade da solução, a qual é medida pela função
custo, uma solução ótima é aquela que apresenta o menor custo dentre todas as
soluções possíveis (RUSSELL; NORVIG, 2004, p. 64).
Exemplos de Problemas
Para efeito de estudo, os problemas podem ser classificados em:
Miniproblema: destina-se a ilustrar ou praticar métodos de resolução
de problemas, podendo ter descrições conscisas e exatas. Pode ser
utilizado por diversos métodos para comparação de desempenho.
Problemas do Mundo Real: são aqueles que não tendem a ter uma
descrição concisa e exata, abstraída de situações da realidade.
Em geral são problemas complexos, que podem ser divididos em
problemas simples que possuem um método de solução conhecida.
Esta estratégia é denominada de “dividir-para-conquistar”.
Miniproblemas
O primeiro miniproblema é o exemplo do robô aspirador, tratado no tópico
sobre agentes inteligentes.
7
Tabela 1: Formulação do miniproblema do robô aspirador
Formulação Descrição
Estados O agente se posiciona em uma de 9 posições
diferentes que podem conter sujeira ou não. A
quantidade de espaços possíveis (contando que todos
contenham sujeira) é de 9 x 2 estados mais 2 do
estado inicial resultando em 20 estados.
Estado inicial Robô na posição (2,2)
Função sucessor Gera os estados válidos resultantes da tentativa de
ação (Para-frente, Para-direita, Aspirar). Ver na Figura
3.
Teste de objetivo Verificar se todos os quadrados estão limpos
Custo de caminho Cada passo custa 1 unidade; o custo do caminho é o
número de passos.
Esse miniproblema tem as posições discretas, sujeira discreta, limpeza
confiável e não é desorganizado após o término da tarefa.
O puzzle (quebra-cabeças) de 8 peças consiste em um pequeno tabuleirode tamanho 3 x 3 casas, com peças numeradas de 1 a 8 e um espaço vazio para
permitir um deslocamento de uma peça. O objetivo do puzzle de 8 peças é atingir
um determinado estado.
O puzzle de 8 peças pertence à família de quebra-cabeças deslizantes,
utilizados com frequência em testes de algoritmos de IA. O quebra-cabeça de 8
peças possui 181440 estados acessíveis e pode ser resolvido com facilidade. O
puzzle de 15 peças (um tabuleiro 4x4) possui cerca de 1,3 trilhão de estados. Já o
puzzle de 24 peças (tabuleiro 5x5) possui aproximadamente 1025 estados, sendo
ainda bastante difícil de resolver de forma ótima com computadores e algoritmos
atuais (RUSSELL; NORVIG, 2004, p. 67).
8
Tabela 2: Formulação do miniproblema do puzzle de 8 peças
Formulação Descrição Exemplo
Estados Uma disposição específica das 8
peças sobre o tabuleiro 3x3.
Estado inicial Qualquer estado pode ser
definido como o estado inicial
(Ver Figura 4).
Função sucessor Gera os estados válidos para
execução das quatro ações
possíveis: Esquerda, Cima,
Baixo, Direita.
Teste de objetivo Verifica-se que o estado
alcançado é o mesmo que foi
definido como objetivo.
Custo de caminho Cada passo custa 1 unidade; o
custo do caminho é o número de
passos.
Descrevendo um problema do mundo real, o problema de roteirização ou
roteamento baseia-se em uma série de pontos ou nós e ligações entre estes nós.
Esta tarefa está presente em várias aplicações, tais como o roteamento de redes
de computadores, planejamento de manufatura, operações militares, sistemas de
planejamento de vôos e distribuição geográfica de produtos.
9
Figura 3: Expansão da árvore de estados do problema do robô aspirador
A formulação do roteamento pode ser aplicada posteriormente a qualquer
caso real que atenda a estes pressupostos. Por exemplo, no caso de descobrir qual
a melhor rota aérea entre duas cidades, os estados seriam as cidades pelas quais
os vôos passam; o estado inicial seria a cidade de origem; a função sucessor
retorna o próximo destino a partir de uma cidade sendo considerada; o teste de
objetivo é saber se já se encontra na cidade destino; o custo do caminho pode ser
o tempo de viagem, o valor monetário de cada trajeto entre cidades, dentre outros.
10
Figura 4: Expansão da árvore de estados do problema do puzzle de 8 peças
Tabela 4: Formulação do problema do roteamento
Problema de Roteamento
Formulação Descrição
Estados Representação de uma posição ou nó
Estado inicial Especificado de acordo com o problema
Função sucessor Os nós ou posições que estão adjacentes
Teste de objetivo Verificar se pela movimentação por meio dos nós,
chega-se ao nó destino
Custo de caminho Dado pelo somatório do custo de cada ligação entre os
pares de nós
O problema do caixeiro viajante é uma extensão do problema de roteirização,
em que todos os pontos de uma rede precisam ser visitados, em vez de apenas
alguns. Este problema demonstra a explosão combinatória que pode acontecer,
11
mesmo o problema tendo poucas instâncias para resolução.
A quantidade de possibilidades de rotas por todos os pontos é da ordem de (n-1)!
– fatorial de n-1. Para um conjunto de rotas com poucos pontos, o problema pode
ser resolvido pela “força bruta” (calculando todas as rotas). Mas o problema cresce
exponencialmente com a quantidade de pontos. Para o exemplo considerado do
mapa do Paraná, no qual temos 11 cidades, a quantidade de rotas possíveis
passando por todos os pontos é dada por aproximadamente 10! (fatorial de 10),
quase 3,62 milhões de rotas. A tabela abaixo demonstra a complexidade deste
problema, em que podemos identificar na segunda coluna o total de permutações
possíveis de pontos a serem visitados e o tempo de execução, considerando que
o cálculo de cada possibilidade leve 1 nanossegundo (1 bilionésimo de segundo).
Pode-se identificar o salto que representa de 20 para 25 pontos em termos de
alguns anos para milhões de anos de processamento!
Tabela 5: Demonstração da complexidade exponencial do problema do caixeiro viajante
Pontos ou
nós
(n-1)! Tempo
5 24 Insignificante
10 362880 Insignificante
15 87,17 bilhões 9 segundos
20 1,2.1017 3,9 anos
25 6,2.1023 19,6 milhões de anos
Outros problemas do mundo real podem ser enumerados, tais como o layout
de circuitos integrados e processadores de computador, a navegação de robôs,
sequência automática de montagem em fábricas robotizadas, projeto de proteínas
e a pesquisa na internet (RUSSELL; NORVIG, 2004, p. 70).
12
Para saber mais...
O Problema do Caixeiro Viajante (chamado
também de PCV) é um dos problemas mais difíceis de
resolução. Assista ao vídeo produzido pela Sociedade
Portuguesa de Matemática para entender um pouco
mais a respeito deste problema.
Disponível em:
<https://www.youtube.com/watch?v=_vKMyRj855A>.
TEMA 2: BUSCA DE SOLUÇÕES
Para a resolução dos problemas expostos no tópico anterior, é necessário
fazer uma busca no espaço de estados dos problemas. Nos problemas do robô
aspirador e do puzzle de 8 peças descritos, não foi acidental a representação em
forma de árvore nas figuras 3 e 4. Certas técnicas utilizam árvores de busca, que
são geradas a partir do estado inicial e pela função sucessor, configurando assim
o espaço de estados. Um nó de busca é a raiz da árvore, relativa ao estado inicial.
Para a resolução, acontece então a expansão do estado atual nos estados
possíveis a partir da função sucessor, que gera por sua vez um novo ramo ou
conjunto de estados (Figura 5). No exemplo do mapa geográfico do Paraná, se
estivermos no estado Origem(Campo Mourão), a expansão produziria um ramo
com os nós Destino(Maringá), Destino(Guarapuava) e Destino(Cascavel).
Assim, o propósito da busca é fazer esta expansão de forma contínua,
avaliando os nós gerados, escolhendo um especificamente e verificando se o nó é
um estado objetivo ou não. Nesse processo, a escolha de qual estado expandir é
determinada pela estratégia de busca (RUSSEL; NORVIG, 2004, p. 70).
13
Figura 5: Exemplo de expansão de uma árvore de busca para o problema da rota entre cidades
É importante notar a diferença entre espaço de estados e a árvore de busca.
Os estados se referem aos nós possíveis do problema, mas pode existir árvores de
busca com número infinito de nós.
Medidas de desempenho
Um algoritmo de resolução de problemas resulta uma solução ou uma falha.
As falhas podem acontecer devido ao algoritmo ficar paralisado em um loop infinito
e, assim, nunca retornar uma saída. A avaliação de desempenho
de um algoritmo pode ser feita a partir de quatro aspectos (RUSSELL; NORVIG,
2004, p.73):
Completeza: o algoritmo de busca oferece a garantia de encontrar uma
solução quanto ela existir?
Otimização: A estratégia encontra a solução ótima?
Complexidade de tempo: Quanto tempo é dispendido para encontrar uma
solução?
14
Complexidade de espaço: Quanto de memória é necessária para a execução
da busca?
TEMA 3: ESTRATÉGIAS DE BUSCA
As estratégias de busca dividem-se em duas classes: estratégias sem
informação ou estratégias cegas e estratégias com informação ou busca heurística.
As estretégias se diferenciam conforme a ordem de expansão dos nós da árvore
de busca. As estratégias sem informação dividem-se em:
Busca em extensão ou amplitude;
Busca de custo uniforme;
Busca em profundidade;
Busca em profundidade limitada;
Busca de aprofundamento iterativo; Busca bidirecional;
Busca em Extensão ou Amplitude.
A busca em extensão ou amplitude é uma estratégia simples na qual o nó
raiz é expandido inicialmente, depois os sucessores do nó raiz, depois os
sucessores dos sucessores do nó raiz e assim por diante (RUSSEL; NORVIG,
2004, p. 74).
A busca em extensão é completa: se o nó objetivo estiver em uma
profundidade finita d, a busca em extensão encontrará após a expansão de todos
os nós mais rasos, considerando que o fator de ramificação b seja finito. O nó
objetivo mais raso não significa que seja o nó ótimo. A busca em extensão será
ótima se o custo do caminho for uma função não decrescente da profundidade do
nó, como por exemplo, se o custo for o mesmo para todas as ações.
Se a árvore gera b nós no primeiro nível, o segundo nível subsequente gera
também b nós, totalizando b2 nós na árvore; no terceiro nível totalizará b3 nós e
assim sucessivamente. Se a solução estiver no nível d, o algoritmo se expandiria
até o nível d+1, gerando então (bd+1-b) nós. A soma total dos nós
será, então:
15
N = 1 + b + b2 + b3 + b4 + ... + bd + (bd+1-b) = O(bd+1)
Utilizamos a notação O, à direita da equação, para indicar a complexidade
do algoritmo de busca em extensão, onde indicamos o expoente mais significativo.
Com um fator da ramificação b elevada ao expoente d, a complexidade se
caracteriza como exponencial. Para poucos nós, o problema da busca em extensão
é fácil de resolver. Mas se adicionarmos mais nós, a complexidade de tempo e
memória aumenta significativamente.
Tabela 6: Análise da complexidade de tempo e espaço da busca em extensão ou amplitude
Profundidade
(d)
Quantidade
de nós
Tempo Memória
2 1101 0,11 segundos 1 megabyte
4 111.101 11 segundos 106 megabytes
6 ~107 18,5 segundos 10 gigabytes
8 ~109 30,9 horas 1 terabyte
10 ~1011 128,6 dias 101 terabytes
12 ~1013 35,2 anos 10 petabytes
14 ~1015 3523 anos 1 exabyte
20 ~1021 3,5 bilhões de anos 1 yottabyte
A tabela 6 mostra a análise da complexidade de tempo e memória,
considerando um fator de ramificação de 10 nós para vários valores de
profundidade d. Para o cálculo do tempo é considerado que 10000 nós podem ser
gerados por segundo, e para o cálculo de memória cada nó exigindo 1000 bytes de
armazenamento.
Ao lidar com um problema de profundidade 12, ainda levariam 35 anos para
que a busca em extensão possa encontrar a solução. De forma geral, os problemas
16
de busca com complexidade exponencial não podem ser resolvidos por métodos
sem informação, para qualquer instância, a não ser os problemas com instâncias
menores.
Busca de Custo Uniforme
A busca de custo uniforme difere da busca em extensão por considerar a
expansão do nó com o custo mais baixo. Este tipo de busca não se importa com o
número de passos em um caminho, mas apenas com o custo total. Pode-se garantir
a completeza desde que o custo em cada passo seja maior ou igual a um valor
constante positivo pequeno denominado aqui de ε. Esta condição garante o caráter
ótimo, significando que o custo é crescente à medida que se percorre o caminho.
Se denominarmos C* o custo da solução ótima, a complexidade do pior caso do
algoritmo será de O(b┌C*/ ε ┐). Quando todos os custos de passos forem iguais, o
algoritmo volta à complexidade O(bd+1).
Busca em Profundidade
A estratégia de busca em profundidade expande sempre o nó mais profundo
na borda atual da árvore de busca. Na Figura 8 podemos ver como este algoritmo
se desenvolve. A busca vai prosseguindo até o nível mais profundo da árvore, onde
não existem mais nós sucessores. Após visitar os nós mais profundos, a busca
retorna ao nível mais raso, que ainda possui nós não explorados (RUSSEL;
NORVIG, 2004, p. 76).
Uma das vantagens da busca em profundidade é que ela possui requisitos
de memória pequenos em relação às outras estratégias. Só é necessário
armazenar um único caminho do nó raiz até o nó sendo visitado. À medida que os
nós e seus descendentes são explorados, eles podem ser removidos da memória.
A desvantagem da estratégia de busca em profundidade é que ela pode
descer um caminho muito longo (ou ainda infinito), podendo ficar paralisada,
quando o nó objetivo poderia estar bem próximo do nó raiz da árvore de busca.
Busca em Profundidade Limitada
A abordagem da busca em profundidade limitada permite que atenuemos o
problema das árvores muito grandes ou ilimitadas, delimitando a profundidade a
17
um valor máximo . Ou seja, os nós na profundidade são tratados como se não
tivessem nós sucessores. Ele permite resolver o problema dos percursos infinitos,
mas pode trazer um fator de incompleteza, ou seja, se < d, então o objetivo mais
raso estaria além do limite imposto. A complexidade de tempo desta estratégia seria
de O(b).
Quando se tem algum conhecimento sobre o problema, pode-se impor um
limite à estratégia de busca em profundidade. Citando um exemplo, o mapa
geográfico do Paraná, apresentado na Figura 2, tem 11 cidades. Então poderíamos
definir a profundidade 11 para a busca em profundidade de um percurso específico.
Entretanto, se analisarmos melhor o mapa, podemos ver que uma cidade qualquer
pode ser alcançada em 5 passos, podendo-se definir então o limite para o problema
com =5. Mas na maior parte dos problemas não possuímos conhecimento da
profundidade das soluções antes de resolvermos.
Busca de aprofundamento iterativo em profundidade
Esta estratégia é uma variação da busca em profundidade, que procura
aumentar gradualmente o limite de profundidade a partir do nó raiz, depois 1, depois
2, e assim sucessivamente, até que encontre um objetivo. Isso deverá ocorrer
quando o limite da profundidade alcançar d, a profundidade do nó objetivo mais
raso. A estratégia de aprofundamento iterativo combina os benefícios da busca em
profundidade e da busca em extensão. Os requisitos de memória também são
modestos, exigindo O(bd). Assim como na busca em extensão ou amplitude, o
algoritmo é completo quando o fator de ramificação for finito, e ótimo quando o
custo do caminho é uma função não decrescente em relação à profundidade do nó
(RUSSELL; NORVIG, 2004, p. 79). A complexidade de tempo da busca em
aprofundamento iterativo é melhor que a da busca em extensão.
De forma geral, a busca por aprofundamento iterativo em profundidade é o
método de busca sem informação preferido quando há um espaço de busca muito
grande e a profundidade da solução dentro da árvore não é conhecida
(RUSSEL; NORVIG, 2004, p. 80).
18
Busca bidirecional
A noção na estratégia de busca bidirecional é a execução de duas buscas
que acontecem simultaneamente, uma de forma direta, partindo do estado inicial
como temos visto até agora, e outra que parte do objetivo, acontecendo a parada
quando as buscas se encontram em um estado intermediário. A motivação principal
é que uma busca que tenha uma expansão bd/2 + bd/2 é bem menor do que bd.
Por exemplo, se o fator de ramificação b = 10 e a profundidade d = 6, numa busca
em extensão padrão, teríamos um total de N = 11.111.101 nós (mais de 11 milhões
de nós), enquanto que na busca bidirecional (considerando agora a profundidade
d = 3, duas vezes) teríamos N = 22.202 nós. A complexidade de tempo da busca
bidirecional é também igual a O(bd/2).
A tabela 7 resume a comparação entre as estratégias de busca de acordo
com os quatro critérios de avaliação (completeza, otimização, complexidade de
tempo e de espaço).
Tabela 7: Tabela comparativa entre as estratégias de busca sem informação.
O cabeçalho da coluna tem a sigla com as primeiras letras do tipo debusca (b é o
fator de ramificação, d é a profundidade, m a profundidade máxima da árvore de
busca e é o limite de profundidade. As anotações que estão em sobrescrito: a
completa se b é finito; b completa se o custo do passo é >= ε, com ε positivo; c
ótima se os custos dos passos são todos idênticos; d se ambos os sentidos utilizam
a busca em extensão).
Critério BE BCU BP BPL BAIP BB
Completa? Sima Sima,b Não Não Sima Sima,d
Tempo O(bd+1) O(b┌C*/ ε┐) O(bm) O(b) O(bd) O(bd/2)
Espaço O(bd+1) O(b┌C*/ ε┐) O(bm) O(b) O(bd) O(bd/2)
Ótima? Simc Sim Não Não Simc Simc,d
Fonte: adaptado de Russell e Norvig (2004, p. 81).
19
Buscas com Informação
As estratégias de busca sem informação tendem a ser ineficientes na maioria
dos casos. Estratégias de busca que utilizam algum conhecimento específico do
sistema pode ser uma melhor opção mais eficiente. As estratégias neste caso
apresentam uma abordagem denominada de busca pela melhor escolha. Esta
busca considera um algoritmo que é uma especialização do algoritmo geral da
busca em árvore, em que um nó é selecionado para
expansão com base em uma função de avaliação f(n). Na verdade, não há de fato
uma melhor escolha, mas a escolha que parece ser a melhor, conforme a função
de avaliação.
Há uma outra família de algoritmos com funções de avaliação diferentes, na
qual um componente fundamental desta avaliação é uma função heurística h(n).
Por meio das funções heurísticas podemos aplicar o conhecimento relativo ao
problema no algoritmo de busca. Por exemplo, podemos fazer com que a função
heurística seja representada pela distância que o nó expandido está do objetivo.
Existem dois tipos de busca com informação: a busca gulosa e o algoritmo A*
(chamado de “A-estrela”).
A busca gulosa é uma estratégia que tenta expandir o nó mais próximo à
meta, na suposição de que levará provavelmente a uma solução de forma rápida,
avaliando apenas a função heurística: f(n) = h(n). No caso do mapa rodoviário do
Paraná apresentado anteriormente, podemos utilizar a heurística da distância em
linha reta. Apesar de não ser a distância pela estrada em quilômetros, o uso da
distância em linha reta pode ser uma heurística útil para resolver o problema.
Entretanto, isso não garante que se encontre a melhor solução quando aplicando
para todos os casos.
A busca A* é a estratégia mais conhecida de busca pela melhor escolha. A
avaliação da busca combina o custo para alcançar cada nó, dado por g(n), e o custo
para ir do nó em questão até o objetivo h(n) na forma:
f(n) = g(n) + h(n)
20
Assim, f(n) representa o custo estimado da solução de custo mais baixo
passando pelo nó n.
Tabela 8: Tabela comparativa entre as estratégias de busca gulosa e A*. O
cabeçalho da coluna tem a sigla com as primeiras letras do tipo de busca (b é o
fator de ramificação, m a profundidade máxima da árvore de busca. As anotações
que estão em sobrescrito: a pode ficar presa em loops; b desde que não exista uma
quantidade infinita de nós.
Critério Busca Gulosa A*
Completa? Nãoa Simb
Tempo O(bm) O(bm) no pior caso
O(log h*(n)) se o espaço de busca
é uma árvore com um objetivo
apenas
Espaço O(bm) O(bm), expande todos os nós
Ótima? Não Sim
Fonte: adaptado de Russell e Norvig (2004, p. 97-101).
TEMA 4: FUNÇÕES HEURÍSTICAS
A definição de uma função heurística h(n) irá depender da natureza do
problema de busca. Vimos que uma boa função heurística requer uma heurística
admissível, cujo comportamento nunca superestime o custo para se alcançar o
objetivo (RUSSELL; NORVIG, 2004, p. 97). Assim, a modelagem de uma
função heurística requer uma dose de bom senso no estudo das características do
problema.
21
A função h(n) do problema do mapa rodoviário é utilizada em grande parte
dos problemas que possuem características geográficas ou espaciais, ligada ao
conceito de distância euclidiana. A distância euclidiana é calculada a partir das
coordenadas cartesianas dos pontos relacionados aos nós do problema.
Considerando a definição de uma função heurística para o problema do
puzzle de 8 peças, podemos ver pela Figura 6, a seguir, que, a partir de um estado
qualquer, as peças devem ser movimentadas para se alcançar o objetivo. Podemos
então listar mais duas funções possíveis:
Número de peças fora de posição: Na figura 6, todas as peças no estado (a)
estão fora de posição, ou seja, a função heurística assume o valor h(n) = 8.
Distância de Manhattan: calcular a distância em quadras de cada peça até a
sua posição no objetivo. Na figura 13, as peças estão fora da sua posição conforme
o seguinte: h(n) = 3+2+2+2+2+2+2+1 = 16 (a peça “1” precisa de 3 movimentos até
o objetivo, a peça “2” precisa de 2 movimentos até o objetivo, e assim
sucessivamente).
Figura 6: Estados referentes ao problema do puzzle de 8 peças: (a) um estado qualquer; (b) objetivo
Russell e Norvig (2004, p. 106) compararam o custo da busca do algoritmo
A* com as duas funções heurísticas anteriores com a busca por aprofundamento
iterativo (BAI), gerando 1.200 problemas. Com a profundidade da árvore d = 12, a
BAI obteve um custo de 3,644 milhões de movimentos, enquanto que a busca A*
obteve o custo médio de 227 para a heurística das peças fora de posição, e o custo
médio de 73 para a função heurística utilizando a distância Manhattan.
22
SÍNTESE
Neste capítulo foram estudados os agentes de resolução de problemas, que
precisam tomar decisões sobre os próximos passos a serem dados na sequência
de ações. Ao se fazer a formulação do objetivo, o próximo passo é a formulação do
problema. Geralmente o processo de encontrar uma solução significa perfazer uma
busca no espaço de soluções possíveis. Um problema pode ser definido a partir do
seu estado inicial, de uma função sucessor, o teste de alcance do objetivo e a
função custo de caminho. Uma solução leva o agente do estado inicial até o
objetivo. Uma solução ótima apresenta o menor custo de caminho dentre todas as
soluções possíveis. Foram estudados diversos miniproblemas, tais como o do robô
aspirador, o quebra-cabeça de 8 peças e o problema de roteamento. Para se fazer
a busca, certas técnicas usam as árvores de busca. É necessário adotar estratégias
de busca que possam ser sem informação e com informação.
REFERÊNCIAS
RUSSEL, S.; NORVIG, P. Inteligência Artificial. Tradução da 2. ed. Rio de
Janeiro: Campus, 2004.
BITTENCOURT, G. Inteligência Artificial – Ferramentas e Teorias. Florianópolis:
Ed. da UFSC, 1998.
1
INTELIGÊNCIA ARTIFICIAL
APLICADA
AULA 4
Prof. Luciano Frontino de Medeiros
2
CONVERSA INICIAL
Nesta aula você estudará duas técnicas que fazem parte da linha de
pesquisa simbólica, os Sistemas Especialistas e a Programação em Lógica.
São abordados elementos comuns às duas técnicas, o uso de fatos e regras
para representar o conhecimento, bem como exemplos práticos que auxiliarão
na compreensão dos aspectos dinâmicos de cada técnica.
CONTEXTUALIZANDO
A linha de pesquisa simbólica da IA é uma das mais tradicionais,
presentes desde as primeiras pesquisas, envolvendo a manipulação de
símbolos para alcançar objetivos ao resolver algum problema específico. Dois
dos representantes mais significativos desta linha são os sistemas especialistas
e a programação em lógica. Os sistemas especialistas já eram pesquisados
mesmo antes de haver computadores pessoais, evidenciando a possibilidade
do conhecimento de profissionais especialistas ser representadoem um
sistema de computador de maneira a proporcionar informações, como se o
sistema estivesse aconselhando a melhor alternativa para uma tomada de
decisão, ou a descrição de um quadro sintomático. A programação em lógica
permite a um agente raciocinar de acordo com a lógica de primeira ordem,
permitindo a resolução de uma série de problemas da IA. Vamos agora ao
estudo destas duas técnicas, representantes-chave da linha de
pesquisa simbólica.
TEMA 1: SISTEMAS ESPECIALISTAS
Dentro da linha de pesquisa simbólica da IA, os Sistemas Especialistas
(SE) são programas de computador que imitam o comportamento de
especialistas humanos dentro de um domínio específico de conhecimento. Os
sistemas especialistas podem ser classificados quanto às definições da IA no
quadrante “agir como humanos”. Consiste assim numa ferramenta que possui
3
a capacidade de entender o conhecimento sobre um problema específico e
usar esse conhecimento de maneira inteligente para sugerir alternativas
de ação.
Podemos afirmar que SE é uma técnica da IA desenvolvida para
resolver problemas em um determinado domínio, cujo conhecimento utilizado
é obtido de pessoas que são especialistas naquele domínio.
No início, a ideia central dos sistemas especialistas foi originada do
sistema DENDRAL, em 1965, desenvolvido a partir de uma grande soma de
conhecimento heurístico manipulado por regras, procurando resolver o
problema de se inferir estruturas moleculares a partir da informação
espectrográfica de massa. A partir de 1968 até o presente, o DENDRAL foi
utilizado em diversas pesquisas relacionadas à química orgânica, sendo alguns
resultados derivados considerados melhores do que obtidos por especialistas
humanos (BITTENCOURT, 1998, p. 276).
Desenvolvido por Edward Shortlife, da Universidade de Stanford, na
década de 1970, o MYCIN é um sistema especialista para a área médica, o
qual teve um papel fundamental no desenvolvimento dos futuros sistemas
especialistas. O MYCIN foi desenvolvido para resolver o problema do
diagnóstico e tratamento de doenças infecciosas do sangue por meio de um
conjunto de 450 regras que permitiam o diagnóstico e a prescrição de
tratamentos. A utilidade deste tipo de sistema é que nem sempre um médico é
também especialista na área de infecções, ainda mais considerando um
ambiente hospitalar (BITTENCOURT, 1998, p. 274).
As regras do MYCIN eram codificadas na linguagem LISP. As regras
eram formadas por premissas com combinações booleanas denominadas de
cláusulas, Cada cláusula era composta de um predicado e uma tripla de
parâmetros objeto-atributo-valor. Um exemplo de clausula do MYCIN pode ser
entendido da seguinte forma:
4
SE
1) A infecção é do tipo bacteremia primária E
2) O local da cultura é um dos locais estéreis E
3) A entrada para o organismo foi pelo trato gastrointestinal
ENTÃO
Existe evidência sugestiva (0.7) que a identidade do organismo seja um
bacteroide.
As regras no MYCIN eram associadas a um coeficiente de certeza,
variando na faixa de valores entre -1 e 1. Os coeficientes eram utilizados para
propagar a incerteza inicial por meio do raciocínio do programa em uma cadeia
de inferências.
TEMA 2: COMPONENTES DE UM SISTEMA ESPECIALISTA
De forma geral, um sistema especialista pode ser dividido em três
módulos: uma base de conhecimento, um quadro negro e um mecanismo de
inferência (também chamado de motor de inferência). A base de
conhecimento é onde fica armazenado o conhecimento obtido do domínio no
qual atua o SE, traduzido na forma de regras, e também uma memória de
trabalho. No quadro negro, as informações são alimentadas ao sistema com
relação às variáveis que são lidas do ambiente. O mecanismo de inferência é
o responsável pelo encadeamento e teste das regras, fornecendo um resultado
em função dos fatos alimentados ao sistema especialista.
5
Figura 1: Esquema básico de um sistema especialista
A base de conhecimento contém as condições expressas nas regras que
se referem às perguntas. Estas perguntas envolvem variáveis que precisam ser
instanciadas (receber valores) e passar logo após por um processo de
inferência. O motor de inferência controla, portanto, a atividade do sistema
especialista, ocorrendo em ciclos que se constituem de três fases:
1) A seleção das regras a partir dos dados correspondentes de
entrada;
2) A resolução de conflitos indicando quais regras serão efetivamente
executadas, a partir de priorização e ordenação;
3) A ação propriamente dita.
6
TEMA 3: ETAPAS PARA CONSTRUÇÃO DE UM SISTEMA
ESPECIALISTA
O processo de construção de um sistema especialista costuma seguir os
passos descritos abaixo:
1) Identificação e definição do domínio do problema;
2) Aquisição do Conhecimento;
3) Organização e Representação do Conhecimento;
4) Implementação do SE;
5) Testes e Validação.
Com relação à identificação e definição do domínio do problema, o
desenvolvimento de um SE se inicia com a especificação do domínio do
problema, que geralmente ocorre a partir da consulta a algumas fontes de
conhecimento, tais como: livros, manuais, relatórios técnicos e principalmente
da experiência e conhecimento dos especialistas. Dessa forma, são
identificadas possíveis variáveis e possibilidade de divisão do problema a ser
abordado em subproblemas.
Na aquisição de conhecimento é considerada a parte mais sensível no
desenvolvimento de um SE, muitas vezes o gargalo do processo. Essa
dificuldade está relacionada muitas vezes com a dificuldade de transmissão do
conhecimento por parte do especialista; ou porque o conhecimento não é bem
definido, ou porque é difícil expressar este conhecimento em palavras.
A aquisição de conhecimento é realizada geralmente por meio de entrevistas e
interações com especialistas do domínio. A aquisição de conhecimento
consiste, assim, na coleta e análise de informações de um ou mais
especialistas e qualquer outra fonte, possibilitando a produção de documentos.
7
Esses documentos formam a base de funcionamento da base de conhecimento
do SE.
A organização do conhecimento de um SE é feita de fatos e regras. Um
fato é uma forma de conhecimento declarativo. Fatos são usados para
descrever relacionamentos entre estruturas de conhecimento mais complexas
e controlar o uso destas estruturas durante a resolução de problemas. Em IA e
SE, um fato é às vezes referenciado como uma proposição.
Uma proposição é uma declaração que pode ser verdadeira ou falsa.
Por exemplo:
“Está chovendo”
A frase é uma declaração de algo que acontece no mundo. Dependendo
do que acontece no mundo, se está chovendo na realidade, a proposição acima
recebe o valor “verdadeiro”. Caso esteja fazendo sol, então recebe o valor
“falso”. Outro exemplo:
“A cor da bola é vermelha”
Neste caso, a proposição está organizada na forma objeto-atributo-
valor (OAV). O objeto é “bola”, “cor” é o atributo e “vermelha” é o valor. Se
olhamos uma bola azul e emitimos esta afirmação, o valor dela é “falso”. No
caso de a cor ser vermelha, o valor da proposição será “verdadeiro”.
A representação do conhecimento em um SE utiliza, como visto
anteriormente, regras. Regras são sequências lógicas compostas por
premissas (antecedentes) e conclusões (consequentes). É comum o uso da
expressão condicional SE-ENTÃO para representar regras dentro de um
sistema especialista. Por exemplo
SE (distância à frente < 10 cm) ENTÃO (vire 180 graus)
SE (temperatura > 50 graus) ENTÃO (desligue aquecedor)
Estes exemplos deregras são ditas determinísticas, pois quando a
premissa for verdadeira, sempre acontecerá a ação da conclusão da regra.
8
Regras podem ainda ter um coeficiente de confiança ou de probabilidade.
Dessa forma, as regras se tornam probabilísticas, e a ação está condicionada
a um fator que indica a probabilidade ou confiança de que a ação irá acontecer.
Regras probabilísticas são importantes para SEs que trabalham com
informações incertas, que farão inferências sobre diagnósticos para indicar
ações com mais “força’ que outras.
Para a fase de implementação, é realizada aqui a escolha de uma
linguagem de programação ou pacote (muitas vezes chamado de shell) pelo
analista, na implementação do sistema. As linguagens utilizadas para codificar
sistemas especialistas geralmente diferem das linguagens convencionais, tais
como C ou Java, e tal escolha pode implicar no desenvolvimento do próprio
mecanismo de inferência do SE. As shells apresentam vários benefícios no
desenvolvimento de um SE, pois já implementam o motor de inferência. Um
exemplo de shell é o Expert SINTA.
A última etapa na elaboração do SE são os testes e validação do
sistema por meio de análise de casos conhecidos. Estes testes, geralmente
também são realizados para a validação das regras na base de conhecimento.
TEMA 4: EXEMPLO DE SISTEMA ESPECIALISTA
Para ilustrar a operação de um sistema especialista, o exemplo a seguir
refere-se a uma análise de perfil financeiro para concessão de crédito. Esse
tipo de sistema pode ser entendido como uma regra de negócio de uma
empresa financeira, podendo ser estendido para outros domínios, tais como
companhias de seguro e planos de saúde.
O sistema especialista tem como objetivo a concessão de crédito que irá
depender de uma série de variáveis que precisam ser informadas ao sistema.
A modelagem do SE pode ser vista na Figura 2. A primeira regra se refere à
comparação da variável renda. Caso seja maior que 5000, então o próximo
passo é perguntar sobre o percentual da prestação do carro; caso seja menor
9
do que 10% da renda, então segue para a próxima regra, que é a comparação
da prestação da casa; caso seja menor do que 20% da renda, então o crédito
será concedido.
A partir daí o interesse agora é o de verificar qual o valor do crédito que
será concedido. Para isso, uma regra compara o tempo de trabalho; caso seja
maior ou igual a 4 anos, então o limite a ser concedido é de 10000. Se for menor
ou igual a 4 anos, então é necessário comparar a variável outras dívidas; caso
seja menor do que 5% da renda, então o limite concedido será um pouco
menor, de 3000.
Figura 2: Diagrama de fluxo das regras do sistema especialista para análise de perfil de
cliente visando a concessão de crédito
10
Figura 3: Tela demonstrando a implementação do sistema especialista de concessão de
crédito no Expert SINTA
Para saber mais...
O expert SINTA foi desenvolvido
pelo Laboratório de Informática Aplicada
da UFC – Universidade Federal do Ceará.
Para o download do arquivo instalador do
Expert SINTA, acesse o link
<ftp://ftp.lia.ufc.br/sinta/sinta.zip>, ou por
meio do QR Code ao lado.
Para implementar esse exemplo no Shell Expert SINTA, primeiro
deve-se identificar quais as variáveis a serem testadas durante a execução do
SE. Dessa forma, e analisando o diagrama do fluxo das regras, verificamos que
é necessário trabalhar com as seguintes variáveis:
11
conceder linha;
limite de crédito (objetivo);
outras dívidas;
prestação de imóvel;
prestação do carro;
renda;
tempo no emprego.
No Expert SINTA, após criar uma nova base, as variáveis devem ser
digitadas, devendo ser definida também a faixa de valores possíveis que a
variável deverá receber. Veja a tela de variáveis na Figura 4.
No Expert SINTA, as variáveis podem ser de três tipos: numérica,
univalorada e multivalorada. A faixa da variável numérica deve ficar na
forma min;max (o valor mínimo, depois ponto e vírgula, e depois o valor
máximo). A variável univalorada irá tratar valores “sim” ou “não”. No caso
de a variável assumir uma série de valores discretos (uma lista de opções),
então será multivalorada. Neste caso, as opções deverão ficar separadas
por ponto e vírgula. Exemplo: para uma variável que assume valores
relativos a cores primárias, a faixa deveria ser especificada como:
vermelha;azul;amarela.
Após a digitação das variáveis, deve ser acessada a tela para a definição
de objetivos. Na Figura 5 temos ilustrado o procedimento, de maneira que a
variável objetivo (no caso, “limite de crédito”) deve ser colocada no box à direita
da lista de variáveis.
12
Figura 4: Tela de entrada de variáveis e faixas de valores do Expert SINTA
Figura 5: Definição da variável objetivo “limite de crédito”, no Expert SINTA
Após a definição do objetivo, as regras do SE já podem ser criadas. Ao
clicar em Nova Regra, devemos adicionar a regra digitando primeiro a premissa
da regra e depois a conclusão da regra. Como as variáveis já foram digitadas
previamente, elas aparecem numa lista, facilitando a digitação. Veja na Figura
6 uma regra criada no Expert SINTA.
13
Figura 6: A regra com o teste das três variáveis renda, prestação do carro e prestação da
casa (conforme o diagrama de fluxo na figura 2). Ao invés de digitar uma regra para cada
teste, coloca-se todas numa regra apenas, adicionado a operação lógica “E” (ou seja, o teste
de cada variável precisa ser verdadeiro simultaneamente para as três variáveis).
Após a digitação de todas as regras, a tela principal do Expert SINTA
ficará como mostrado na Figura 7. Constatamos então que foram criadas 5
regras para a execução deste SE. Na Figura 8 temos o detalhamento de todas
as regras (quando clicamos em “Visualizar”). A primeira regra se refere ao teste
das variáveis renda, prestação do carro e prestação da casa, habilitando a
variável conceder linha.
Figura 7: Tela principal com as regras digitadas
14
Figura 8: Listagem das regras digitadas no Expert SINTA.
A segunda, terceira e quarta regras se referem à definição do limite de
crédito que será concedido. Conforme o diagrama do fluxo das regras, a regra
2 testa para o caso positivo para o tempo de trabalho maior ou igual a 4 anos.
No caso dessa regra falhar, a regra 3 e 4 comparam também a variável outras
dívidas. Existe ainda a regra 5 para o caso de a variável conceder linha receba
o valor “Não” na falha da regra 1.
Para executar o SE, ao clicar em Iniciar consulta, as telas com as
perguntas para a entrada dos valores das variáveis são apresentadas
sucessivamente. Ao final, o Expert SINTA apresenta a variável objetivo e o
valor que foi obtido em função de uma execução específica.
15
Figura 9: Parte da execução do SE, com a tela de entrada da variável renda
Figura 10: Uma execução específica do SE implementado, mostrando a concessão do valor
de 10000 para a variável limite de crédito
Implementação em Linguagem Java
A implementação de sistemas especialistas pode ser feita também em
uma linguagem de programação procedural, tal como o C++ ou Java. Dessa
forma, uma regra de negócio que implementa o conhecimento de um
especialista pode ser colocada em um sistema de informação para auxiliar o
trabalho. O exemplo do SE para análise de crédito pode ser implementado
utilizando classes ou de maneira mais simples utilizando chamadas de função.
Na figura 11 temos o código emJava do programa na forma de uma função
16
com as variáveis de entrada como parâmetros da função e uma variável para o
valor do limite de crédito como retorno. As regras podem ser implementadas na
forma de condicionais com o teste das variáveis. No caso de regras que tenham
grau de confiança, o código precisa ser alterado para contemplar o
processamento dos graus de confiança para cada regra que é analisada.
TEMA 5: PROGRAMAÇÃO LÓGICA COM PROLOG
Dentro da linha simbólica, os estudos da lógica e da sua aplicação
prática revestiram-se de fundamental importância para o aparecimento de
sistemas inteligentes. Ainda que a lógica seja uma área de conhecimento com
raízes na Filosofia, a partir do século XIX, os estudos de Boole (1815-1864)
deram origem ao que se denomina atualmente de “álgebra booleana”. O
matemático alemão Gottlob Frege (1848-1925) lançou a primeira versão de um
cálculo de predicados da lógica, auxiliando a formalização exata do raciocínio
dedutivo sobre conceitos matemáticos (PALAZZO, 1997, p.1).
17
Figura 11: Implementação em Java utilizando chamada de função para o exemplo de
concessão de crédito. Abaixo, diferentes chamadas da main produzindo os valores de limites
respectivos.
18
No início da Segunda Guerra Mundial, praticamente a fundamentação
teórica da lógica computacional estava pronta. Entretanto, não havia um meio
prático para implementar a lógica e toda a sua necessidade de computações
para a realização dos procedimentos de prova, ficando restrito a exemplos bem
simplificados. Com a evolução dos computadores nos anos 1950, o potencial
para implementação de programas para o raciocínio lógico começa a se tornar
realidade (PALAZZO, 1997, p.1).
Na década de 1960, com a prova automática de teoremas, um
procedimento que permitiu a interpretação procedimental da lógica, possibilitou
que fossem estabelecidas as condições para compreendê-la como uma
linguagem de programação de amplo uso. Mas o primeiro interpretador aparece
somente em 1972, desenvolvido pela equipe do pesquisador Alain Colmerauer
na Universidade de Aix-Marseille, com o nome de Prolog (acrônimo em francês
para “Programmation em Logique”). Pesquisadores da Universidade de
Edimburgo formalizaram a linguagem que se tornou referência para as
implementações atuais e ficou conhecida como o “Prolog de Edimburgo”
(PALAZZO, 1997, p. 2).
Uma das principais ideias subjacentes da programação em lógica é de
que um algoritmo é constituído por dois elementos disjuntos: a lógica e o
controle. O componente lógico corresponde à definição do que deve ser
solucionado. O componente de controle estabelece como a solução pode ser
obtida.
Quando programando em PROLOG, o programador precisa somente
descrever o componente lógico de um algoritmo, deixando o controle da
execução para ser exercido pelo sistema de programação em lógica utilizado.
A atividade do programador passa a ser simplesmente a especificação do
problema que deve ser solucionado.
Assim, um programa em lógica é a representação de um problema
expresso por meio de um conjunto finito de um tipo especial de sentenças
lógicas denominadas de cláusulas. O programador simplesmente especifica o
19
problema que deve ser solucionado. O controle fica a cargo do sistema de
programação em lógica utilizado (PALAZZO, 1997, p. 3).
Ao contrário de um programa em linguagens como C ou Java, um
programa em lógica não é a descrição de um procedimento para se obter a
solução de um problema; o sistema é inteiramente responsável pelo
procedimento a ser adotado na execução. Por isso, é dito que o paradigma
fundamental da programação em lógica é o da programação declarativa, em
oposição à programação procedural, típica das linguagens convencionais
como C ou Java. O ponto focal da programação em lógica consiste em
identificar a noção de computação com a noção de dedução.
Ao longo dos anos, a programação em PROLOG tem sido aplicada a
diversas áreas, tais como:
Sistemas de apoio à decisão;
Simulações educacionais;
Tutoriais inteligentes;
Problemas matemáticos;
Planejamento e roteirização;
Resolução de problemas;
Uso em regras de negócio;
Processamento de linguagem natural.
Cláusulas em PROLOG
Um programa em lógica pode ser visto alternativamente como uma base
de dados. Bases de dados convencionais descrevem apenas fatos (por
exemplo, “Totó é um cão”). Além disso, sentenças em um programa em lógica
20
possuem, porém, um alcance maior, permitindo a representação de regras (por
exemplo, “Todo cão é mamífero”).
Uma cláusula em PROLOG pode ser de três tipos:
Fatos: Denotam uma verdade incondicional;
Regras: Definem as condições que devem ser satisfeitas para
que uma declaração seja considerada verdadeira;
Consulta: Interrogação ao programa para verificar a verdade do
conhecimento nele contido.
Na Tabela 1 temos um exemplo de cada cláusula, mostrando também
um pouco da sintaxe de PROLOG. Num primeiro momento, os fatos e as regras
precisam ser alimentados ao sistema PROLOG. Logo após, são
feitas as consultas como se fossem perguntas relativas à dedução de
novos conhecimentos, a partir dos conhecimentos que existem na
base de conhecimento.
Tabela 1: Tipos de cláusulas em PROLOG
Cláusula Exemplo Descrição
Fato pai(joão, luiz). Este fato é traduzido como
“João é o pai de Luiz”.
Regra filho(X,Y) :- pai(Y,X).
Se X é filho de Y, então Y é pai
de X. O sinal “:-“ funciona
como uma “seta à esquerda”,
donde a conclusão à direita é
obtida a partir das premissas
que estão na direita.
Consulta ?- filho(luiz, joão).
True
A consulta tenta obter se, a
partir dos fatos e das regras
existentes na base de
conhecimento, Luiz é filho de
João. A regra acima deduz um
21
novo fato, a partir do fato e da
regra anterior.
Uma cláusula é dividida nos seguintes componentes:
Corpo: lista de objetivos separados por vírgulas, que devem ser
interpretadas por conjunções;
Cabeça: contém o resultado do corpo, inferido a partir dos
objetivos.
Um fato contém apenas “cabeça”. A consulta só possui o “corpo”. Uma
regra contém tanto cabeça quanto corpo.
Vimos pelo exemplo da regra na Tabela 1 que PROLOG trabalha com
variáveis. Uma variável é composta de uma cadeia de letras, dígitos e do
caractere “_”. O caractere “_” sozinho significa uma variável anônima, que é
utilizada no caso de uma determinada variável não ter importância para o
processo de dedução de uma solução. O fator chave que diferencia em
PROLOG uma variável de uma constante é a primeira letra da variável sempre
estar em maiúsculas (“caixa alta”). Caso esteja em letras minúsculas, o
elemento é uma constante. Na tabela 1, “joão” e “luiz” estão em letras
minúsculas, indicando que são constantes, e “X” e “Y” são variáveis. Mais
alguns exemplos de variáveis:
X1
Resultado
Objeto2
Lista_Extensa
_var35
_344
Um dos ambientes para execução de PROLOG mais utilizados hoje em
dia é o SWI-PROLOG. Desenvolvido desde 1987, é muito utilizado em
22
pesquisa, educação e também para aplicações comerciais. O software
SWI-PROLOG é disponibilizado para uso concomitante com outras linguagens
de programação, tais como C++, C#, Java, Python, etc.
Após instalado, podemos carregar os programas PROLOG codificados
em arquivos de texto com o sufixo “.pl”, e executar as consultas diretamente no
interpretador, conforme a Figura 12.
Para saber mais...
O SWI-PROLOGpode ser baixado
diretamente do site: <http://www.swi-
prolog.org/>, ou por meio do QR Code ao
lado. Existem versões para diferentes
sistemas operacionais e plataformas.
Figura 12: Tela do interpretador SWI-PROLOG com exemplo de um programa de cálculo de
fatorial.
SÍNTESE
Neste capítulo foram estudadas técnicas dentro da linha simbólica de
pesquisa da IA: os sistemas especialistas e a programação em lógica. Sistemas
23
Especialistas foram desenvolvidos para a resolução de problemas em um
domínio bem específico, cujo conhecimento é coletado de pessoas
especialistas em tal domínio. Portanto, os Sistemas Especialistas utilizam
conhecimento heurístico manipulado por regras Se-Então. Dois SEs bastante
citados na literatura são o MYCIN, utilizado para a área de diagnóstico de
doenças infecciosas; e o DENDRAL, para prospecção geológica. Um Sistema
Especialista é composto de uma base de conhecimento, de um mecanismo de
inferência e de um quadro negro. A Programação em Lógica, tratada aqui com
relação à linguagem PROLOG, deriva dos estudos da lógica de primeira ordem.
O algoritmo é constituído dos componentes de controle e do componente
lógico. Um programa em lógica é a representação de um problema expresso
por meio de um conjunto finito de um tipo especial de sentenças lógicas
denominadas de cláusulas. Programas em PROLOG têm sido utilizados em
sistemas de apoio à decisão, simulações educacionais, tutoriais inteligentes,
problemas matemáticos, planejamento e roteirização, resolução de problemas,
uso em regras de negócio e processamento de linguagem natural. Uma
cláusula em PROLOG pode ser um fato, uma regra ou uma consulta. Uma
cláusula pode ser composta de corpo e cabeça.
REFERÊNCIAS
RUSSEL, S.; NORVIG, P. Inteligência Artificial. Tradução da 2. ed. Rio de
Janeiro: Campus, 2004.
BITTENCOURT, G. Inteligência Artificial – Ferramentas e Teorias.
Florianópolis: Ed. da UFSC, 1998.
PALAZZO, L. A. M. Introdução a Prolog. Pelotas: Editora UCPel, 1997.
INTELIGÊNCIA
ARTIFICIAL APLICADA
AULA 5
Prof. Luciano Frontino de Medeiros
2
CONVERSA INICIAL
Nesta aula você estudará sobre as Redes Neurais Artificiais, uma área de
pesquisa dentro da linha conexionista da Inteligência Artificial. Estudaremos
sobre a estrutura das RNA dividida em camadas de neurônios, a função de
ativação e um dos tipos clássicos de RNA, o Perceptron Simples e o Perceptron
Multicamada.
CONTEXTUALIZANDO
Do lado da linha de pesquisa conexionista da IA, temos um dos
representantes-chave, que são as Redes Neurais Artificiais. De forma análoga
ao comportamento das células inteligentes dos seres vivos, os neurônios, as
RNA são capazes de diferenciar padrões quando um conjunto de sinais de
diversos padrões são apresentados à sua entrada. Diferente das técnicas da
linha simbólica, as RNA aprendem com o ambiente, a partir de conjuntos de
amostras representantes dos padrões, de forma bem similar ao que acontece
nos seres vivos. Em várias atividades em que é necessário proceder uma análise
de padrões complexos, até difíceis para seres humanos, técnicas de RNA são
bastante importantes para evidenciar novos conhecimentos. Veremos agora os
conceitos importantes relacionados às RNA.
TEMA 1: INTRODUÇÃO A REDES NEURAIS ARTIFICIAIS
O trabalho em Redes Neurais Artificiais (RNA) tem sido motivado desde
o começo pelo reconhecimento de que o cérebro humano processa informações
de uma forma inteiramente diferente de um computador convencional. O cérebro
é um computador altamente complexo, não linear e paralelo possui a capacidade
de organizar seus constituintes estruturais, os neurônios, de forma a realizar
certos processamentos tais como reconhecimento de padrões, percepção e
controle motor, de forma mais rápida que o mais rápido computador existente
(HAYKIN, 2004, p. 27).
3
Considere um exemplo da natureza: o sonar de um morcego é um sistema
ativo de localização por eco. Além de fornecer informações sobre a distância até
o alvo, o sonar transmite também informação sobre a velocidade relativa do alvo,
tamanho de várias características do alvo e a elevação do alvo. Toda a complexa
computação ocorrendo num cérebro do tamanho de uma ameixa! (HAYKIN,
2004, p. 27).
Os neurônios são as unidades fundamentais dos tecidos do sistema
nervoso, incluindo o cérebro. Cada neurônio consiste de um corpo celular,
também designado como soma, o qual contém um núcleo. Partindo do corpo da
célula existem um número de filamentos denominados dendritos, e um filamento
mais longo que é denominado de axônio (Figura 1). Os dendritos ligam-se ao
redor da célula a outras células e o axônio faz uma conexão mais longa. A estas
conexões dá-se o nome de sinapses.
O sinal de uma célula a outra se faz mediante uma complicada reação
eletroquímica. Substâncias químicas transmissoras são lançadas das sinapses
e entram pelos dendritos, aumentando ou baixando o potencial elétrico do corpo
da célula. Quando o potencial chega a um limiar, um pulso elétrico ou potencial
de ação é mandado pelo axônio. O pulso espalha-se ao longo das conexões
existentes pelo axônio, eventualmente chegando a outras sinapses e lançando
transmissores ao corpo de outras células.
Sinapses que incrementam o potencial de outras células são
denominadas excitatórias, enquanto que as que decrementam são denominadas
inibitórias. Os neurônios podem formar novas conexões com outros neurônios,
e tais mecanismos são por meio dos quais se forma a base para o aprendizado
do cérebro.
4
Figura 1: Ilustração de um neurônio biológico
Fonte: adaptado de Medeiros (2007).
Uma rede neural biológica pode, dessa forma, ser abstraída para simular
o seu comportamento. Dessa forma, podemos conceituar uma rede neural
artificial como um processador maciçamente e paralelamente distribuído
constituído de unidades de processamento simples, que têm a propensão natural
para armazenar conhecimento experimental e torná-lo disponível para o uso
(HAYKIN, 2004).
Uma rede neural artificial tem uma série de propriedades
(HAYKIN, 2004, p.30):
Não linearidade: neurônios podem ser lineares ou não lineares, dessa
forma, permitem aproximações robustas de funções de mapeamento que
tenham característica não linear.
Mapeamento Entrada-Saída: A rede aprende a partir de exemplos,
estabelecendo mapeamento entre os padrões apresentados na entrada com as
saídas dadas pelos exemplos.
Adaptabilidade: redes neurais podem ser treinadas e armazenar o
conhecimento nos pesos sinápticos, podendo se adaptar caso o conjunto de
amostras utilizado para o treinamento se modifique ao longo do tempo.
5
Resposta a Evidências: uma rede neural pode perfazer uma tarefa de
seleção de um padrão, mas também informar sobre o grau de confiança ou
crença referente ao padrão escolhido.
Informação Contextual: o conhecimento é armazenado na própria
estrutura e pela ativação da rede neural.
Tolerância a falhas: redes que sejam implementadas em hardware são
tolerantes a falhas, em caso de neurônios ou conexões que possam ser
danificados, ou mesmo em software utilizando técnicas de poda de redes, que
reduzem a quantidade de neurônios ou sinapses, mantendo a mesma condição
de performance.
Uma rede neural artificial tem a sua construção dependente de alguns
elementos:
Número de camadas: as RNA possuem pelo menos uma camada de
entrada, de onde recebe os sinais ou características das amostras, e uma
camadade saída que apresenta os padrões ou classes, mapeados para os
conjuntos de treinamento. Também podem possuir uma ou mais camadas
ocultas, como no caso do perceptron multicamada e das redes de base radial.
Quantidade de neurônios por camada: a quantidade de neurônios irá
depender da natureza do problema sendo abordado. A camada de entrada terá
tantos neurônios conforme as características das amostras do conjunto de
treinamento. A camada de saída terá os neurônios referentes às classes a que
pertencem as amostras do conjunto de treinamento. A camada oculta ou
escondida pode ter a quantidade de neurônios variável, conforme a
característica do mapeamento que se deseja.
Tipo de função de transferência: a função de transferência define a
ativação do neurônio. Podem ser utilizadas funções discretas (tais como a função
degrau, utilizada no perceptron a ser explicado adiante) ou funções contínuas
(como a função sigmoide para o perceptron multicamada).
Método de treinamento: ao longo dos anos foram desenvolvidos
diversos métodos ou algoritmos de treinamento. Dentre os métodos mais
6
utilizados está o algoritmo de retropropagação (backpropagation), que utiliza a
informação do erro na atualização dos pesos.
As RNA podem aprender de diversas formas:
Aprendizagem por correção de erros: a informação do erro é utilizada
para modificar os pesos sinápticos.
Aprendizagem baseada em memória: um grande número de exemplos
de entrada e saída são armazenados, e uma amostra é comparada com a sua
vizinhança para se identificar a classe à qual pertence.
Aprendizagem hebbiana: com base nos estudos de Hebb, utiliza uma
regra associativa, que aumenta a força dos pesos positivamente correlacionados
ou diminui daqueles negativamente correlacionados.
Aprendizagem competitiva: neste tipo de aprendizagem, os neurônios
competem entre si, tendo-se um vencedor que estará ativo em um certo instante
(aprendizagem denominada também de winner-takes-all).
Aprendizagem de Boltzmann: aprendizagem com características
estocáticas derivada das ideias da mecânica estatística. Nesse caso, os
neurônios constituem uma estrutura recorrente e operando de maneira binária,
controlados por uma função de energia. A atualização dos pesos se dá por
correlação, operando em duas condições: uma condição presa (os neurônios
visíveis estão presos a estados específicos) e outra condição livre (todos os
neurônios podem operar livremente).
A aprendizagem ainda pode ser caracterizada como supervisionada (em
que há o feedback que retorna à rede para orientar o treinamento) e não
supervisionada (a rede aprende de forma auto-organizada). Quanto às tarefas
que podem ser executadas por uma RNA estão:
Associação de padrões;
Reconhecimento de padrões;
Aproximação de funções;
Controle;
7
Filtragem.
TEMA 2: O PERCEPTRON
O perceptron foi um dispositivo eletrônico inventado em 1957 por Frank
Rosenblatt (1928-1971), psicólogo americano, considerado uma espécie de
"homem da renascença" devido à sua excelência em várias áreas, incluindo
computação, matemática, neurofisiologia, astronomia e música. O perceptron foi
construído de acordo com princípios biológicos e que mostrava capacidade de
aprendizado. Era organizado em três camadas de unidades (ou neurônios):
unidades sensoriais (S), associativas (A) e geradoras de respostas (R),
alimentada à frente (Ver figura 2).
Um dos protótipos construídos por Rosenblatt foi o Mark I. O Mark I era
um perceptron implementado em hardware com 400 unidades fotosensoras,
camada de associação de 512 unidades e camada de saída de 8 unidades.
Figura 2: Esboço do perceptron Mark I
8
Figura 3: Arquitetura de um perceptron. As variáveis significam: x – valores de entrada; w –
valores dos pesos; d – saída intermediária; o – saída ativada
Fonte: adaptado de Medeiros (2007).
Para saber mais...
Frank Rosenblatt contribuiu para o campo
das redes neurais de forma significativa com o
invento do perceptron. Para conhecer um pouco
mais sobre seu trabalho, acesse o link:
<http://csis.pace.edu/~ctappert/srd2011/rosenblat
t-contributions.htm>, ou por meio do QR Code
ao lado.
O perceptron obtém os sinais do ambiente por meio das
entradas, nas quais são apresentados os valores correspondentes aos
padrões que queremos classificar, por exemplo, valores de pixels de
imagem ou características de um produto. Na figura 3 o perceptron possui
5 (cinco) entradas.
9
Fazendo parte da estrutura interna do perceptron, temos os pesos ou
sinapses. Os pesos assumirão valores tais que, quando aplicarmos um padrão
na entrada, obteremos uma saída intermediária d. O aprendizado da rede ficará
armazenado nos pesos e seus valores são obtidos mediante um processo de
treinamento. O valor w0. é chamado de bias, sendo fixo e entendido como uma
espécie de ajuste fino, o qual não multiplica com entrada nenhuma.
A saída intermediária d é calculada mediante o somatório da multiplicação
entre cada entrada e seu peso. Ou seja,
d = w1x1 + w2x2 + w3x3 + w4x4 + w5x5 + w0
ou, de forma genérica (com n=5),
Em linguagem de programação (Pascal), poderíamos construir o
algoritmo a seguir representando este cálculo:
function Soma: double;
var w, x: array[0..5] of double;
d: double;
i: integer;
begin
...
// Aqui seriam associados os valores para os vetores w e x
...
d := w[0];
for i := 1 to 5 do
d := d + w[i]*x[i];
Result := d;
end;
(1)
10
Após o cálculo da saída intermediária d, precisamos então calcular agora
a saída ativada o (do inglês output). Como visto na figura 3, a saída ativada o
depende do resultado da saída intermediária d. Caso o resultado obtido em d for
maior ou igual a 0 (zero), o será igual a +1(um); se d for menor que 0 (zero), o
será igual a –1 (menos um). Ou, em forma de código,
TEMA 3: PERCEPTRON MULTICAMADA
O perceptron multicamada se diferencia do perceptron simples por incluir
camadas escondidas ou ocultas na RNA. Com a inclusão de camadas ocultas,
o número de pesos ou sinapses aumenta consideravelmente (Figura 4).
A consequência disso é a possibilidade de melhorar o mapeamento das entradas
com as saídas. Um perceptron simples trabalha de forma linear, enquanto que o
perceptron multicamada tem condições de lidar com conjuntos de treinamento
cuja separabilidade seja não linear.
A arquitetura com camadas ocultas requer algoritmos de aprendizagem
que contemplem a atualização dos pesos relacionados às camadas internas.
O processo de ativação acontece primeiramente nas camadas ocultas para
depois chegar até a camada de saída. A retroalimentação do erro também é feita
nos pesos que conectam a(s) camada(s) oculta(s).
function SaidaAtivada(d: double): integer;
var i: integer;
begin
if d > = 0 then
i := 1
else
i := -1;
Result := i;
end;
11
Figura 4: Representação de uma rede perceptron multicamada (MLP), com uma camada
oculta, com todos os nós conectados.
A dinâmica do perceptron multicamada envolve o processamento
de dois tipos de sinais (figura 5) se propagando pela rede
(HAYKIN, 2004, p. 186-187):
Sinal funcional: é o sinal apresentado à camada de entrada referente aos
atributos do vetor de amostras, que propaga-se para a frente na rede, nó por nó,
ativando os neurônios até a camada de saída.
Sinal de erro: tem origem em um neurônio da camada de saída, porém
se propagando para trás na rede, ajustando os valores dos pesos ou sinapses.O algoritmo de retropropagação para o perceptron multicamada envolve
a seguinte notação constante na Tabela 1. O algoritmo envolve o processo
chamado de descida de gradiente. Esse processo busca calcular o gradiente
local do erro (a direção para onde tende a crescer o valor do erro médio
calculado), utilizando-o para corrigir os pesos sinápticos na direção contrária a
esse gradiente, em busca do erro mínimo local.
12
Figura 5: Representação do sinal funcional, que se propaga à frente, e do sinal de erro, que
retropropaga na rede.
Tabela 1: Descrição das variáveis nas fórmulas correspondentes ao algoritmo de
retropropagação do percetpron multicamada, relacionadas ao grafo de propagação do sinal na
figura 22
Variável Descrição
i, j, k Índices para os neurônios. Usando a notação em que o sinal
funcional se propaga da esquerda para a direita, O neurônio i está
numa camada mais à esquerda; o índice j.
E Soma dos erros quadráticos.
ej Sinal de erro na saída do neurônio j.
dj Sinal desejado no neurônio de saída j.
yj Sinal funcional que aparece na saída do neurônio j.
13
xj Sinal da amostra apresentada no neurônio j da camada de
entrada.
wji Peso sináptico conectando a entrada do neurônio i à saída do
neurônio j.
Δwji Correção aplicada ao peso sináptico que conecta a entrada do
neurônio i à saída do neurônio j.
vj Soma ponderada de todas as entradas sinápticas no neurônio j
acrescida do bias.
δj Gradiente local para o neurônio j.
f Função de ativação.
η Taxa de aprendizado.
α Taxa de momentum
De forma geral, as etapas referentes ao algoritmo de retropropagação são
descritas a seguir:
1. Construa uma rede MLP totalmente conectada, com N neurônios na camada
de entrada, M neurônios na camada de saída e P neurônios na camada
oculta, conforme as características do problema.
2. Inicialize os pesos com valores aleatórios e os pesos w0 (bias) com
valor +1.
3. Escolha uma amostra na forma de um par entrada-saída desejada
(xi, di). Assim, tal como na Figura 6, na camada de entrada, os valores do
neurônio yi serão iguais aos xi.
14
4. Propague o sinal dos neurônios da camada de entrada yi para a camada
intermediária por meio do somatório ponderado pelos pesos sinátpicos wji
para calcular vj (também chamado de campo local induzido) e utilize a função
de ativação para calcular os valores de entrada yj para a camada
intermediária:
N
i
ijij ywv
0 e )( jj vfy
Uma função bastante utilizada para perceptrons multicamada é a função
sigmoide. A função sigmoide tem um comportamento mais “suave” do que a
função degrau, utilizada no exemplo do perceptron simples. Enquanto que a
função degrau possui apenas duas opções (+1 ou -1), a função sigmoide
calcula valores infinitos dependendo do argumento da função. Assim,
enquanto que a função degrau é uma função discreta, a função sigmoide é
considerada uma função contínua. Veja o gráfico desta função na Figura 7.
A fórmula da função sigmoide1 é
0,
1
1
)(
a
e
vf
jav
j
5. Propague o sinal dos neurônios da camada intermediária yj para a camada
de saída por meio do somatório ponderado pelos pesos sinátpicos wkj para
calcular o campo local induzido vk, utilizando a função sigmoide para calcular
os valores de entrada yk para a camada de saída:
P
j
jkjk ywv
0 e )( kk vfy
1 O símbolo e utilizado é o número de Euler (aproximadamente 2,71828...). Não onfundir com o
valor do erro ej. A variável a regula a inflexão da curva sigmoide, sendo comum adotar a=1.
15
6. Calcule o gradiente local para os neurônios da camada de saída δk de
acordo com a fórmula (no caso de se utilizar a função sigmoide)
kkkkk yyday 1
7. Calcule o gradiente local para os neurônios da camada intermediária δj
conforme a fórmula:
M
k
kjkjjj wyay
0
1
8. Atualize o valor dos pesos conforme os valores dos gradientes locais
calculados para a camada de saída e a camada intermediária. O índice
sobrescrito t+1 indica o próximo valor das atualizações dos pesos, sendo o
índice sobrescrito t o valor atual.
kk
t
kj
t
kj yww 1
e
jj
t
ji
t
ji yww 1
O valor de atualização compõe-se de duas partes: uma referente ao valor
atual do peso, multiplicado pela taxa de momento α; e outra referente à
modificação calculada pelo gradiente local, multiplicada pela taxa de
aprendizagem η. Os pesos sinápticos devem ser atualizados então:
t
kj
t
kj
t
kj www
1
e
t
ji
t
ji
t
ji www
1
16
9. Retorne ao passo 3 e escolha outro par entrada-saída. Quando todos os
pares forem apresentados à rede, significa que uma época de treinamento
foi alcançada. Dessa forma, refaz-se o processo para várias épocas até que
o valor global de erro alcance um valor que possibilite a classificação ótima
pela rede MLP. O erro global pode ser calculado pela fórmula seguinte, em
que C indica o somatório para todas as amostras apresentadas ao
perceptron multicamada:
C C
kkk ydeE
22 )(
2
1
2
1
Figura 6: Representação da propagação do sinal funcional à frente na rede MLP, a partir da
entrada, passando pela ativação até chegar à camada de saída
Fonte: adaptado de Haykin (2004, p. 192).
Este processo do algoritmo de retropropagação foi descrito utilizando uma
camada intermediária, mas pode ser estendido para o caso de a rede ter mais
camadas ocultas.
17
Figura 7: Gráfico da função de ativação sigmoide, que permite obter a ativação dos neurônios
da rede MLP de forma suave
Normalização
A utilização do perceptron multicamada para vários tipos problemas
requer que os valores dos neurônios das camadas de entrada e saída sejam
modificados para trabalhar numa faixa específica, que facilite a codificação do
algoritmo e evite possíveis erros relacionados com overflow de variáveis.
Utilizando um exemplo de segmentação relativo a investidores de um
banco, a Figura 8 mostra algumas variáveis que podem ser utilizadas para
segmentar os clientes. Pode-se notar que elas têm condições de assumir valores
distintos. Enquanto um valor para o prazo de investimento chega a ter um valor
máximo de 35, a faixa para a variável renda pode chegar a 30000. Quando
alimentamos a camada de entrada da rede MLP, precisamos fazer com que a
rede entenda tais valores como se pertencessem a uma faixa específica. Isso é
conseguido a partir da normalização.
18
Figura 8: Variáveis utilizadas no exemplo de segmentação de clientes investidores, mostrando
a variabilidade das faixas para as diferentes variáveis
Podemos normalizar os valores para uma faixa específica, por exemplo,
[0,1]. Ou seja, os neurônios assumirão apenas valores dentro dessa faixa.
É necessário então transformar os valores de entradas para que fiquem dentro
dessa faixa. A Figura 9 mostra como a variável renda pode ser normalizada. O
valor mínimo que a variável pode assumir é zero; então, o neurônio assumirá o
valor “0”. O valor máximo que ele poderá assumir será de 30000; então, este
valor corresponderá ao valor do neurônio “1”. Para esse tipo de normalização,
podemos calcular por regra de três simples. No caso de um valor qualquer,
digamos, 5000, o cálculo mostra que na proporção da faixa normalizada [0,1], ovalor correspondente será de 0,16. Na Figura 10 temos mais exemplos,
que já induzem como expressarmos a fórmula para se utilizar dentro do algoritmo
de treinamento.
19
Figura 9: Ilustração da normalização para a variável renda. Os valores mínimos e máximos são
utilizados numa regra de três para obter os valores normalizados na faixa [0,1]
Diagrama Cálculo
Exemplo
Pega-se o valor atual da renda
(digamos, 5000)
Faz-se a diferença 5000 – 0 (0 é o
valor mínimo) = 5000
Divide-se pela diferença 30000 – 0
(máximo – mínimo) = 30000
5000 / 30000 = 0,16
Mínimo
Quando o valor é o valor mínimo: 0 –
0 = 0
Divide-se pela diferença (máximo –
mínimo) = 30000 – 0 = 30000
Calculando: 0 / 30000 = 0
Máximo
Quando o valor é o valor mínimo:
30000 – 0 = 30000
Divide-se pela diferença (máximo –
mínimo) = 30000 – 0 = 30000
Calculando: 30000 / 30000 = 1
20
Figura 10: Mais exemplos mostrando o valor original da variável renda, e o valor normalizado
para ser alimentado à rede neural
A fórmula que poderemos utilizar para a normalização será:
minmax
min
xx
xx
x entradaonormalizad
SÍNTESE
Neste capítulo foi vista uma introdução ao estudo das Redes Neurais
Artificiais, as quais fazem parte da linha de pesquisa conexionista. A base para
o estudo é a forma como os neurônios se conectam em uma rede neural,
trocando informações entre si para a resolução de algum problema tal como
reconhecimento de padrões. Uma rede neural tem as propriedades de
não linearidade, mapeamento entrada-saída, adaptabilidade, resposta a
evidências e tolerância a falhas. Uma RNA depende da quantidade de camadas
de entrada, ocultas ou de saída, da quantidade de neurônios por camada, do tipo
de função de transferência e do método de treinamento.
RNAs podem aprender de diversas formas: por correção de erros, baseada em
memória, aprendizagem hebbiana, aprendizagem competitiva ou aprendizagem
21
de Boltzmann. A aprendizagem pode ser supervisionada ou não supervisionada.
RNAs podem executar diferentes tarefas tais como reconhecimento, associação
de padrões, aproximação de funções, controle e filtragem. O perceptron é um
modelo clássico de RNA.
O treinamento de um perceptron exige a definição de uma taxa de
aprendizagem. O algoritmo básico para treinamento de um perceptron consiste
em calcular o erro e propagar o erro para trás na rede de forma a atualizar os
valores das sinapses. Se um perceptron precisa aprender a classificar
corretamente duas classes, se tais classes forem separáveis linearmente, o
perceptron sempre aprenderá a classificar corretamente. O valor ótimo dos
pesos é aquele que irá minimizar o erro global. O problema do XOR demonstrou
restrições do perceptron simples original estudado por Rosenblatt, que poderia
ser resolvido adicionando-se camadas ocultas e tornando-o um perceptron
multicamadas. O algoritmo de treinamento de um perceptron multicamadas é
denominado algoritmo de retropropagação. Geralmente
adota-se como função de transferência para um perceptron multicamadas a
função sigmoide. A normalização é um passo importante adotado antes de se
fazer o treinamento de uma RNA.
REFERÊNCIAS
RUSSEL, S.; NORVIG, P. Inteligência Artificial. Tradução da 2. ed. Rio de
Janeiro: Campus, 2004.
MEDEIROS, L. F. Redes Neurais em Delphi. 2. ed. Florianópolis: Visualbooks,
2007.
HAYKIN, S. Redes Neurais: Princípios e prática. Porto Alegre, Bookman, 2001.
INTELIGÊNCIA ARTIFICIAL
APLICADA
AULA 6
Prof. Luciano Frontino de Medeiros
2
CONVERSA INICIAL
Nesta aula você estudará sobre os Algoritmos Genéticos, os conceitos,
características, etapas do algoritmo, bem como o exemplo de aplicação de AG,
mostrando em detalhes a sua dinâmica, e a aplicação desse exemplo utilizando
linguagem de programação.
CONTEXTUALIZANDO
A teoria da evolução de Darwin foi um dos conceitos que revolucionaram
a ciência no século XIX. Em meados do século XX, a ideia de evolução permitiu
a concepção de sistemas que se modificam de acordo com um conjunto de
operações específicas, na busca da solução de um problema.
Em vez de solucionar um problema de busca por meio de procedimentos
analíticos, pode-se começar com uma solução parcial e, ao longo de várias
iterações, fazer evoluir essa solução até chegar a uma boa o bastante. Um dos
representantes da linha de pesquisa evolucionária são os Algoritmos Genéticos,
que permitem a abordagem de um problema, considerando a evolução de
soluções parciais. Geralmente são aplicados em problemas dos quais não se
tem muito, ou mesmo nenhum conhecimento. Estudaremos agora alguns dos
conceitos importantes dessa técnica relevante de IA.
TEMA 1: INTRODUÇÃO A ALGORITMOS GENÉTICOS
As pesquisas de IA, dentro da linha evolucionária, baseiam-se na
observação de mecanismos evolutivos da natureza, incluindo auto-organização
e comportamento adaptativo. Os modelos mais conhecidos de algoritmos
evolucionários são os algoritmos genéticos, a programação genética e as
estratégias evolucionárias.
Um algoritmo genético (AG) faz parte da classe de algoritmos de busca.
O algoritmo procura uma solução dentro de um espaço para um problema de
otimização. Assim, os algoritmos genéticos podem ser uma boa opção para
3
efetuar a busca em problemas considerados intratáveis. A aplicação de
algoritmos genéticos se faz em várias áreas, tais como a arquitetura de circuitos
eletrônicos, planejamento e roteirização, programação de games, previsão do
tempo e ainda descoberta de identidades matemáticas (RUSSEL; NORVIG,
2004).
Podemos afirmar que um AG é considerado um algoritmo de busca em
feixe estocástica, em que os estados sucessores são criados a partir da
combinação de dois (ou mais) estados “pais”, em vez de serem criados a partir
da variação de um único estado. Temos assim uma analogia com a seleção
natural proveniente da biologia. A busca em feixe se dá pelo uso de uma
população inicial gerada aleatoriamente, que evolui ao longo das “gerações”
(iterações do algoritmo). A produção de uma nova população é
avaliada por uma “função objetivo”, ou “função de fitness”. Essa função
retorna à nova população, priorizando os estados melhores
(RUSSEL; NORVIG, 2004, p. 115).
Dos principais fatores que têm feito dos AG uma técnica de busca
bem-sucedida e utilizada, estão (AZEVEDO, 2000, p. 35):
Possui operacionalização simples;
Baixa dificuldade de implementação;
Apresenta alta eficácia com relação ao processo de busca na
região onde provavelmente se encontra o valor máximo global;
Útil quando se tem pouco ou mesmo nenhum conhecimento do
problema, ou ainda quando tal conhecimento é impreciso.
Pelas suas características, os AGs fazem parte dos métodos
probabilísticos de busca e otimização. Os AGs utilizam o conceito de
probabilidade, mas não são considerados simples buscas aleatórias.
Ao contrário, eles direcionam a busca para regiões onde é mais provável
4
encontrar uma solução ótima. Diferente das técnicas de busca convencionais, as
principais diferenças residem em (AZEVEDO, 2000, p. 37):
“A busca da melhor solução é feita sobre uma população de pontos
e não sobre um único ponto (busca em feixe)”;
“Os AGs perfazem uma busca cega, sendo a única exigência o
conhecimento da função objetivo de cada indivíduo, não sendo necessária
nenhuma informação adicional”; “Os AGs usam operadores estocásticos ou probabilísticos e não
regras determinísticas na direção de uma busca altamente exploratória e
estruturada; as informações das gerações anteriores são acumuladas,
auxiliando a direcionar estas buscas”.
De forma geral, os passos para a execução de um AG estão descritos no
Quadro 1.
Quadro 1: Passos genéricos para o Algoritmo Genético
1. Gera-se aleatoriamente uma população de candidatos a solução do
problema.
2. Enquanto não satisfaz as condições de terminação (cada iteração e
geração):
(a) Gera-se uma nova população inicialmente vazia.
(b) Enquanto a nova população não estiver completa:
i. Executa a seleção de dois indivíduos aleatoriamente da
população atual, dando preferência na seleção àqueles indivíduos que possuem
maior fitness.
ii. Executa o crossover dos dois indivíduos, conforme um
ponto de corte, para obter dois novos indivíduos.
5
(c) Concede a cada membro da nova população a chance da
operação de mutação.
(d) Substitui a população atual com a nova população.
3. Escolhe o indivíduo da população com a melhor avaliação de fitness
para ser a solução do problema.
Fonte: adaptado de GOMEZ (2005).
População é o conjunto de candidatos a soluções do problema em
questão. Por meio das sucessivas gerações, novos candidatos são gerados na
população, ao passo que outros desaparecem, ou seja, são descartados da
população. Uma solução na população é denominada indivíduo. A adaptação
ou adequação (fitness), relacionada a um indivíduo, significa a qualidade dessa
medida representada por esse indivíduo. “Quanto melhor a solução, maior será
a sua adaptação. É claro que isso depende das características do problema a
ser resolvido” (GOMEZ, 2005).
Os indivíduos que fazem parte de um AG precisam de uma codificação
que o simbolize no espaço possível de indivíduos que caracterizam o problema.
Essa codificação é feita utilizando-se cromossomos.
Um cromossomo é a tradução das características do indivíduo no
alfabeto utilizado pelo AG. Podemos concluir que um cromossomo é uma
sequência de bits, sendo constituídos por “genes” que se referem a cada bit
(LINDEN, 2012, p. 65). Os algoritmos geralmente utilizam como alfabeto a
codificação binária (0’s e 1’s) para sua representação. Um cromossomo terá
também um comprimento fixo de bits ou genes.
Os operadores mais comuns utilizados nos AG para criar os novos
indivíduos através das gerações são:
Seleção;
6
Cruzamento ou crossover;
Mutação.
O operador de seleção é comparável ao que encontramos na natureza
sobre a lei da seleção natural, relativo à sobrevivência daqueles que melhor se
adaptam ao ambiente. Os indivíduos mais adaptados (ou seja, aqueles que
apresentam melhor fitness) são selecionados para gerarem a descendência.
O operador de seleção utiliza um critério de maior probabilidade de cruzamento,
dando prioridade para aqueles que possuem maior fitness. (GOMEZ, 2005).
Um dos métodos mais utilizados para perfazer a seleção é o método da
roleta viciada ou roleta ponderada. Esse método dá mais probabilidade para
que um indivíduo de maior fitness seja escolhido em contrapartida a outro
elemento que tenha menor fitness. Isso não quer dizer que os indivíduos que
possuam menor fitness não passem para a próxima geração, mas que a
probabilidade de fazerem parte dessa nova geração é reduzida.
O crossover ou cruzamento ocorre pela mistura de duas soluções ou
indivíduos, com o objetivo de criar dois novos indivíduos. Esse cruzamento
tende a formar novos indivíduos, que possuem características dos “pais”, e que
têm a possibilidade de atender melhor o fitness. O crossover atua considerando
dois indivíduos pais, assumindo um ponto de corte em seus cromossomos e
intercalando as partes, resultando novos indivíduos. AGs podem ter pontos de
corte fixos ou aleatórios ao longo das gerações.
Durante cada geração, existe uma pequena chance de que um indivíduo
dentro da população sofra uma mutação, que vai mudar a característica do
indivíduo levemente. A mutação embute no AG uma característica totalmente
aleatória. Conforme uma taxa especificada no algoritmo, alguns genes dentro
dos cromossomos são escolhidos de forma randômica e alterados para outros
valores permitidos pelo alfabeto do cromossomo.
Uma variável relevante para o funcionamento do AG é o tamanho da
população. O aumento dos indivíduos em uma população permitirá o alcance
de um número maior de soluções possíveis, implicando assim na variabilidade
7
de alternativas oferecidas pelo AG. Isso permitirá que as melhores soluções, que
estejam próximas de uma solução ótima (se esta existir) sejam criadas. Portanto,
o tamanho da população deve ser grande, levando-se em conta as restrições
físicas (GOMEZ, 2005). O que limita o tamanho da população é o tempo que vai
demorar o AG na sua execução, e a quantidade de memória para guardar a
população.
Qual a melhor forma de terminar a execução do AG? A abordagem mais
simples é rodar o algoritmo de busca por um número fixo de gerações – quanto
mais gerações, melhor. Outra abordagem é encerrar o algoritmo se, depois de
passadas algumas gerações, não se obtiver uma melhora na adaptação do
melhor indivíduo da população. Ou seja, a variação dos melhores indivíduos
obtidos para os que são criados novamente é mínima. Dessa forma, adotar um
limiar de variação pode reduzir o número de gerações na execução de um AG.
TEMA 2: EXEMPLO DE APLICAÇÃO DE AG
Bons exemplos para entender a execução de um AG são aqueles nos
quais se conhece qual a solução ótima ou ideal. Problemas matemáticos que
possuem métodos determinísticos de resolução com poucas variáveis são
perfeitos para o entendimento de um AG. Entretanto, é importante ressaltar
que a maioria dos problemas reais contém uma diversidade muito grande
de variáveis e são intratáveis, cenário no qual o uso de AG se faz
realmente robusto.
O exemplo de otimização que utilizaremos será encontrar o máximo de
uma equação quadrática de duas variáveis. A solução para este problema pode
ser encontrada facilmente pelo cálculo diferencial da matemática. Vamos utilizar
a seguinte equação:
22 )2()3(2)( yxxf
8
Sabemos de antemão que o valor máximo dessa equação se encontra no
ponto x=3 e y=2, com f(x)=2. Podemos ver na Figura 1 o gráfico dessa equação,
mostrando visualmente o ponto de máximo que se pode obter.
Figura 1: Representação no plano espacial da equação
22 )2()3(2)( yxxf
, com o
ponto de máximo em x=3 e y=2, com f(x)=2.
Detalharemos então o exemplo nos passos seguintes:
a) Criaremos um AG que será capaz de obter esse ponto de máximo como
solução, sendo a expressão em f(x) a própria função objetivo ou
fitness.
b) Precisamos definir o cromossomo com o qual iremos gerar os
indivíduos para o AG. Para definir este cromossomo, devemos
determinar qual a faixa de valores que as variáveis x e y irão assumir.
Vamos supor que as variáveis x e y devam ficar no intervalo [0,7]. Ou
seja, o valor mínimo que elas podem assumir é 0 e o máximo será 7.
Podemos utilizar a codificação binária para representar os
cromossomos. Lembrando a conversão de números decimais para
binários:
9
Decimal Binário
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
Notamos que, naturalmente, a conversão de decimal para binário nos dá
o que precisaremos. Vamos assumir agora que, para cada variável, teremos um
comprimento de 3 genes. Com as duas variáveis, teremos, portanto, um
cromossomo, composto de dois aleloscom um total de 6 genes. Por exemplo,
o cromossomo para x=1 (001b conforme a tabela) e y=5 (101b) será:
001101
c) Após a definição do cromossomo, vamos supor uma população inicial
de 10 indivíduos. Assim, cada indivíduo é uma combinação de dois
valores: x e y. Podemos começar com a seguinte população escolhida
aleatoriamente:
x y Cromossomo
3 6 011110
6 4 110100
3 5 011101
7 0 111000
3 7 011111
1 6 001110
1 2 001010
5 4 101100
6 1 110001
10
4 2 100010
d) Avaliaremos os indivíduos gerados aleatoriamente a partir da função
objetivo. Adicionaremos mais uma coluna na tabela anterior, indicando
o valor obtido pela função objetivo, substituindo os valores de x e y:
x y Cromossomo (x,y)
3 6 011110 8
6 4 110100 15
3 5 011101 3
7 0 111000 32
3 7 011111 5
1 6 001110 8
1 2 001010 0
5 4 101100 8
6 1 110001 18
4 2 100010 3
e) O operador de seleção deve ser executado. Assim, organizaremos em
ordem descendente os indivíduos, de acordo com a função de fitness.
Notamos também que nessa primeira população, o indivíduo com
fitness 0 (zero) é o mais próximo da solução para o problema:
x y Cromossomo (x,y)
1 2 001010 0
3 5 011101 3
4 2 100010 3
3 6 011110 8
1 6 001110 8
5 4 101100 8
6 4 110100 15
3 7 011111 15
11
6 1 110001 18
7 0 111000 32
f) Escolhemos agora um ponto de corte da população. Adotaremos como
critério a seleção dos primeiros quatro indivíduos para a próxima
população a ser gerada.
x y Cromossomo (x,y)
1 2 001010 0
3 5 011101 3
4 2 100010 3
3 6 011110 8
1 6 001110 8
5 4 101100 8
6 4 110100 15
3 7 011111 15
6 1 110001 18
7 0 111000 32
g) Simularemos agora o método da roleta viciada, fazendo com que o
primeiro indivíduo da lista seja escolhido para gerar 4 indivíduos para a
nova população; o segundo 3 indivíduos; o terceiro 2 indivíduos e o
quarto 1 indivíduo (veja a coluna “ponderação”). Assim, a nova
população terá também 10 indivíduos. No passo de cruzamento
(crossover), escolhemos aleatoriamente um ponto de corte (no caso, o
quarto gene). Os cromossomos ficam, então, divididos para a execução
do crossover (com os genes ilustrado em duas cores):
x y Cromossomo (x,y) Ponderação
1 2 001010 0 4
3 5 011101 3 3
4 2 100010 3 2
12
3 6 011110 8 1
h) O próximo passo gera a nova população, sendo cada novo indivíduo
combinado a partir de dois indivíduos escolhidos aleatoriamente. Note
que só preencheremos a coluna referente aos cromossomos:
x y Cromossomo (x,y)
001001
001001
001010
001010
011110
011110
011101
100010
100010
011110
i) Agora, executaremos o operador mutação. Vamos estipular uma taxa
de mutação de 1 gene para cada 12 genes do total da população. Como
temos 60 genes ao total, podemos modificar aleatoriamente 5 genes
nos indivíduos da população gerada pelo crossover (genes alterados
na cor verde). Assim:
x y Cromossomo (x,y)
001011
001001
011010
001010
011110
011111
011101
101010
13
100010
011010
j) O próximo passo é decodificar o cromossomo na representação binária
para os valores das variáveis novamente:
x y Cromossomo (x,y)
1 3 001011
1 1 001001
3 2 011010
1 2 001010
3 6 011110
3 7 011111
3 5 011101
5 2 101010
4 2 100010
3 2 011010
k) Finalmente, avaliamos a função objetivo para estes novos valores
obtidos:
x y Cromossomo (x,y)
1 3 001011 1
1 1 001001 3
3 2 011010 0
1 2 001010 0
3 6 011110 8
3 7 011111 15
3 5 011101 3
5 2 101010 8
4 2 100010 3
3 2 011010 0
14
Temos assim uma nova população. Podemos notar que nesta geração, o
valor máximo obtido foi 1, relativo ao ponto x=1 e y=3. Para as próximas
gerações, o algoritmo genético deve ser executado a partir do passo e),
continuando até obter o valor máximo da função objetivo considerada.
Esse exemplo demonstra a dinâmica do AG de uma forma simplificada,
porém permitindo visualizar a aplicação dos operadores de seleção, cruzamento
e mutação. A faixa de valores foi tratada com números inteiros, mas poderíamos
adotar números reais. Por exemplo, um cromossomo com tamanho total 30 (15
bits para cada variável), com o alfabeto binário, os pontos tomados ao acaso
x=3,07 e y=2,13, teriam a seguinte representação codificada em binário para o
cromossomo:
100010000111010110001001100100
Os 15 primeiros bits se referem ao valor de x e os 15 últimos ao
valor de y. Ao avaliarmos pela função de fitness esses valores de x e y, obtemos
o valor de f(x) = 1,9769.
TEMA 3: AG EM JAVA
Para a abordagem desse mesmo problema, utilizando linguagem de
programação, utilizaremos a biblioteca Java API for Genetic Algorithms (JAGA).
Essa biblioteca consiste em uma série de classes para o uso em diversos tipos
de problemas. Para exemplos que lidem com aspectos comuns dos AG,
podemos criar uma classe de exemplo com o problema em questão. Outra classe
deve ser criada para definir a função objetivo.
15
Para saber mais...
A biblioteca JAGA está disponível para download neste
endereço: <http://jaga-java-api-for-genetic-
algorithms.soft112.com/download.html>, ou por meio do
QR Code ao lado.
Na Figura 2, a seguir, temos a classe Example1.java, contendo o exemplo
da maximização da função objetivo anterior. O código está comentado,
facilitando o entendimento. O tamanho da população foi definido em 40
indivíduos, a taxa de crossover em 90%, a taxa de mutação em 2%, executando
10000 gerações. Os indivíduos utilizam duas variáveis, com precisão de duas
casas decimais, operando na faixa [-6,6], codificados com 30 bits (15 para
cada variável).
Figura 2: Código da classe Example1.java, mostrando a configuração do problema de
maximização da função objetivo do exemplo anterior
public class Example1 {
public Example1() {
}
public void exec() {
// Define os parâmetros para o AG
GAParameterSet params = new
DefaultParameterSet();
params.setPopulationSize(40);
params.setFitnessEvaluationAlgorithm(new
Example1Fitness());
16
// Inclui a reprodução da nova população com
crossover e mutação
CombinedReproductionAlgorithm repAlg = new
CombinedReproductionAlgorithm();
repAlg.insertReproductionAlgorithm(0, new
SimpleBinaryXOver(0.9));
repAlg.insertReproductionAlgorithm(1, new
SimpleBinaryMutation(0.02));
params.setReproductionAlgorithm(repAlg);
// Define o método da roleta viciada
params.setSelectionAlgorithm(new
RouletteWheelSelection(-10E10));
// Número máximo de gerações
params.setMaxGenerationNumber(10000);
// Define as variáveis por indivíduo, a precisão decimal
e o tamanho do cromossomo
NDecimalsIndividualSimpleFactory fact = new
NDecimalsIndividualSimpleFactory(2, 2, 15);
fact.setConstraint(0, new RangeConstraint(-6, 6));
fact.setConstraint(1, new RangeConstraint(-6, 6));
params.setIndividualsFactory(fact);
// Constrói o AG
ReusableSimpleGA ga = new
ReusableSimpleGA(params);
// Associa o analisador
AnalysisHook hook = new AnalysisHook(System.out,
false);
ga.addHook(hook);
17
final int attempts = 1;
// Executa o AG
GAResult [] allResults = new GAResult[attempts];
for (int i = 0; i < attempts; i++) {
hook.reset();
GAResult result= ((ReusableSimpleGA)
ga).exec();
allResults[i] = result;
}
System.out.println("\nALL DONE.\n");
for (int i = 0; i < attempts; i++) {
System.out.println("Result " + i + " is: " +
allResults[i]);
}
}
public static void main(String[] unusedArgs) {
// Chamada da classe para execução do AG
Example1 demo = new Example1();
demo.exec();
}
}
18
Figura 3: Classe Example1Fitness.java, que contém o método responsável pela avaliação da
função objetivo
public class Example1Fitness implements
FitnessEvaluationAlgorithm {
public Example1Fitness() {}
public Class getApplicableClass() {
return NDecimalsIndividual.class;
}
public Fitness evaluateFitness(Individual individual, int age,
Population population, GAParameterSet params) {
NDecimalsIndividual indiv = (NDecimalsIndividual)
individual;
double x = indiv.getDoubleValue(0);
double y = indiv.getDoubleValue(1);
double f = 2 - (x-3)*(x-3) - (y-2)*(y-2);
Fitness fit = new AbsoluteFitness(f);
return fit;
}
}
A classe que contém o método que avalia pela função objetivo
(evaluateFitness) está descrita na Figura 3. Na Figura 4 temos a tela de saída
de uma execução da classe Example1.java. Pode-se notar que após 10000
gerações, foi encontrado o melhor resultado para x=2.97 e y=1.94, resultando na
função objetivo f(x) = 1.9955. Esse melhor resultado foi encontrado na geração
3779. Na Figura 5 estão listadas algumas execuções deste AG, mostrando as
diferentes soluções alcançadas. Diferentes parâmetros podem ser testados para
19
verificar se o AG pode encontrar uma solução mais próxima da calculada
deterministicamente.
Figura 4: Tela de saída de uma execução da classe Example1.java, mostrando que, após
10000 gerações, foi encontrado o melhor resultado para os valores x=2.97 e y=1.94, resultando
a função objetivo f(x) = 1.9955
*** Computation completed.
Generations: 10000
Fitness evaluations: 400040
Run time: 00:04.4099
Best result: {size=2; repr=000000110111101000000010100011;
vals=(2.97, 1.94); fit=1.9955}
*** Best fitness (1.9955) was discovered in generation 3779.
ALL DONE.
Result 0 is: {size=2; repr=000000110111101000000010100011;
vals=(2.97, 1.94); fit=1.9955}
Figura 5: Dez execuções do AG do exemplo, mostrando as melhores soluções alcançadas em
cada uma delas
No. x Y f(x,y) Geração
1 3.00 1.99 1.9999 2475
2 2.99 2.01 1.9998 9816
3 3.14 2.06 1.9768 4019
4 3.00 1.98 1.9996 6431
5 3.01 2.00 1.9999 306
6 3.00 1.99 1.9999 1438
20
7 2.97 2.04 1.9975 1259
8 3.00 2.01 1.9999 2102
9 2.99 2.00 1.9999 9165
10 2.07 2.01 1.9990 2341
SÍNTESE
Nesta aula foi estudada uma introdução aos Algoritmos Genéticos, que
fazem parte da linha de pesquisa evolucionária. Um AG faz parte da classe de
algoritmos de busca, indo atrás de uma solução dentro de um espaço para um
problema específico de otimização.
Os algoritmos genéticos podem ser uma boa opção para efetuar a busca
em problemas considerados intratáveis. A busca em feixe estocástico se deve
ao uso de uma população inicial gerada aleatoriamente, que evolui ao longo das
iterações do algoritmo. A produção de uma nova população é avaliada por uma
função objetivo ou de fitness. AG é uma técnica bem-sucedida, simples de
operar, de fácil implementação, eficaz na busca da região onde provavelmente
se encontra o máximo global e aplicável em situações em que se tem pouco ou
nenhum conhecimento do modelo ou, ainda, esse é impreciso. Um algoritmo
genético possui como principais operadores a seleção, o cruzamento ou
crossover e a mutação. Um indivíduo que é uma solução em um AG é codificado
por meio de um cromossomo, conforme o alfabeto utilizado pelo AG.
21
REFERÊNCIAS
RUSSEL, S.; NORVIG, P. Inteligência Artificial. Tradução da 2. ed. Rio de
Janeiro: Campus, 2004.
AZEVEDO, F. M.; BRASIL, L. M.; OLIVEIRA, R. C. L. Redes Neurais com
Aplicações em Controle e em Sistemas Especialistas. Florianópolis:
Visualbooks, 2000.
LINDEN, R. Algoritmos Genéticos. Rio de Janeiro: Ciência Moderna, 2012.
HAYKIN, S. Redes Neurais: Princípios e prática. Porto Alegre, Bookman, 2001.
KOZA, J. Genetic Programming. Boston-MA: MIT Press, 1992.
GOMEZ, L. A. Uma Introdução aos Algoritmos Genéticos. Computação
Evolutiva e Engenharia do Conhecimento, 2005. Disponível em:
<http://www.labeee.ufsc.br/~luis/ga/GA-INTRO.pdf>. Acesso em: 01/04/2017.