Inteligência Artificial Algoritmos - paginas.fe.up.ptprojfeup/submit_16_17/uploads/relat_1... ·...

19
Faculdade de Engenharia da Universidade do Porto Inteligência Artificial Algoritmos Projeto FEUP 2016/2017 MIEIC: Professor Manuel Firmino Professor José Magalhães Cruz Equipa 1MIEIC04_1: Supervisor: Professor Jorge Barbosa Monitor: Mafalda Falcão Estudantes & Autores: João Alves [email protected] João Álvaro [email protected] João Carlos [email protected] João Lima [email protected] Luís Afonso [email protected] Pedro Costa [email protected] Inteligência Artificial - Algoritmos 1/19

Transcript of Inteligência Artificial Algoritmos - paginas.fe.up.ptprojfeup/submit_16_17/uploads/relat_1... ·...

Faculdade de Engenharia da Universidade do Porto

Inteligência Artificial

Algoritmos

Projeto FEUP 2016/2017 MIEIC:

Professor Manuel Firmino Professor José Magalhães Cruz

Equipa 1MIEIC04_1:

Supervisor: Professor Jorge Barbosa Monitor: Mafalda Falcão

Estudantes & Autores:

João Alves [email protected] João Álvaro [email protected]

João Carlos [email protected] João Lima [email protected]

Luís Afonso [email protected] Pedro Costa [email protected]

Inteligência Artificial - Algoritmos 1/19

Resumo

Este relatório foi elaborado no âmbito da disciplina Projeto FEUP, do 1º ano do Mestrado

Integrado de Engenharia Informática e Computação da Faculdade de Engenharia da

Universidade do Porto. Tem por objetivo a exploração do tema da Inteligência Artificial e

seus algoritmos - classificações, usos, desafios - culminando na proposta de

produto/software útil neste contexto.

Para a realização do projeto em si, baseámos o nosso trabalho numa pesquisa

bibliográfica, dada toda a componente teórica inerente ao tema. Após a pesquisa, chegámos

à conclusão que os algoritmos usados para IA diferem um pouco dos usados para

operações normais (cálculos, funções computacionais). Entre as diferenças, destaca-se o

uso da Heurística (também uma das principais descobertas).

Palavras Chave: IA(inteligência artificial), algoritmos, heurística, sistema inteligente.

Inteligência Artificial - Algoritmos 2/19

Índice Glossário 4 1. Introdução 5 2. Inteligência Artificial 6 2.1 Algoritmos 7 2.1.1 Algoritmos utilizados em IA 7 2.1.2 Classificação de Algoritmos 8 2.1.3 Principais Desafios 16 3. Software proposto 17 4. Conclusões 18 Referências bibliográficas 19

Inteligência Artificial - Algoritmos 3/19

Glossário

➔ Algoritmos - sequência de processos de modo a completar uma tarefa (Ponto 2.1); ➔ Força bruta de computação - algoritmos que realizam a mesma tarefa, no entanto,

não eficientemente (Ponto 2.1); ➔ Sistema Inteligente - sistema que funciona sem a assistência de um humano,

inteligência artificial; ➔ Backtracking - procedimento que ocorre cada vez que um algoritmo de pesquisa

falha e que consiste num recuo do caminho percorrido de modo a escolher opções alternativas;

Inteligência Artificial - Algoritmos 4/19

1. Introdução

Desde o início dos tempos que as inovações tecnológicas têm ajudado o ser humano

a melhorar o seu estilo de vida. Mas a verdadeira revolução tecnológica consiste em criar

sistemas capazes de operar sem utilizador, ou seja Inteligência Artificial.

Com essa autonomia, o modo de vida atual pode ser melhorado em vários níveis e

seria muito mais vantajoso para pessoas necessitadas. Mas para a concretização destas

novas tecnologias são necessários algoritmos inteligentes, eficientes e rápidos, que sejam

capazes de traduzir linguagem natural em linguagem máquina e vice-versa.

É no âmbito da unidade curricular Projeto Feup que realizamos esta pesquisa à volta

destes algoritmos, que apesar da sua complexidade, foi possível fazer uma aproximação aos

conceitos base relacionados com os mesmos.

Vamos, ao longo do relatório, fazer pequenas explicações de diversos exemplos de

algoritmos, mais concretamente dos que se relacionam com o grupo de pesquisa.

Inteligência Artificial - Algoritmos 5/19

2. Inteligência Artificial

IA (“Inteligência artificial”) é uma área das ciências computacionais que consiste em

dar às máquinas a habilidade de aparentarem ter inteligência humana, ou seja, simular nas

máquinas um comportamento inteligente tipicamente humano. (Merriam-Webster's Learner's

Dictionary).

Até à década de 80, a IA consistiu no desenvolvimento de sistema especialistas, ou

seja, algoritmos inteligentes que, hoje em dia, estão presentes em qualquer busca que

fazemos na internet ou em qualquer sistema que estabelece algum tipo de diálogo com o

usuário.

Em teoria será possível desenvolver sistemas capazes de efetuar ações humanas

como percepção visual, reconhecimento de discurso, fazer decisões e tradução entre

línguas. (Oxford English Dictionary).

Inteligência Artificial - Algoritmos 6/19

2.1 Algoritmos

2.1.1 Algoritmos utilizados em IA

Os algoritmos usados para Inteligência Artificial diferem um pouco dos usados

normalmente, por exemplo para cálculos ou problemas computacionais. Estes últimos, considerados, neste caso, normais, chegam a uma solução ótima. No entanto, um algoritmo usado em IA devolverá a ação que devemos fazer, não garantido a sua perfeição.

Dado que é esperado uma resposta rápida de um sistema inteligente, este não terá o tempo para prever e testar todas as alternativas (uso da força bruta de computação); estes sistemas usam a Heurística, processo que pode ser entendido como, semelhante à característica humana, a invenção e resolução de problemas mediante a experiência, adquirida ou própria, através de um processo simplificador (divisão em sub-problemas mais “fáceis”).

A maioria dos problemas em IA revelaram-se ser exponenciais, quando, até à data, os algoritmos apenas trabalhavam com casos quadráticos e lineares. Com a Heurística, o espaço de procura de um algoritmo de IA pode ser reduzido significativamente, tornando assim a sua implementação mais fácil. No entanto, encontrar uma boa forma de implementar a Heurística pode se revelar complicado. Para resolver problemas maiores, é necessário adicionar informação prévia sobre o caso em questão para aumentar a eficiência de procura.

É sobre isto que recai uma das principais características de um sistema inteligente - e seus algoritmos -, o aprender com a experiência.

Estes algoritmos devem conter em si mesmos a capacidade de modificar automaticamente a estrutura e função do sistema que representam, ficando este capaz de adquirir, representar e usar o conhecimento para resolver certos problemas.

Visto que estes sistemas terão de interagir dinamicamente entre si e com humanos, necessitarão de detetar e tolerar o erro e ambiguidade inerentes à comunicação, procedendo à sua resolução - por exemplo, desenvolver um diálogo de clarificação com a outra parte.

Inteligência Artificial - Algoritmos 7/19

2.1.2 Classificação de Algoritmos

Algoritmos de Pesquisa em Inteligência Artificial:

A classificação do algoritmo não recai tanto no algoritmo em si mas sim nas suas diferentes implementações. Assim, existem três diferentes métodos:

1. Método Fraco 2. Método Informado 3. Pesquisa Adversarial;

O Método Fraco usa técnicas genéricas de pesquisa , estando, portanto, exposto a

um grande número de estados a pesquisar. Esta pesquisa pode ser feita em ambas as direções, por encadeamento direto ou inverso. Aqui inserem-se os seguintes algoritmos:

- Pesquisa em Profundidade: é o método de pesquisa mais simples. Uma

versão deste método foi investigada no século XIX como uma estratégia para resolver labirintos. A figura seguinte - figura 1.1 - representa como este método funciona. De uma forma básica, o algoritmo começa num nó (neste caso, a raiz) selecionado arbitrariamente. A partir deste, explora ao máximo cada ramificação existente até ter de efectuar backtracking. Desta forma, o algoritmo apenas precisa de armazenar o estado dos nós, visitados ou não, de modo a evitar a visita a nós repetido. Os números presentes nos nós da figura 1 representam a ordem pela qual estes são visitados. Assim, este processo não é considerado óptimo, pois nada nos garante que a solução arranjada seja aquela que requer menos passos. Também não é completo pois se uma das ramificações for infinitamente grande, este nunca encontrará a solução.

Inteligência Artificial - Algoritmos 8/19

- Pesquisa em Largura: ao contrário do exemplo anterior, neste algoritmo é dada prioridade aos nós mais próximos da raiz. A figura seguinte- figura 1.2 - representa o funcionamento deste algoritmo. Este começa na raiz, no primeiro nó, com uma fila vazia. Se este for solução, o algoritmo termina e a solução é de certeza a ótima. Se o nó tiver sucessores não visitados, estes são adicionados ao fim da fila. O primeiro é então retirado e o algoritmo repete-se para os seguintes. Estamos então perante um algoritmo ótimo pois a primeira solução encontrada é garantidamente a melhor e, se o número de ramificações for finito, também é completo.

- Custo Uniforme: Por vezes, nem todas as ações têm o mesmo custo,

sendo assim preferível avançar 2 outros estados em vez de apenas 1. Para resolver este tipo de problemas podemos recorrer aos algoritmos de custo uniforme, representado na figura 1.3. Bastante análogos aos de pesquisa em largura, nestes algoritmos é associado um custo de operação a cada fila, passando a ser uma fila de prioridade. Caso todos os custos sejam iguais, este algoritmo torna-se igual a um de pesquisa em largura. A única diferença entre o funcionamento deste algoritmo e o do anteriormente referido é de aquando à adição dos nós sucessores não visitados à fila, agora fila de prioridade, será também adicionado um custo que é igual ao custo atual, mais o custo da transição. Se o novo custo for menor, atualiza-se o seu valor, se não, não se faz nada.

Inteligência Artificial - Algoritmos 9/19

- Aprofundamento Progressivo: Este algoritmo acaba por ser uma variante

da pesquisa em profundidade mas que também apresenta características de profundidade limite. Esta operação realiza uma determinada pesquisa em determinada profundidade até encontrar uma solução ótima. Após isso, o procedimento volta a repetir-se, mas numa profundidade maior e continuará assim até não encontrar soluções ótimas melhores. Já o Método Informado, ao contrário do anterior, dispõe de algum tipo de

informação prévia, e deste modo é capaz de atribuir valor aos estados, de modo a selecionar as melhores opções. A atribuição dos valores depende seriamente do tipo de função heurística usada. Assim, esta função deve reunir em si as seguintes propriedades:

- Simplificadora do cálculo do valor real do estado; sendo, no entanto, o mais próxima possível do valor real (quanto mais próxima, mais rápido o método converge para a solução.

- Optimista; Caso se pretenda minimizar o custo, a função é sempre igual ou menor ao custo real. Caso se pretenda maximizar o custo, a função será igual ou superior.

- Consistente ou Monótona; Para cada nó P e cada sucessor Q de P, o custo estimado de se chegar à solução partindo de P nunca é maior que o custo estimado de se chegar à mesma solução passando também por Q.

A Heurística é então uma simplificação de um problema, retirando regras ao problema para o tentar resolver.

Nesta categoria encontram-se os seguintes algoritmos, considerados “meta-heurísticos”, pois, implementando uma função heurística, vão tentando melhorar uma solução:

- Hill Climbing: Este algoritmo, para funcionar, precisa de possuir algum

conhecimento do problema (por exemplo, através de uma função que lhe devolva o valor previsto para cada nó), ficando a saber se um movimento é favorável ou não. Assim, usando este conhecimento local, consegue fazer a melhor escolha a cada momento. Começando no estado inicial, se este for solução (ou se não apresentar sucessores), termina o algoritmo e a solução é localmente ótima, podendo não ser a ideal. Se não, escolhe o estado sucessor mais próximo da solução ou apenas um melhor e repete-se o algoritmo.

Este algoritmo apenas devolve a solução ótima em funções bem comportadas, em que o máximo local é o máximo global, caso contrário, pode ficar preso no máximo local, nunca convergindo para a solução. Para se tentar resolver isto, pode-se executar o algoritmo a partir de nós aleatórios.

Inteligência Artificial - Algoritmos 10/19

- Simulated Annealing: Dado que o Hill Climbing pode facilmente ficar preso em máximos e mínimos locais, foi criado o algoritmo Simulated Annealing impede o algoritmo original de ficar preso nesses mesmos locais. É então um método para encontrar uma boa solução para um problema de otimização. De uma forma geral, o algoritmo segue estes passos:

- Cria uma solução aleatória. - Calcula o seu custo usando a função custo/algoritmo original (por exemplo,

um algoritmo do tipo Hill Climbing) - Calcula o custo de uma solução de próxima. - Compara as soluções:

● Se o custo da mais recente for inferior à da mais antiga, segue com a solução mais recente;

● Se o custo da mais recente for superior à da mais antiga, talvez siga para a solução mais recente.

- Repete o dois passos anteriores até ser encontrada uma solução aceitável, ou até se ter esgotado todas as possibilidades; A parte mais peculiar deste algoritmo reside na característica de talvez seguir para a

solução mais recente mesmo quando o custo desta é superior à antiga, uma solução pior, por outras palavras. Na maioria das vezes, o algoritmo evita ao máximo seguir para uma solução pior, no entanto, se fizer sempre isto, estaria suscetível a ficar preso num máximo local. É exatamente para evitar isto que o Simulated Annealing por vezes segue para uma solução pior, para comparar. Podemos então ver que se trata de um algoritmo também probabilístico. Dado isto e mesmo sendo melhor que o Hill Climbing, as suas soluções apenas serão ótimas para funções bem comportadas. - A*: Este algoritmo é uma mistura do custo uniforme com métodos gananciosos, no sentido em que: Custo uniforme - Apenas tem em conta os custos até ao sucessor C(S, S’) = c(S) + c(S’). Métodos gananciosos - Apenas tem em conta a heurística do sucessor H(S ,S’)= h(S’). A* : O valor do sucessor é dado por f(S, S’) = C(S , S´) + H (S, S’).

Este algoritmo utiliza duas listas : Lista aberta ( nós a expandir) , Lista fechada ( nós já expandidos) .

De um modo geral o algoritmo funciona da seguinte maneira (por passos) : 1. Se a lista aberta estiver vazia, o algoritmo termina ; 2. Retira-se o primeiro estado da lista aberta e adiciona-se-o á lista fechada; 3. Se o estado for o estado final, o algoritmo retorna; 4. Caso contrário, para cada sucessor que não esteja na lista fechada: - Calcula-se o seu possível novo valor estimando, f’ ( S’ ) = f(S, S’). - Se o sucessor não estiver na lista aberta ou f’(S’) (novo valor estimado) for melhor que f (S’) o sucessor é adicionado na lista aberta. 5. Repete-se o algoritmo.

A complexidade do algoritmo A* depende muito da heurística, no entanto , por outro lado, o algoritmo é também bastante dispendioso na memória, visto que tem de armazenar informação de todos os estado até chegar ao estado final.

Inteligência Artificial - Algoritmos 11/19

- Algoritmos Evolutivos

Como se pode perceber pelo nome, estes algoritmos estão relacionados com a ideia de evolução. Como se pode imaginar, tal como na seleção natural, estes algoritmos trabalham de uma forma lenta e poderão não ter resposta/solução para determinados problemas que possam existir. Põem-se então a questão : “ Quando devem ser estes algoritmos utilizados ?”

Uma resposta possível é : “ Os algoritmos evolutivos nunca são a melhor solução, no entanto são sempre a segunda melhor solução”, ou seja, estes algoritmos são considerados úteis quando :

- O espaço de pesquisa é demasiado grande e complexo para se utilizar os outros métodos de pesquisa;

- Não é necessário uma solução óptima, apenas uma solução aceitável;

- Temos capacidade computacional para implementar o algoritmo paralelamente. Estes algoritmos podem ser descritos de forma muito reduzida:

1. População inicial 2. Seleção 3. Emparelhamento 4. Crossing-over 5. Mutação 6. A solução é suficientemente boa?

(a) Se sim, termina. (b) Se não, volta a 2.

Passando agora para Pesquisa Adversarial. Nos casos apresentados anteriormente, o nosso objetivo era apenas ter o melhor

valor possível, sem qualquer obstáculo, o que nem sempre se assemelha à realidade. Vamos tomar como exemplo casos de competição em que podemos ter adversários

que nos querem dificultar a vida. Neste caso os algoritmos apresentados anteriormente deixam de funcionar pois, a cada movimento/passo os estados possíveis deixam de ser iguais de acordo com interesses dos adversários.

Vamos utilizar como “problema de estudo” um tipo muito restrito de jogos, nomeadamente jogos de soma-nula (se o jogador 1 vai para um estado mais favorável, o jogador 2 vai para um estado mais desfavorável), com informação perfeita e determinísticos. - Minimax. (Utilizado para este tipo de problemas.)

Em teoria, este algoritmo funciona da seguinte forma: a cada um dos estados finais

associa-se um valor (por exemplo, 1=vitória, 0=empate, -1=derrota), que depois é propagado para os estados predecessores tendo em conta as possíveis jogadas do

Inteligência Artificial - Algoritmos 12/19

adversário de forma a saber a que valor um estado nos pode levar.

Para simular o nosso comportamento e o do adversário, este algoritmo associa um

tipo a cada nível da árvore de pesquisa ( que representa o turno de um jogador) : minimizador ou maximizador , sendo que o valor de cada estado é escolhido tendo em conta esta função.

O funcionamento do algoritmo é o seguinte :

1. Se a profundidade limite tiver sido atingida ( ou for um estado final), o valor do nó é calculado através da heurística;

2. Se o nível for maximizador, aplica-se o minimax a cada um dos sucessores e o valor do nó passa a ser o maior valor dos sucessores

3. Se o nível for minimizador, aplica-se o minimax a cada um dos sucessores e o valor do nó passa a ser o menor calor dos sucessores;

No exemplo, o jogador apenas pode empatar, sendo que o jogo decorrerá da seguinte maneira:

- O jogador joga para a esquerda (Se jogar para a direita, arrisca-se a perder); - Se o adversário jogar para a esquerda perde (1), logo joga para a direita, para

garantir o empate.

- Minimax com Alpha-Beta Pruning

Analisando o exemplo da figura 3.1, podemos verificar que um dos teste podia ter

Inteligência Artificial - Algoritmos 13/19

sido cortado, evitando cálculos desnecessários. O Alpha-Beta Pruning baseia-se então nessa capacidade de fazer cortes, de forma a

reduzir o espaço de pesquisa. Para isso, passa-se a ter uma variável alpha, que representa a melhor jogada que o jogador maximizante já assegurou, e uma variável beta, que representa a melhor jogada que o jogador minimizante já assegurou. Sendo assim aqui fica a representação gráfica deste novo algoritmo: É assim representada de forma resumida a sequência lógica que o algoritmo segue :

1. Se a profundidade limite tiver sido atingida (ou for um estado nal), o valor do nó é calculado através da heurística;

2. Se o nível for maximizador, enquanto alpha<beta e para cada sucessor: (a) Aplica-se o minimax ao sucessor (passando-lhe o valor actual do alpha

e do beta); (b) Atualiza-se o alpha deste nó com o máximo entre o alpha anterior

e valor do sucessor; (c) Se alpha<beta, o seu valor é o melhor valor dos sucessores. Se não,

o valor é alpha (corte beta).

3. Se o nível for minimizador, enquanto alpha<beta e para cada sucessor: (a) Aplica-se o minimax ao sucessor (passando-lhe o valor actual do alpha

e do beta); (b) Actualiza-se o beta deste nó com o mínimo entre o beta anterior e

valor do sucessor; (c) Se alpha<beta, o seu valor é o melhor valor dos sucessores. Se não,

o valor é beta (corte alpha). Uma otimização que pode ser feita a este método é a chamada killer heuristic, que consiste em ordenar (ou, pelo menos, tentar ordenar) os nós da árvore de pesquisa por ordem crescente nos níveis maximizantes e ordem decrescente nos níveis maximizantes.

- Negamax

O algoritmo Negamax é bastante semelhante ao algoritmo minimax, tendo apenas como diferença, a forma como trata os níveis. É então declarando todos os níveis como

Inteligência Artificial - Algoritmos 14/19

maximizantes que o negamax corre o seguimento lógico. No entanto, entre cada nível, inverte o sinal dos valores.

Isto é só uma questão de implementação, para permitir que o algoritmo funcione sem ter de saber em que nível está, não tendo praticamente nenhuma influência no desempenho.

Inteligência Artificial - Algoritmos 15/19

2.1.3 Principais Desafios

Na realidade os problemas que enfrentamos na construção de sistemas de inteligência

artificial não ficam fora de controlo em termos de tamanho de problemas para os módulos

individuais - em particular com os sistemas baseados em comportamento, a maioria dos

sub-módulos só precisam de lidar com problemas de tamanho limitado. Há outros caminhos

que a teoria podia ter seguido. Por exemplo pode tentar chegar-se a uma teoria da

computação baseada na divergência que pode existir em programas, dado um erro de um

bit tanto no programa como na representação de dados. Se a teoria fosse baseada nesta

preocupação fundamental, podíamos começar a entender como fazer programas mais

robustos.

A compreensão das emoções por robôs é também um dos desafios da inteligência

artificial para facilitar a comunicação entre os mesmos e o homem.

A reprodução de emoções por parte de sistemas inteligentes é uma meta a alcançar pois

permite uma maior aceitação por parte do ser humano que tem tendência a desconfiar de

personalidades frias e com apáticas.

As questões éticas não podem ser deixadas de fora, especialmente agora que muitas

máquinas autónomas serão lançadas no quotidiano das pessoas, devido à domótica, carros

automatizados, entre outros avanços.

A dificuldade para desenvolver um sistema capaz de pensar por si e não se limitar a ações

pré-programadas, pois um algoritmo de natureza demasiado complexa para a que o homem

consegue programar atualmente. Apesar de já ter estado mais longe.

Muita investigação ainda tem de ser realizada para se conseguir ultrapassar as

dificuldades anteriormente sugeridas.

A escassez de algoritmos desta área, que acabam por ser uma consequência dos

desafios apresentados.

Inteligência Artificial - Algoritmos 16/19

3. Software proposto

A indústria dos videojogos movimenta, anualmente, milhares de milhões de dólares, e

portanto, pode revelar-se um ótimo mercado para introduzir um novo produto que satisfaça

algumas necessidades atuais.

Nos últimos anos, a qualidade desta forma de entretenimento tem melhorado a uma

velocidade vertiginosa, principalmente no registo gráfico, cuja procura incessante pelo

fotorrealismo tem sido o motor desta evolução.

No entanto, há componentes que ainda ficam aquém das expectativas e dos desejos de

milhões de jogadores por todo o mundo, nomeadamente, as personagens controladas pelo

computador, também conhecidas como “bots”.

Propomos a criação de um algoritmo que seja capaz de processar grandes quantidades de

informação relativa à jogabilidade de pessoas por todo o mundo e de aprender, de uma

forma modelada pela experiência humana, a exibir comportamentos mais semelhantes aos

que seriam esperado de uma pessoa. Deste modo, os videojogos proporcionarão uma

experiência mais realista e desafiante para todos os jogadores.

Inteligência Artificial - Algoritmos 17/19

4. Conclusões

Com a realização deste trabalho, foi nos possível concluir que os algoritmos de

inteligência artificial ainda estão muito aquém daquilo que se pretende. Ainda são muito

simples e a natureza complexa a que estão associados por sua vez faz com que o seu

desenvolvimento seja muito lento. No entanto, os progressos existem e estamos muito

confiantes que o desenvolvimento destes algoritmos cada vez evolui mais depressa, tal

como podemos constatar pelas descobertas nos últimos anos.

É possível compreender através da larga pesquisa efetuada, que há diversos algoritmos

aplicados a este tema que é a Inteligência artificial, apesar da sua complexidade, foi possível

compreender certos aspectos que os fazem diferir de outros.

Inteligência Artificial - Algoritmos 18/19

Referências bibliográficas

Russel, Stuart J. e Peter Norvig, 1994, Artificial Intelligence: A Modern Approach, Prentice Hall Clocksin, W.F. and C.S. Mellish. 2003. “Programming in Prolog. Using the ISSO Standard (5th edition)”. Springer-Verlag. ISBN: 978-3-540-00678-7 Michael R. Genesereth, Nils J. Nislsson. 1987. “Logical Foundations of Artificial Intelligence”. Morgan Kaufman Publishers Ronald Brachman, Hector Levesque. 2004. "Knowledge Representation and Reasoning". Morgan Kaufmann Mark Stefik. 1995. Introduction to Knowledge Systems”. Morgan Kaufmann http://research.microsoft.com/en-us/um/people/horvitz/seltext.htm http://www.scriptol.com/programming/list-algorithms.php https://en.oxforddictionaries.com/definition/artificial_intelligence http://www-formal.stanford.edu/jmc/whatisai/node1.html https://pt.wikipedia.org/

Inteligência Artificial - Algoritmos 19/19