Calculadora de mudança
Dado um conjunto de entidades com restrições, calcule um cronograma de turnos para elas que respeitam ao máximo essas restrições.
Uso
Verifique se o seu computador possui o Python instalado executando python --version
na linha de comando.
Caso contrário, você pode baixar o Python aqui: https://www.python.org/downloads
Ao instalar o Python:
- O Windows pode tentar fazer com que você instale o Python na App Store, você deve ignorar isso e instalar no python.org, pois, caso contrário, você não pode personalizar a instalação. Você precisa ser capaz de personalizar a instalação para poder:
- Verifique a caixa para adicioná -la ao caminho! Isso permitirá que o seu terminal de linha de comando encontre Python ao tentar executar o programa.
Para executar o programa:
- Faça o download do arquivo
calculateShifts.py
de releases (você também pode encontrar sampleEntities.csv
útil). - Navegue até a pasta que contém
calculateShifts.py
- Clique em "Arquivo" no canto superior esquerdo e "Abrir no Windows PowerShell".
- Digite seu comando. (Veja abaixo.)
Este programa é executado na linha de comando. Ele pega um arquivo de entrada e registra o cronograma gerado em um arquivo de saída. Os seguintes argumentos são necessários:
- Entidades nome do arquivo (por exemplo, foo.csv) - Este é o seu arquivo de entrada, consulte os requisitos abaixo para que ele deve ser.
- Data de início (AAAA-MM-DD)
- Número de semanas
- Dias com turnos, usando nomes diários minúsculos e encurtados separados com semi-corons (por exemplo, sex; sáb; sol)
- Número mínimo de dias entre os turnos
Por exemplo:
python calculateShifts.py sampleEntities.csv 2021-08-01 10 "fri;sat;sun" 6
Entidades Arquivo Requisitos
O arquivo de entidades deve ser um arquivo de valores separado por vírgula (CSV) com as seguintes colunas:
- Nome
- Grupo - atualmente não usado pelo programa, mas será incluído na saída, caso você queira ver como diferentes grupos são distribuídos no cronograma.
- Dias indisponíveis - especifique em quais dias da semana essa entidade não está disponível usando nomes diários minúsculos e reduzidos separados com semi -corons (por exemplo, sex; sáb; sol).
Consulte Sampleentities.csv para um exemplo!
Saída
O programa produzirá um arquivo de saída.csv com as seguintes colunas:
- Data
- Dia da semana
- Grupo
- Nome
O cronograma tentará minimizar violações de restrição, mas como essas restrições podem entrar em conflito, o cronograma não será perfeito. Recomendamos permitir substituições se você usar esse cronograma diretamente.
Além disso, o programa imprimirá alguma saída de depuração no console. Para cada entidade, ela compartilhará o freio das vezes que suas restrições foram comprometidas e a distribuição de suas mudanças nos diferentes dias.
Plano de implementação
Abaixo estão alguns detalhes sobre como o programa funciona, se você estiver interessado.
Restrições
Este programa não garante que todas as restrições sejam perfeitamente atendidas, pois isso exigiria que as entradas fossem completamente não contraditórias. Em vez disso, prioriza os tipos de restrições e tentativas fornecidas para minimizar e distribuir uniformemente violações dessas restrições nas entidades programadas.
Em ordem de prioridade:
- Dias indisponíveis - uma entidade nunca deve estar agendada para um dia em que não está disponível.
- Distribuição de turno - verifique se todas as entidades têm um número aproximadamente igual de mudanças durante todo o período.
- Número mínimo de dias entre os turnos - tente respeitar a quantidade mínima de tempo entre os turnos.
- Distribuição diurna - tente garantir que cada entidade tenha mudanças em vários dias em que estão disponíveis.
Pseudocódigo
- Gerar a lista de todos os turnos.
- Inicialmente, classifique as entidades das restrições mais diárias.
- Para cada entidade que não está "feita":
- Procure a próxima mudança ideal.
- Se estiver desocupado, leve -o.
- Se estiver ocupado, relaxe uma restrição e procure uma nova mudança ideal. Incrementar a contagem de compromissos desta entidade em 1.
- Se estivermos na última restrição (dias disponíveis), pule esta entidade e marque -a como "feita" em vez de violar essa restrição.
- Verifique se ainda há mudanças não atribuídas e entidades que não são "feitas".
- Nesse caso, classifique as entidades por número de compromissos da maioria para o mínimo e depois passe por elas novamente. Isso garante que as entidades que comprometissem mais a primeira escolha a cada rodada.
- Saia o cronograma para saída.csv.
Estruturas de dados necessárias:
- Lista de turnos com data, dia e entidade designada
- Lista de entidades com nome, grupo, dias indisponíveis, número de compromissos e marcador feito