Calculatrice de décalage
Compte tenu d'un ensemble d'entités avec des contraintes, calculez un calendrier de changements pour eux qui respectent au maximum ces contraintes.
Usage
Assurez-vous que votre ordinateur a installé Python en exécutant python --version
sur la ligne de commande.
Si ce n'est pas le cas, vous pouvez télécharger Python ici: https://www.python.org/downloads
Lors de l'installation de Python:
- Windows peut essayer de vous faire installer Python à partir de l'App Store, vous devez ignorer cela et installer à partir de python.org, car sinon vous ne pouvez pas personnaliser l'installation. Vous devez être en mesure de personnaliser l'installation afin que vous puissiez:
- Cochez la case pour l'ajouter au chemin! Cela permettra à votre terminal de ligne de commande de trouver Python lorsque vous essayez d'exécuter le programme.
Pour exécuter le programme:
- Téléchargez le fichier
calculateShifts.py
à partir des versions (vous pouvez également trouver sampleEntities.csv
utile). - Accédez au dossier contenant
calculateShifts.py
- Cliquez sur "Fichier" en haut à gauche et "Ouvrez dans Windows PowerShell".
- Tapez votre commande. (Voir ci-dessous.)
Ce programme est exécuté à partir de la ligne de commande. Il prend un fichier d'entrée et enregistre le calendrier généré dans un fichier de sortie. Les arguments suivants sont requis:
- Nom de fichier entités (par exemple foo.csv) - Il s'agit de votre fichier d'entrée, voir les exigences ci-dessous pour ce à quoi il devrait ressembler.
- Date de début (yyyy-mm-dd)
- Nombre de semaines
- Jours avec des quarts de travail, en utilisant des noms de jour en minuscules séparés avec des demi-colons (par exemple ven; sat; soleil)
- Nombre minimum de jours entre les quarts
Par exemple:
python calculateShifts.py sampleEntities.csv 2021-08-01 10 "fri;sat;sun" 6
Exigences de fichiers entités
Le fichier d'entités doit être un fichier de valeurs séparés par des virgules (CSV) avec les colonnes suivantes:
- Nom
- Groupe - pas actuellement utilisé par le programme, mais sera inclus dans la sortie au cas où vous souhaiteriez voir comment différents groupes sont distribués dans le calendrier.
- Jours indisponibles - Spécifiez quels jours de la semaine cette entité n'est pas disponible à l'aide de noms de jour en minuscules séparés avec des demi-colons (par exemple, le SAT; Sun; Soleil).
Voir Sampleentities.csv pour un exemple!
Sortir
Le programme sortira un fichier Output.csv avec les colonnes suivantes:
- Date
- Jour de la semaine
- Groupe
- Nom
L'horaire tentera de minimiser les violations des contraintes, mais comme ces contraintes peuvent entrer en conflit, le calendrier ne sera pas parfait. Nous vous recommandons d'autoriser les substitutions si vous utilisez ce calendrier directement.
De plus, le programme imprimera une sortie de débogage à la console. Pour chaque entité, il partagera la nunchette de la fois, leurs contraintes ont été compromises et la distribution de leurs changements à travers les différents jours.
Plan de mise en œuvre
Voici quelques détails sur le fonctionnement du programme, si vous êtes intéressé.
Contraintes
Ce programme ne garantit pas que toutes les contraintes sont parfaitement respectées, car cela nécessiterait que les entrées soient complètement non contradictoires. Au lieu de cela, il priorise les types de contraintes fournis et tente de minimiser et de distribuer uniformément les violations de ces contraintes à travers les entités prévues.
Par ordre de priorité:
- Jours indisponibles - Une entité ne doit jamais être programmée pour une journée qu'elle n'est pas disponible.
- Distribution de décalage - Assurez-vous que toutes les entités ont un nombre à peu près égal de changements sur toute la période.
- Nombre minimum de jours entre les quarts - tentez de respecter la durée minimale entre les quarts de travail.
- Distribution du jour - Essayez de vous assurer que chaque entité a des changements dans une variété des jours où ils sont disponibles.
Pseudocode
- Générez la liste de tous les quarts de travail.
- Initialement trier les entités de la plupart des restrictions de jour.
- Pour chaque entité qui n'est pas "fait":
- Recherchez le prochain changement idéal.
- S'il est inoccupé, prenez-le.
- S'il est occupé, détendez une restriction et recherchez un nouveau changement idéal. Incrémentez le nombre de compromis de cette entité par 1.
- Si nous sommes sur la dernière restriction (jours disponibles), ignorez cette entité et marquez-la comme «faite» plutôt que de violer cette restriction.
- Vérifiez s'il y a encore des changements non assistés et des entités qui ne sont pas «faites».
- Si c'est le cas, triez les entités par nombre de compromis de la plupart au moins, puis les traverser à nouveau. Cela garantit que les entités qui ont compromis le plus ont le premier choix à chaque tour.
- Sortir le calendrier de sortie.csv.
Structures de données requises:
- Liste des quarts de travail avec la date, le jour et l'entité assignée
- Liste des entités avec nom, groupe, jours indisponibles, nombre de compromis et marqueur fait