Pular para o conteúdo principal

Gerar Horário — timetable-generator

O timetable-generator é o solver de otimização do Ladesa. Ele recebe solicitações de geração de horário via fila RabbitMQ, aplica constraints de programação por restrições (CP-SAT), e retorna a grade otimizada.

Stack

TecnologiaVersãoPapel
C#Linguagem
.NET9.0Runtime
Google OR-Tools CP-SATSolver de constraint programming
RabbitMQ.Client7.xConsumo de mensagens
Polly8.xResiliência (retry, circuit breaker)
ASP.NET CoreWorker service + health checks

Como funciona

  1. A API (management-service) envia um GenerateRequest para uma fila RabbitMQ
  2. O solver consome a mensagem e monta o modelo CP-SAT com as constraints
  3. O solver executa a otimização e retorna um ServiceGenerateResponse pela fila
  4. A API recebe a resposta e persiste a grade no banco de dados

Constraints implementadas

O solver aplica restrições como:

  • Não alocar dois professores na mesma sala/horário
  • Respeitar indisponibilidades (PRD) dos professores
  • Agrupar aulas germinadas conforme preferências
  • Respeitar limites de turnos por dia por professor
  • Validar disponibilidade de ambientes (integração com SISGEA)

Para detalhes completos, veja Constraints do Solver.

Estrutura do projeto

timetable-generator/Ladesa.TimetableGenerator.v1/
├── Core/ # Lógica central do algoritmo
├── Core.Test/ # Testes unitários
└── Service/ # Worker service + API

Como rodar

# Rodar o solver
dotnet run --project Service

# Rodar testes
dotnet test

Requer RabbitMQ rodando. O docker-compose.yml na raiz do repositório sobe o RabbitMQ automaticamente:

docker compose up -d message-broker

Contrato de mensagens

O contrato entre a API e o solver é definido em TypeSpec e publicado como pacote NuGet (Ladesa.Messages.TimetableGenerator.V1). Veja Contrato do Solver.