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

Data de Publicação

26/07/2026

Data de Modificação

26/07/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 fornecidos no pacote de dados. Ele contém as bases em formato .csv (para Java/Go), .pl (para Prolog), .lsp (para Lisp) e .json (para referência).

📥 Baixar Pacote de Dados Completo (dataset.zip)

O pacote contém:

  • Base pequena: filmes e avaliacoes
  • Base grande (teste de performance para Java): filmes_grande e avaliacoes_grande

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).

3.1 Regra de Variação da Matrícula (Anti-Plágio) - Apenas Prolog e Lisp

Atenção: Esta regra aplica-se exclusivamente às implementações de Prolog e Lisp (pois não passam pelo Juiz Automático). Para Java e Go, siga as validações normais do Juiz Online. (Nota: Devido ao tempo, esta regra foi cancelada e não será cobrada na avaliação).

Para garantir a originalidade das implementações em Prolog e Lisp, cada aluno terá uma regra de filtragem final baseada no último dígito numérico da sua matrícula institucional. Ao gerar os Candidatos a recomendação, aplique o seguinte filtro antes de retornar a lista final:

* Matrícula terminada em 0, 1, 2 ou 3 (Regra de Idade): O filme candidato deve ter a Classificação Indicativa menor ou igual à Idade do Usuário Alvo. (Para filmes com classificação livre, considere o valor como 0). * Matrícula terminada em 4, 5 ou 6 (Regra de Tempo): A duração do filme candidato deve ser menor ou igual a 120 minutos. * Matrícula terminada em 7, 8 ou 9 (Regra de Ano): O ano de lançamento do filme candidato deve ser estritamente maior que 2000.


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 do Usuário Alvo. O gênero favorito é aquele com maior número de avaliações; em caso de empate, utilize a ordem alfabética (A-Z).
De volta ao topo