Descrição do Problema — Sistema de Recomendação Colaborativo

Data de Publicação

10/03/2026

Data de Modificação

10/03/2026

Introdução

O objetivo final do trabalho é implementar um Sistema de Recomendação Colaborativo.

Para alcançar esse objetivo, o problema será dividido em três fases de complexidade crescente.

A implementação principal será desenvolvida no paradigma Orientado a Objetos (Java).
Posteriormente, versões reduzidas do problema serão implementadas explorando:

  • Programação Lógica (Prolog)
  • Programação Funcional (Lisp)

Fase 1 — Aquecimento e Consultas

Nesta fase inicial o objetivo é familiarizar-se com a sintaxe e as estruturas de dados básicas de cada linguagem.

Estrutura de Dados

Desenvolvimento Local (CSV)

Durante o desenvolvimento na sua máquina, você poderá ler diretamente os arquivos CSV fornecidos.
Isso facilita o debug da lógica principal.

Base pequena

Base grande (teste de performance para Java)


Avaliação no Juiz Online

Na submissão para o Juiz Online, o programa deve ler os dados via Entrada Padrão.

ImportanteLeitura obrigatória via STDIN

O método main deve ler os dados utilizando:

  • System.in
  • Scanner
  • ou BufferedReader

Formato da Entrada

A entrada será injetada no seguinte formato:

  1. Dois inteiros:
    \(F\) — número de filmes
    \(A\) — número de avaliações

  2. \(F\) linhas contendo: id,titulo,generos,diretor,ano

  3. \(A\) linhas de avaliações: usuario,id_filme,nota (onde a nota varia de 1 a 5)

  4. Linhas de Comandos das respectivas Fases sendo testadas.

Simulação do Juiz no Terminal

Você pode simular o juiz online no seu terminal executando sua classe compilada e redirecionando um arquivo de teste:

java Main < meuteste.in

Funções/Predicados a Implementar

  1. filmes_por_genero(Genero): Retorna todos os filmes de um dado gênero.
  2. filmes_de_ano_superior(Ano): Retorna filmes lançados após o ano dado.
  3. notas_do_usuario(Usuario): Retorna todas as avaliações feitas por um usuário.

Fase 2: Lógica Intermediária e Regras de Negócio

Aqui começamos a processar listas e aplicar lógica agregada.

Funções/Predicados a Implementar

  1. media_avaliacoes(Usuario): Calcula a média das notas dadas por um usuário.
  2. usuario_hater(Usuario): Retorna Verdadeiro se o usuário tem mais notas 1 do que notas 5.
  3. filmes_nao_avaliados(Usuario): Retorna a lista de todos os filmes que o usuário ainda não avaliou.
  4. diretores_comuns(Usuario1, Usuario2): Retorna a lista de diretores que ambos os usuários avaliaram (independente da nota).

Fase 3: O Sistema Colaborativo

O desafio final. Aqui implementamos a “Inteligência” do sistema, usando interseção de conjuntos e regras globais de exclusão.

Lógica do Algoritmo

  1. Similaridade: Dois usuários são “Vizinhos” se avaliaram os mesmos filmes (interseção \(\ge 1\)) e ambos deram nota alta (\(\ge 4\)).
  2. Candidatos: Filmes que os Vizinhos deram nota \(\ge 4\) e que o Usuário Alvo não avaliou.
  3. Regra de Ódio (Exclusão): Se o Usuário Alvo deu nota 1 para qualquer filme de um diretor, remova todos os filmes desse diretor dos candidatos. ### Função Principal
  • recomendar(Usuario): Retorna a lista processada e filtrada de recomendações.
    • Nota: Na implementação em Java, esta lista final deverá obrigatoriamente ser ordenada usando múltiplos critérios (explicados no guia de Java).

Variação Dinâmica do Motor Colaborativo

Na Fase 3, o seu Sistema de Recomendação não deve ser engessado. Para provar que seu algoritmo e a modelagem Orientada a Objetos são robustos, o Juiz Online fará consultas alternando a própria definição matemática de “Vizinho” e “Candidato”.

Seu código deve possuir suporte nativo para processar os 3 tipos de comando RECOMENDAR {ALVO} {TIPO}, onde TIPO será um dos três comportamentos abaixo:

  • RESTRITO: Só são considerados vizinhos os usuários que avaliaram os exatos mesmos \(N \ge 3\) filmes e deram nota \(\ge 4\) para ambos. Apenas os filmes desses vizinhos entram como Candidatos.
  • TOLERANTE: Dois usuários são vizinhos se avaliaram pelo menos 1 filme em comum (independente da nota). No entanto, a lista de Candidatos só pode conter filmes que esses vizinhos deram nota exatamente igual a 5.
  • ESPECIALIDADE: Só são considerados vizinhos os usuários que deram nota \(\ge 4\) em pelo menos um filme do Gênero favorito (que o alvo tem mais avaliações) do Usuário Alvo.
De volta ao topo