Programação

  • A discussão sobre Inteligência Artificial

    Benvindos ao curso de Inteligência Artificial

    O objetivo principal da disciplina é introduzir os elementos básicos da Inteligência Artificial e da sua relação com a inovação, especialmente no quando esta está ligada a automação de processos, serviços e sistemas. Teremos uma abordagem conceitual da IA, combinando teoria e prática referentes à inteligência de máquina e ao desenvolvimento de sistemas baseados em conhecimento. Discutiremos as diversas formas de representação de conhecimento mas focaremos nas regras de produção, base de dados (na forma de fatos ou acoplado ao sistema inteligente).  A dinâmica destes sistemas é baseada em regras de inferência. técnicas de busca e nos métodos computáveis de resolução de problemas, sintetizados nas técnicas planejamento inteligente e planejamento automático.  

     

    As aulas presenciais serão na sala A-05, prédio da Engenharia Mecânica, Naval e Mecatrônica.

  • Introdução



    Começaremos com uma discussão sobre inteligência e seus pressupostos, para delimitar expectativas e dimensionar corretamente o que se pode esperar dos sistemas inteligentes.  Estamos em uma época marcada por um "corte epistemológico" entre sistemas funcionais e sistemas flexíveis e interativos (inteligentes) associados às diversas áreas do conhecimento. Portanto, é importante separar claramente o que se chama de "digital mind" ou inteligência computacional - que pode ser inserida em algoritmos eminentemente procedurais - dos métodos baseados em conhecimento. Faremos um breve histórico sobre o interesse acadêmico e global na inteligência, na sua reprodução por máquinas e sistemas, para introduzir o conceito de agente inteligente, fundamental para a inteligência de máquina, embarcada ou distribuída. 

    O curso está dividido em uma parte teórica e uma parte prática.  A parte prática envolve o desenvolvimento de pequenos programas em Programação Lógica, e será feita no ambiente SWISH Prolog. O sistema pode ser baixado do link https://www.swi-prolog.org ou usado online via browser.  O objetivo é entender as diferenças entre a programação procedural, feita por exemplo em Python e a programação lógica e como seria o desenvolvimento de sistemas baseados em conhecimento. O objetivo não é se aprofundar em programação lógica mas deixar clara a diferença entre o desenvolvimento de sistemas procedurais com inteligência computacional e sistemas inteligentes.  


  • Agentes inteligentes



    Telemedicina: um novo desafio para a IA


    Antes de tratar da resolução de problemas usando IA, precisamos identificar os agentes responsáveis por este processo. Este tópico significou um divisor de águas no desenvolvimento da IA e na sua relação com os sistemas automatizados. O conceito de agentes, especialmente agentes inteligentes e seus diferentes tipos é essencial para termos uma referencia sobre o design de sistemas automatizados dotados de inteligência artificial. O ciclo de automação consiste do conhecimento sobre o ambiente sobre o qual se aplica a automação (environment),  sobre os estados que pode atingir, sobre a dinâmica dos processos que alteram os estados do ambiente (apenas uma ou uma sequencia de ações).  A "inteligência" do sistema (computacional ou artificial) consiste na escolha adequada das ações de modo a responder a uma demanda do environment, da manutenção de um modelo, da mudança para um dado estado objetivo ou para a manutenção de um serviço. A aplicações são bastante diversificadas e vão desde a manufatura inteligente aos serviços - incluindo o apoio aos processos educacionais. 

    Nesta aula vamos tratar prioritariamente da identificação e classificação dos agentes.

    • slides da Aula2

    • Defina com os seus colegas um grupo de até quatro integrantes e poste nesse link a definição do grupo com os respectivos nome e número USP. Só um membro do grupo precisa fazer o upload do documento.

      Vocês podem rever a formação dos grupos até a próxima sexta, mas busquem otimizar o número de grupos, evitando ter menos de três alunos por grupo. Submetam a formação dos grupos em arquivo PDF.

  • Agentes inteligentes e métodos para resolução de problemas



    Um comportamento considerado inteligente por todos é a capacidade de resolver problemas. Portanto, vamos nos preparar para trabalhar com agentes que interagem e com o seu environment de diferentes maneiras e podem resolver diferentes classes de problemas . O "agent program" faz com que um agente assuma um certo tipo de comportamento e com isso interaja com o environment deve ser substancialmente diferente de um algorítmico procedural, e devemos usar programação lógica (Prolog) para marcar essa diferença, ainda que na prática, para sistemas de maior porte, seja necessário ter um tratamento diferente.  Portanto, nessa aula vamos rever o comportamento dos agentes - dentro da abordagem moderna proposta pelo livro texto - e também algumas noções básicas de Prolog que permitirão fazer os primeiros exercícios. 

  • Algoritmos de Busca não-informada




    Uma maneira de abordar a resolução de problemas por máquinas é seguindo o paradigma estado transição, e, uma vez obtido o espaço de estados,  escolher um desses estados como ponto de partida e outro a solução desejada, para então usar os métodos de busca e traçar um caminho que liga o estado inicial ao estado final. Quando não existe uma análise do espaço de estados que possa resultar em heurísticas e/ou propriedades que possam orientar a busca, dizemos que se trata de uma "busca cega", e esta pode ser feita usando algoritmos de busca já conhecidos, como a busca em profundidade ou largura.  Nesse caso, nenhuma informação sobre a natureza do estado ou sobre a escolha dos caminhos (geralmente em uma estrutura de árvore) precisam ser considerados. Por outro lado, esses algoritmos podem ser implementados usando programação procedural, e constituem inteligência computacional. Por outro lado, essa estrutura computacional nos dá uma base para inserir informação no processo de busca, como as heurísticas, transpondo o limite do procedural. 

    Para trazer esses algoritmos para a programação lógica precisamos tratar das estruturas de dados em Prolog. Vamos inserir a estrutura de listas e com ela representar árvores e grafos direcionados. Um programa simples de roteamento de trajetória pode ser feito sobre esta base.

    Como leitura suplementar acrescentamos um artigo de Allen Newel e Herbert Simon sobre as diferenças entre "Human Problem Solving and Machine Problem Solving". 


  • Algoritmos de Busca Informada




    Na aula passada discutimos conceitualmente as estratégias de resolução de problemas por humanos e máquinas, com o objetivo de fazer uma clara distinção entre os dois processos e deixar claro as limitações da máquina (no caso o computador no seu modelo von Neuman sequencial) para tratar de processos normalmente associados a humanos. A proposta de ter um método geral para resolução de qualquer problema (que discutiremos mais detalhadamente nas próximas aulas) está ligado a esta referência (humana) e é uma discussão antiga, como vimos no histórico das primeiras aulas. No momento, o nosso foco é com os métodos clássicos baseados em busca, saindo da busca cega (que pode ser implementada con inteligência computacional) para a introdução de heurísticas e conhecimento tácito. 

    Os algoritmos serão apresentados usando como exemplo jogos como o 8-puzzle e os sistemas de roteamento de veículos, tratados de uma forma muito simples e direta. 


  • Algoritmos de Busca Informada



    O nosso próximo passo é aplicar heurísticas e a função de avaliação aos algoritmos de busca, gerando um processo de busca informada. Passaremos pelo Best-First, Greedy Best-First e A*. O objetivo, como vimos na aula passada, é melhorar a performance destes algoritmos, estimada em O(bd), reduzindo o coeficiente "d" associado à profundidade da árvore de busca. Esta é a primeira abordagem para resolução automática de problemas, bem próxima dos métodos procedurais. 

    Para implementar uma solução veremos a base do algoritmo de busca, baseada na referência do livro Artificial Intelligence: a New Synthesis, de Nils Nilsson, e sobre esta base vamos inserir as heurísticas como forma de priorizar a busca. Portanto, sobre a mesma base podemos gerar diferentes algoritmos e esse será o objetivo do primeiro exercício programa.

  • Sistemas Baseados em Conhecimento




    Resumindo o que vimos até aqui sobre resolução de problemas usando Inteligência Artificial, podemos estabelecer uma linha evolutiva e histórica que talvez explique a sucessão de diferentes surtos de popularidade desde a criação o termo Inteligência Artificial em 1956.  Desde o inicio deste processo existiram 3 grandes booms da IA: o primeiro foi marcado pelos métodos e algoritmos de busca com um foco notadamente cognitivo. Embora o aprendizado de máquina estivesse presente, especialmente nos programas para jogar damas, dependia muito de capacidade de processamento, e parte da comunidade da época apostava na evolução do trabalho do Marvin Minsky sobre os neurônios artificiais. O segundo boom foi nos anos 80, basedo nos sistemas especialistas. Nessa época se propagou a demanda de aplicaçã de sistemas inteligantes em processos práticos, especialmente o roteamento de veículos, processos quimicos, sistemas de diagnóstico, etc.  Havia ainda um gargalo na capacidade de processamento, mas justamente nessa época surgiram as "workstations" para ampliar a capacidade dos PCs correntes provendo uma quantidade substancialmente maior de memória RAM.

    • Slides da Aula7

    • Artigo de revisão sobre aplicações modernas de sistemas especialistas. No caso específico na montagem de uma biblioteca digital, substituindo as bibliotecas convencionais. 

    • Demo de um sistema de triagem e diagnóstico médico feito com base em IA, estatística e interface com linguagem natural. 

    • Faça o upload do seu exercício-programa: uma arquivo em PDF com a análise e comparação da execução do algoritmo com R=0 e depois com R=1 e W=1, e também o link pra o SWISH Prolog onde está o programa feito pelo seu grupo. Apenas um membro do grupo precisa submeter o exercício, mas por favor lembrem de colocar o nome do grupo todo.

    • Poste a sua dúvida sobre o exercíciop-programa

  • Sistemas Especialistas em Automação




    Nesta aula vamos voltar a nossa atenção para a aplicação dos sistemas e agentes inteligentes em sistemas de automação. Temos uma abordagem preliminar para resolução de problemas com agentes inteligentes, baseado em sistemas de busca heurística e já começamos a discutir os sistemas baseados em conhecimento, usando conhecimento tácito e explícito (os sistemas especialistas). As aplicações para esse tipo de sistema têm características bem definidas, como os sistemas logísticos, de diagnóstico, assistivos e outros, e a abordagem deve portanto ser genérica.

     

  • Agentes Lógicos




    O primeiro "boom" da IA está associado à resolução de problemas usando técnicas de busca e busca informada ou heurística. Vamos passar ao segundo "boom", baseado em sistemas lógicos, ou sistemas que trabalham sobre bases de conhecimento. Historicamente o período desse segundo "boom", os anos 80, coincidiu também com uma difusão da IA para aplicações comerciais e industriais, criando também uma grande expectativa por resultados.  Para explorar esse tipo de aplicação precisaremos entender como funciona uma máquina de inferência. Existe uma aboradagem formal para isso, mas tentaremos chegar a um bom entendimento do processo sem seguir esse formalismo (o livro texto traz uma descrição mais formal), mas também sem atropelar o formalismo.  Tarefa muito difícil!


  • Representação de conhecimento

    What is Knowledge Representation in AI? | Different Techniques | Edureka


    Nesta aula vamos discutir as formas de representação de conhecimento usados em sistemas baseados em conhecimento, concentrado o uso prático nas regras de produção, usando cláusulas de Horn. O desenvolvimento de sistemas inteligentes e de inteligência de máquina passam pela eliciação e representação do domínio do especialista - o ambiente sobre o qual atuará o(s) agente(s) inteligente(s) - para compor a base de conhecimento. A definição do domínio especialista e do domínio de conhecimento é geralmente feita por um Engenheiro de Conhecimento (existem profissionais certificados na área). O próximo passo seria a formalização desse processo compondo a base de conhecimento em uma forma de representação que se adeque à aplicação. Na fase de design o Engenheiro de Sistemas deve compor a base de conhecimento e outras bases de dados parâmetros e possíveis formas de percepção que devem fornecer input para a máquina de inferência e definir com o Engenheiro de conhecimento como alimentar essa máquina de inferência. Finalmente o comportamento do sistema inteligente é inserido em uma jornada do usuário que foi objeto do planejamento inicial da aplicação (requisitos). 

    Falaremos também sobre as opções de linguagem e sobre a fusão da linguagem Prolog com Java, C, e especialmente com Python.


    Redefinimos o nosso cronograma de atividades até o final do semestre, e também os prazos de entrega dos próximos exercícios-programa. 





  • Design de Sistemas Especialistas


     

    Uma vez escolhida a forma básica de representação de conhecimento (entre as que foram apresentadas na aula passada), temos agora de investigar como desenvolver um sistema especialista, passando pelas fases essenciais do processo de design. Na aula passada já apresentamos um roteiro de montagem de arquitetura em quatro fases, destacando o papel do usuário (modelado como receptor e alvo do processo), do especialista no domínio (de onde se deverá extrair as heurística e o conhecimento tácito), do engenheiro de conhecimento (que deve montar a base de conhecimento de modo a atender a demanda da fase 1), e o engenheiro de sistemas (que deve cuidar do processo como um todo, incluindo perceptrons, tratamento dos dados de entrada, interface, acoplamento com a máquina de inferência ou extensão desta, e do fechamento da jornada do usuário com o feedback apropriado). 

    Os elementos da equipe devem passar por todas essas fases em momentos distintos para que possamos atingir os objetivos didáticos. Portanto a identificação de papeis distintos não implica na "distribuição" destas atividades.

    ===========================================================================

    O exercício-programa com um sistema especialista para a matrícula dos alunos de Engenharia Mecatrônica no terceiro semestre deve ser entregue na próxima aula, quarta-feira, dia 8/11, à meia-noite. 

  • PLanejamento Automático

    Defining the problem is the important first step in planning - Cutting Edge  PR Insights


    Devido ao rearranjo do cronograma, vamos concluir a discussão sobre os mecanismos de inferência, sem um aprofundamento maior que incluiria o modelo de unificação/resolução usado em programação lógica.  Com essa conclusão sucinta vamos fazer a passagem para os agentes baseados em objetivo e para a terceira fase da disciplina, onde o foco seria o planejamento inteligente (AI planning).

    O objetivo é caracterizar os conceitos que envolvem um problema de planejamento automático (inteligente), o que embasará a busca por métodos de resolução de problemas, ou pelo menos de uma classe especial de problema: os problemas de planejamento. Existem várias aplicações práticas para essa abordagem, mas vamos concluir com um problema modelo, que dará a base intuitiva para a proposta de um algoritmo para planejamento automático: o problema do mundo de blocos. Este será também o foco do nosso terceiro exercício-programa.

  • O Algoritmo STRIPS




     Nesta aula vamos introduzir a base conceitual do planejamento automático,  independente de domínio, isto é, uma abordagem geral para a resolução de problemas (em IA). O ponto mais importante é a relação entre os processos de planejamento e a modelagem do domínio baseada no paradigma estado-transição, aplicada aos sistemas automatizados.  Este conceito é a base para um processo geral de planejamento e resolução de problemas conhecido como STRIPS (Stanford Research Institute Problem Solver). Nesta aula apresentaremos a base deste algoritmo genérico utilizando o problema-modelo do mundo de blocos. 

    O SRI (Stanford Research Institute) se destacou durante os últimos 50 anos na pesquisa em Inteligência Artificial e foi o berço do chamado planejamento clássico. O interesse maior sempre  foi em definir um planejador genérico, independente de domínio de aplicação, que pudesse ser embarcado em sistemas autônomos, como o robô Shakey mostrado na figura acima, criado na década de 70. Novos métodos de planejamento inteligente continuam a ser discutidos hoje em um evento internacional, o ICAPS, um evento anual que reune toda a comunidade de AI Planning e Secheduling.



  • O mundo de blocos



    Na aula passada discutimos de forma bem intuitiva o problema-modelo do mundo de blocos. Hoje vamos generalizar o problema de planning e os conceitos relacionados. O problema do mundo de blocos e sua conceituação simples devem então se encaixar nesse modelo geral pela introdução de reduções e simplificações. Assim, podemos mostrar que estamos ainda no mesmo domínio de problema, mas em uma categoria bem mais simples e mais direta, o que nos permite evitar o tratamento mais formal. A ideia é enfatizar que temos uma classe de problemas que ainda tem uma certa complexidade mas que pode ser minorada pela introdução de uma análise (formal) do espaço de estados, resultando em heurístcas e/ou em um conjunto de regras que compõem uma base de conhecimento (KB). Portanto o nosso desafio é introduzir este KB em um problema simples como o mundo de blocos e evitar algumas situações críticas como a Anomalia de Sussman.

    A anomalia de Sussman foi proposta por Gerald J. Sussman na durante a elaboração da sua tese de doutorado em 1973, orientada por Marvin Mynsky no MIT. Ao contrário da maioria dos grandes pesquisadores citados Sussman está vivo e ainda atuante no CSAIL (Computer Science and Artificial Intelligence Lab) do MIT. O trabalho dele foi importante para mostrar que é preciso um certo cuidado ao implementar planejadores automatizados, especialmente se os estados são percorridos e analisados linearmente.

    Embora seja importante destacar as limitações do STRIPS isso não afeta a sua influência conceitual nos planejadores automáticos atuais. Propostas mais recentes ou são inspiradas no STRIPS, no relaxamento de algumas de suas propriedades, ou das restrições feitas sobre a definição geral dos  problemas de planning para chegar no STRIPS ou no mundo de blocos. Evidentemente, as aplicações práticas são bem mais sofisticadas que esse problema-modelo.



    3o. exercício programa

    O terceiro exercício programa consiste em fazer um planejador para o mundo de blocos. 

    O Mundo de Blocos é  um sistema estado-transição (um T-system) composto por três blocos identificados pelas letras a, b, e c, que podem ser dispostos em diferentes arranjos, como mostrado na aula de hoje. O espaço de estados é finito e, evolui pela aplicação de uma ação provocada por um robô manipulador que, uma vez instanciada com os blocos (ou a mesa) torna-se um operardor responsável pela mudança de estados (o conjunto de eventos é vazio). 

    Faça um planejador (um programa em Prolog) que recebe como demanda o estado inicial e final do mundo de blocos, e, usando o operador move acha um caminho no grafo de estados entre um e outro. O programa deve seguir as seguintes restrições:

    1. estados são representados por uma lista de predicados sobre o posicionamento dos blocos (como visto em aula);
    2. o plano (feito offline) é uma string (uma lista) de operadores que leva do estado inicial ao estado final;
    3. É parte ESSENCIAL do exercício usar conhecimento adquirido pela análise do espaço de estados (mesmo nesse exemplo simples) de modo a aproximar a solução do ótimo e evitar problemas como a anomalia de Susseman. 

    Como sempre a entrega é um arquivo PDF com a descrição básica do algoritmo e o iink para o SWISH Prolog onde está o programa.

    ENTREGAR ATË o dia 13 de dezembro à meia noite VIA e-disciplinas.

  • Planning: aplicações práticas



    Vamos retomar a discussão sobre a definição geral de AI Planning para falar muito brevemente de aplicações práticas e das simplificações a serem feitas para destacar o papel de problemas-modelo como o do mundo de blocos. No caso o principal foco será associar o desenvolvimento de um planejador ao processo de Engenharia de Conhecimento e consequentemente a um projeto de automação. Assim, mostraremos como, para um problema simples, com um espaço de estados muito simples e finito e um transition graph limitado, poderemos, mesmo assim, extrair elementos para uma base de conhecimento capaz de orientar a escolha das ações e também a proximidade da solução do que seria uma solução ótima. Um processo similar é feito em várias aplicações práticas, mas com um grau de complexidade muito maior.

    Além de mostrar o uso da Engenharia do conhecimento associado ao algoritmo STRIPS vamos também trabalhar nas habilidades e criar um algoritmo, isto é, um planejador, nos moldes discutidos na aula passada. Discutiremos parte do código nessa aula e também orientação de como criar o restante desse código. 

    • Deposite o seu exercício-programa em arquivo PDF, onde pode comentar aspectos de design do seu planejador e as escolhas feitas para compor o programa, e também o link para o local onde está depositado o programa. Não será possível admitir links via e-mail, o quadro de notas é composto pelas submissões feitas ao e-disciplinas.

  • Avaliação geral

    Destaque

    O resultado da avaliação está no quadro abaixo, levando em conta os exercícios programa. 

    Avaliação PMR3510

     

    Grupo

    Mile1

    Mile2

    Mile3

    Final

     Grupo 1

    Jefferson Junior Ramirez
    Lucas Borba
    Maria Fernanda Rezende
    Nathan Aguiar Carvalho

     

    9

     

    7

     

    9

     

        8,3

     Grupo 2

    Vinícius Hideki Inomata
    Gabriel Ribeiro de Carvalho
    Gabriel Gelli Checchinato
    Carlos Eugenio Lucas

     

    6

     

    3

     

    8

     

    5,7

     Grupo 3

    Lucas Morais de Souza
    Lucas Song
    Lucas Zago Barreto da Silva
    Roberto Gabriel Gondim Sobral

     

    6

     

    0

     

    9

     

    5

    Grupo 4

     Enzo Klautau Gomes
    ---------------------------------Henrique Gropelli
    Pedro Henrique de Oliveira Lima
    Rafael Augusto Amorim Ribeiro

     


    5,5

     


    7

    6

    -----

    4

    6,1

     

    5,5

     Grupo 5

    Arthur Ferreira Banhos
    Bruno Uchôa Brandão e Silva
    Gianlucca Berardi
    Rayan Luz Ralile

     

    6

     

    7

     

    7

     

    6,7

     Grupo 6

     Enzo Giannoni de Oliveira
    César Ferreira Magnanini
    Enrico Rocha Soares
    Tiago de Lucas Barbosa
    Bruno Tyszler

     

    6

     

    2

     

    7

     

    5

     Grupo 7

    Arthur Daisuke Yamaguchi
    Eduardo Figueiredo Lindemberg
    Felipe Russo Buttler
    Lucas Vilela Spartani de Godoy

     

    4

     

    3

     

    6

     

    4,3

    Grupo 8

    **

    Bruno Rodrigues Chiqueto
    Matheus Rigone Romano

     

    4

     

    7

     

    4

     

    5

    Grupo 9

    Fernando Ferreira Doria
    José Rafael Souza do Nascimento
    Patrick Vignol Baptista
    Raphael de Souza Cibulka

     

    6

     

    8

     

    6

     

    6,7

    Grupo 10

    *

    Alisson Tulino Brito
    Gabriel Emidio dos Santos
    Igor Schroter Salviatto
    Victor Marques de Almeida

     

    0

     

    0

     

    0

     

    0

    Grupo 11

     

    Luan Gustavo de Britto
    Marcos Vinicius Ramos Mulari
    Vitor Amaral Kiguchi
    Arthur Calabresi

     

    7

     

    6

     

    7

     

    6,8

    Grupo 12

    João Gabriel Guimarães Coelho
    Matheus Tierro de Paula
    Jorge Henrique Losso Giglio
    Higor Felipe de Almeida Silva

     

    5

     

    7

     

    9

     

    7

    Grupo 13

    Matheus Dias Coelho Gonçalves
    João Pedro de Baptista Guimarães
    Gustavo Satler Soares
    Tomas Gorescu Caldeira

     

    6

     

    0

     

    6

     

    4

    Grupo 14

    Raphael Akira Okamura Ferro
    Sophia Celine Rafael Alves Pereira
    Vicente Valério Brusamolin
    Willlynston Melendez

     

    9

     

    4

     

    9

     

    7,3

    Grupo 15

    Henrique de Oliveira
    Gabrielly Ferreira Gama
    Leonardo Carvalho Franzin
    Eduardo Marques Terra

     

    5

     

    0

     

    4

     

    3

    Grupo 16

    *

    Lucas Oliveira Santarosa Martins
    Mateus Garcia Dias Duarte
    Vinicius Russel Donadan

     

    3

     

    0

     

    3

     

    2

    Grupo 17

    *

    Felipe Arthur Eckert
    Carlos Matheus Neto

     

    0

     

    0

     

    0

     

    0