Inteligência Artificial

T1 - Algoritmos de Pesquisa

Última ocorrência: 2024-1 em Universidade Lasalle Canoas

Posts Relacionados

Objetivo

Comparar os algoritmos de busca em espaços de resposta, aplicados na busca pelo melhor caminho em um mapa bi-dimensional.

Pré-requisitos

Tarefas

  1. Criar um fork do projeto ia-2024-t1.
  2. Implementar os algoritmos de busca vistos em aula:
    • Busca em profundidade
    • Busca em largura
  3. Implementar os algoritmos de busca com heurísticas vistos em aula:
    • Branch and Bound
    • A*
  4. Implementar o algoritmo de Dijkstra para busca do caminho mais curto em um grafo.
  5. As funções de entrada dos algoritmos devem ser implementadas no arquvivo src/busca.py:
    • Os parametros das funções são:
      • graph: Uma descrição do grafo (que pode ser definida pelo aluno)
      • start: um inteiro representando um nó do grafo
      • goal: um inteiro representando um nó do grafo
    • O retorno das funções deve ser uma tupla contendo, pela ordem:
      • inteiro com o número de nós do grafo analizados.
      • float com o comprimento do caminho encontrado.
      • lista de inteiros representando o caminho de start a goal
    • As assinaturas das funções devem ser:
        def dfs(graph, start: int, goal: int) -> (int, float, [int]):
            """Busca em graph, um caminho entre start e goal usando busca em profundidade."""
      
        def bfs(graph, start: int, goal: int) -> (int, float, [int]):
            """Busca em graph, um caminho entre start e goal usando busca em largura."""
      
        def branch_and_bound(graph, start: int, goal: int) -> (int, float, [int]):
            """Busca em graph, um caminho entre start e goal usando Branch and Bound."""
      
        def a_star(graph, start: int, goal: int) -> (int, float, [int]):
            """Busca em graph, um caminho entre start e goal usando A*."""
      
        def dijkstra(graph, start: int, goal: int) -> (int, float, [int]):
            """Busca em graph, um caminho entre start e goal usando Dijkstra."""
      
  6. Implementar uma função para a leitura de um grafo com a seguinte interface
     def read_graph(filename: string) -> Graph
         """Le a estrutura do grafo a partir de um arquivo."""
    
    • A estrutura do grafo pode ser definida como desejado (recomenda-se listas de adjacências)
  7. O formato do arquivo a ser lido é:
     <número de nós no grafo>
     <nó> <latitude> <longitude>  # repete para cada nó do grafo
     <número de arestas no grafo>
     <nó> <nó> <custo_da_aresta> # repete para cada aresta do grafo
    
  8. Serão fornecidos testes automatizados para a avaliação do trabalho. Os testes podem ser executadosu utilizando o utilitário behave ou o utilitário tox, que podem ser instalados em um ambiente virtual do Python.

Entrega do trabalho

Um único aluno do grupo de alunos que trabalhou na execução do trabalho deverá criar um pull request contra o repositório original do trabalho. O título do pull request é livre, porém o corpo deve conter os nomes completos de todos os alunos do grupo.

Uma vez criado o pull request ele pode ser atualizado a qualquer momento, até a data limite de entrega.

Na data limite, o pull request receberá um label de AVALIADO, um comentário com o resultado da avaliação, será fechado, e não poderá mais ser alterado.

No LEX, todos os alunos do grupo devem inserir, até a data limite, o link para o pull request de entrega do trabalho.

A data máxima de entrega é dia 04 de maio de 2024.

Observações