Imagem de um peixe, símbolo do cristianismo
Menu

Escolhedor de Tarefas Seminário

Link do repositório: https://github.com/PHGodoyCosta/Escolhedor_tarefas_seminario

Typescript
TypeORM
SQL

⛪ Vida no seminário

Tudo começou no Seminário São Vicente Pallotti 😁 Atualmente sou seminarista e estou na fase chamado: Postulado. É o primeiro ano da formação, estamos morando no seminário em Palotina/PR.

Vivemos em uma casa com 10 seminaristas e 3 padres, temos uma rotina toda regrada e disciplinada entre estudos, orações e trabalhos. Dentre os trabalhos, temos os internos e os externos: internos são os de dentro de casa como: Arrumar a mesa, lavar louça, bater o sino nos horarios, ficar na cozinha, preparar momentos de oração, coordenar as laudes... E os externos são a horta, cortar o gramado, limpar o seminário e capela, e por ai vai...

E foi em meio a esses trabalhos que surgiu a ideia para esse projeto 😄

Os serviços internos trocam a cada semana e os externos trocam a cada mês, quem escolhe os cargos é o coordenador geral que é eleito e troca a cada mês.

🕵️‍♂️ Um problema para resolver

Alguns serviços (principalmente dentre os internos) são mais pesados de se fazer e outros mais leves. Por isso é interessante uma boa distribuição entre os coordenadores, o que é muito difícil kkkkk. Porque a cada semana ele precisa lembrar de 10 cargos em pelo menos 4 ou 5 semanas passadas e várias foi o coordenador passado que escolheu, com tempo é inviável e impossível humanamente fazer a escolha perfeita.

Então eu pensei, e se montasse um algoritimo para fazer essa escolha? É a melhor forma, só que na mesma hora tambem pensei: Como vou fazer isso? kkkkk

Porque parece um problema simples, mas definitivamente NÃO É, acreditem kkkkk

Nós precisamos distribuir X trabalhadores (porque a quantidade de seminaristas pode e sempre varia com a saída de alguns que não encontram sua vocação) para Y trabalhos (que podem mudar a quantidade de trabalhadores, e cada trabalho tem uma necessidade diferente de trabalhadores, uns precisam de 1, outros 2, 3 e por ai vai).

🤖 Algorítimo Húngaro

Procurei por alguma solução na internet e dei de cara com o Algorítimo Húngaro, uma solução matemática sofisticada que resolve o Problema de Atribuição, encontrando as correspondências de peso máximo (e mínimo, que é o nosso caso) em grafos bipartidos.

Uma solução muuito complexa (pelo menos para a minha matemática atual ksks), que dediquei um tempo para entender.

🧑‍💻 Funcionamento do código:

O Algorítimo é alimentado com uma matriz de pesos para cada trabalhador-trabalho. Então pensemos no queremos fazer...

Quero que ele escolha o trabalhador que trabalhou por menos tempo na tarefa, e que está a mais tempo sem ser escolhido para aquele serviço, para isso, atribui duas variáveis para isso:

T: Quantas vezes trabalhou na tarefa. D: Distância em ciclo de escolhas da ultima vez trabalhado naquela função.

E com base nisso eu crio um PESO

// OBS... Adaptei essa parte do código para fins didácos, não está exatamente assim no repositório.

const PESO_T = 10
const PESO_D = 20
const MAX_D = 4

const cost = jobberForJob.t * PESO_T + (MAX_D - jobberForJob.d) * PESO_D;

Criei essas constantes de PESO (T e D) para dar uma preferência a não escolher um trabalhador duas semanas seguidas para a mesma tarefa, não sei dizer se são os melhores valores, ainda estou testando, mas escolhi de forma aleatória, apenas com a intenção de criar uma proporção 1:2.

Já a constante MAX_D serve para fazer com que um trabalhador recém inserido receba preferência maior de trabalho do que um já inserido no sistema a mais tempo. Porque o algoritimo deixa D=0 para trás na "fila de preferência".

Resultado

Por enquanto ainda não fiz nenhuma interface porque sou eu mesmo que uso 😂

Então optei por ver o resultado em console.log() mesmo

Mas um dos motivos de eu ter escolhido TypeScript, é porque inicialmente pretendia desenvolver em React + Electron um App para ser usado no seminário para os futuros seminaristas não matarem o coordenador dizendo: "Eu na cozinha de novo?!" 😂

Tecnologias e repositório

Repositório: https://github.com/PHGodoyCosta/Escolhedor_tarefas_seminario

TypeScript TypeORM SQLite

Encerramento

O programa ficou muito bom, resolveu o problema da distribuição e deixou a vida do coordenador um pouco mais fácil ksksk.

Este mês (Junho/Julho 2025) eu era o coordenador e agora estamos de férias, mês que vem quando voltarmos (Agosto/2025) vou testar a adesão entre os outros...

De toda forma fico muito feliz de poder usar a tecnologia para resolver problemas do dia, poder usar a programação para melhorar a vida das pessoas, criar soluções que tragam qualidade de vida... Isso não tem preço