Engenharia · Otimização
Quando uma escala vira matemática
Construindo um motor com CP-SAT: regras humanas, restrições matemáticas e uma decisão que continua sendo de quem usa.
Não era um calendário
Uma escala pronta parece simples: nomes distribuídos em dias e horários. A dificuldade está no caminho até ela. Uma escolha que resolve o plantão de hoje pode eliminar a única combinação viável de amanhã.
Condicionais ajudam a validar situações conhecidas. Escolher uma distribuição que respeite todas as regras ao mesmo tempo exige outra abordagem. Foi aí que o Google OR-Tools, com o solver CP-SAT, entrou no projeto.
Regras viram variáveis
O solver recebe um modelo: variáveis de decisão, restrições e uma função objetivo. Cada combinação entre uma vaga e uma pessoa elegível pode ser representada por uma variável booleana. Para cada vaga, a soma das escolhas deve ser igual a um.
Conflitos de horário, limites de horas e outras condições restringem as combinações possíveis. O solver procura uma solução para o conjunto inteiro. Ele não aprende com escalas anteriores: resolve o modelo matemático que definimos.
Antes do solver, o domínio
Se o domínio já sabe que uma pessoa não pode ocupar uma vaga, não faz sentido criar uma variável para essa combinação. Uma filtragem determinística reduz o espaço de busca e permite explicar motivos de inelegibilidade.
Essa divisão também ajuda a testar. Elegibilidade é uma regra de domínio; a formulação matemática pode ser verificada com entradas pequenas e controladas. Fica mais fácil localizar se uma falha está nos dados, no filtro ou no modelo.
Viável não significa ótimo
Uma solução pode respeitar todas as restrições e ainda concentrar trabalho demais em poucas pessoas. A função objetivo precisa traduzir o que equilíbrio significa naquele domínio, considerando disponibilidades e limites diferentes.
O CP-SAT pode encontrar uma solução viável ou provar a otimalidade para o modelo, dependendo do caso e do tempo disponível. Não é correto prometer que toda escala será sempre ótima.
Quando a resposta é INFEASIBLE
Uma resposta matemática correta pode ser uma experiência ruim se ninguém entende o que fazer depois. Por isso, o diagnóstico de inviabilidade faz parte do produto.
Examinar candidatos por vaga e os motivos que reduziram o conjunto de elegíveis ajuda a apresentar indícios úteis. Um cenário relaxado pode explorar flexibilizações, deixando claro que ele não equivale a uma solução estritamente válida.
Sugestão, não sentença
A saída do motor fica como sugestão editável. Uma pessoa revisa e confirma as atribuições. Matemática não elimina contexto, exceções nem informações recentes que ainda não entraram no modelo.
O motor roda localmente no backend Python e FastAPI, com OR-Tools. React e TypeScript organizam configuração e revisão; MySQL e SQLAlchemy assíncrono cuidam da persistência.
O maior trabalho foi explicar
Chamar o solver foi uma parte do trabalho. Traduzir regras humanas, distinguir o que é rígido ou flexível e explicar por que uma solução não existe exigiu mais cuidado.
A confiabilidade depende do sistema inteiro: backend, dados, interface e revisão humana. Um modelo matemático precisa tornar decisões compreensíveis para ser útil.