Skip to content
This repository was archived by the owner on Jul 2, 2025. It is now read-only.

netns/AutoGroup

Repository files navigation

AutoGroup

Note

AutoGroup é um software que gera equipes de forma aleatória levando em consideração as habilidades de cada membro. Assim, evitando que uma única equipe possua muitos membros com habilidades técnicas e as outros com poucos.

License: MIT

Sumário

  1. Introdução
  2. Como utilizar
  3. Como funciona
    1. Primeira forma de distribuição
    2. Segunda forma de distribuição

Introdução

Este projeto foi criado como forma de tornar mais fácil a criação de equipes com membros aleatórios com a garantia de que as pessoas com conhecimento técnico ou habilidades sociais não fiquem concentradas em poucos grupos, mas distribuídas em vários grupos.

Como utilizar

O primeiro passo é preencher o arquivo de configuração (settings.py) com os nomes e a quantidade de pessoas em cada time/equipe:

# quantidade de equipes.
N_OF_TEAMS: int = 5

# A quantidade de pessoas em cada equipe.
TEAM_SIZE: int = 6

# pessoas com conhecimento técnico.
HARD_SKILLS: list[str] = [
    "pessoa 1",
    "pessoa 2",
    ...
]

# pessoas com habilidades em liderança ou comunicação
SOFT_SKILLS: list[str] = [
    "pessoa 1",
    "pessoa 2",
    ...
]

# pessoas com outras habilidades
GENERAL: list[str] = [
    "pessoa 1",
    "pessoa 2",
    ...
]

Warning

Caso a matemática dos grupos estiver errada, podem ocorrer erros. Se, por exemplo, houverem 36 pessoas e essas pessoas forem alocadas em 6 grupos de 5 pessoas, 6 pessoas ficarão sem grupo.


Com isso feito, basta apenas executar o arquivo main.py e ele irá gerar um arquivo YAML (por padrão, o nome do arquivo é teams.yml) com todos os grupos.

Exemplo de arquivo gerado:

equipe 1:
- Vivian Rodgers
- April Whitehead
- Pete Anthony
- Silvia Simms
- Katy McFarland
- Lucille Steele
equipe 2:
- Pat Hahn
- Jorge Hester
- Taylor Delaney
- Darryl Ogden
- Nathan Shaw
- Dianne Shields
equipe 3:
- Brandy Brennan
- Betty Blackburn
- Candy Shea
- Kenny Ewing
- Sally Knapp
- Cameron Mills

Exemplo de arquivo gerado considerando que não havia grupos suficientes para alocar todas as pessoas:

equipe 1:
- Brandy Brennan
- April Whitehead
- Candy Shea
- Roman Hawley
- Katy McFarland
- Terry James
equipe 2:
- Angela Becker
- Pat Hahn
- Taylor Delaney
- Kenny Ewing
- Lucille Steele
- Nathan Shaw
equipe 3:
- Jorge Hester
- Frederick Rice
- Pete Anthony
- Rosa Roberts
- Myra Page
- Beatrice Griffin
remainder:
- Michele McConnell
- Hugh Holland
- Sally Knapp
- Silvia Simms

Important

Todos os nomes foram criados por um gerador aleatório.


Como funciona

Inicialmente, o programa inicia criando um dicionário vazio, no qual a chave é o nome da equipe e o valor é a lista com os membros da equipe:

teams: dict[str, list[str]] = { 
    f"equipe {x+1}": []
    for x in range(N_OF_TEAMS)

}

Note

No índice da equipe adicionamos 1 para que não exista uma "equipe 0".

O código anterior retorna um dicinário neste formato:

{
    'equipe 1': [],
    'equipe 2': [],
    'equipe 3': [], 
    'equipe 4': [], 
    'equipe 5': [], 
    'equipe 6': []
}

O segundo passo é preencher os grupos. Esse processo é realizado pelas seguintes funções:

def add_skilled(n_teams: int, persons: list[str], teams: dict[str, list[str]]) -> None:
    for i, person in enumerate(persons):
        teams[f"equipe {i % n_teams + 1}"].append(person)


def add_general(team_size: int, persons: list[str], teams: dict[str, list[str]]) -> None:
    for team in teams:
        while len(teams[team]) < team_size and persons:
            teams[team].append(persons.pop())

A primeira função distribui as pessoas com habilidades técnicas ou sociais de forma cíclica, para que não haja várias pessoas em um único grupo. A segunda função distribui as pessoas com outras habilidades de uma forma mais simples, apenas verificando se a equipe está com a quantidade de mebros definida pela configuração TEAM_SIZE.

Primeira forma de distribuição

def add_skilled(n_teams: int, persons: list[str], teams: dict[str, list[str]]) -> None:
    for i, person in enumerate(persons):
        teams[f"equipe {i % n_teams + 1}"].append(person)

Para garantir que a distribuição não concentre pessoas com habilidades técnicas e sociais em um único grupo, essas pessoas são distribuídas em vários grupos de forma cíclica.

Este é um exemplo de como funciona:

Primeira distribuição

Segunda forma de distribuição

def add_general(team_size: int, persons: list[str], teams: dict[str, list[str]]) -> None:
    for team in teams:
        while len(teams[team]) < team_size and persons:
            teams[team].append(persons.pop())

Essa forma de distribuição funciona adicionando os membros à equipe até a quantidade de membros desta ser igual ao valor definida pela variável TEAM_SIZE e após isso passa para a próxima equipe. A função repete esse processo até não haver mais membros para serem adicionados ou acabarem os grupos.

Segunda distribuição

About

Cria grupos/equipes aleatórias baseadas em hard skills e soft skills

Topics

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages