Executando verificação de segurança...
14

🤖 Como usei o Algorítimo Húngaro para melhorar a distribuição dos nossos trabalhos no seminário

⛪ 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

Matéria no meu Site Portfólio: https://phgodoycosta.com.br/projeto/escolhedor-tarefas-seminario

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

Carregando publicação patrocinada...
3

Nossa, que engraçado. Acabei fazendo quasi a mesmo coisa ontem! No ministério onde eu trabalho, eu programo voluntários pra trabalhar na sala das crianças toda semana. Eu queria fazer justamente (distribuir igualmente) mas existe várias restrições (quando alguém tá de folga, quando alguém voluntaria meio período, não colocando só gringos na sala pra ter alguém que falar português fluente 😆, etc.).

Minha problema é um pouco diferente, então eu formulei o problema como um "Integer Linear Program". O código tá hospedado aqui no Github.

2

Parabéns pelo projeto. A tecnologia foi só um detalhe. O valor está no raciocínio matemático aprendido e aplicado. Se gostou mesmo do tema, recomendo estudar outras técnicas de otimização como Simulated Annealing, Knapsack, N-queens e até algoritmos genéticos que são bons pra alguns problemas de otimização como este.
Bons estudos e que Deus continue te abençoando 🙏