Method: scheduling.solveShiftGeneration

Résolution d'un problème de génération d'équipes à partir du SolveShiftGenerationRequest donné en générant des équipes à partir de modèles d'équipes donnés afin de couvrir la demande des employés.

Requête HTTP

POST https://optimization.googleapis.com/v1/scheduling:solveShiftGeneration

L'URL utilise la syntaxe de transcodage gRPC.

Corps de la requête

Le corps de la requête contient des données présentant la structure suivante :

Représentation JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Champs
solverConfig

object (SolverConfig)

Facultatif. Paramètres du résolveur.

shiftTemplates[]

object (ShiftTemplate)

Obligatoire. Ensemble de modèles d'équipes spécifiant des règles pour générer des équipes.

employeeDemands[]

object (EmployeeDemand)

Obligatoire. Nombre total de demandes des employés que les équipes générées par shiftTemplates doivent couvrir.

Corps de la réponse

Réponse au problème de génération d’équipes. Si la valeur solutionStatus renvoyée est SOLVED, un ensemble de décalages valides générés par le résolveur est renvoyé dans employeeSchedules. Pour que le planning des équipes soit valide, les propriétés suivantes sont valides:

  1. Chaque équipe générée dans employeeSchedules respecte les règles spécifiées dans le ShiftTemplate correspondant.
  2. Chaque événement sélectionné dans chaque quart de travail respecte les règles spécifiées dans le ShiftTemplate.Event correspondant.
  3. Le nombre total d'employés affectés à l'ensemble des équipes générées à partir du même modèle ShiftTemplate ne dépasse pas maximumEmployeeCount de ce modèle.
  4. L'ensemble des employés affectés couvrent la demande à chaque intervalle donné.

Si la requête aboutit, le corps de la réponse contient des données qui ont la structure suivante :

Représentation JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Champs
solutionStatus

enum (ShiftGenerationSolutionStatus)

État de la solution renvoyée. Si solutionStatus n'est pas SOLVED, employeeSchedules sera vide.

employeeSchedules[]

object (EmployeeSchedule)

Ensemble des quarts de travail générés par le résolveur avec le nombre d'employés affectés à chaque planification.

demandCoverageViolations[]

object (DemandCoverageViolation)

Cas de non-respect de la couverture de la demande basés sur le employee_counts attribué dans le employeeSchedules donné. Les employeeDemands indiqués dans la demande sont agrégés. Si deux intervalles employee_demand se chevauchent, la demande est additionnée sur la partie de l'intervalle qui se chevauche.

SolverConfig

Spécifie des paramètres supplémentaires pour résoudre le problème de génération d'équipes.

Représentation JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Champs
timeLimit

string (Duration format)

Temps maximal que le résolveur doit consacrer au problème. Si ce champ n'est pas spécifié, la valeur par défaut est de 1 minute. Le choix d'une limite de temps doit dépendre de l'ampleur du problème. Par exemple, lors de la résolution d'une instance de 7 jours avec 2 ShiftTemplates, chacun avec environ 20 heures de début possibles et 2 événements avec environ 30 heures de début possibles et deux jours d'arrêt par semaine, les valeurs recommandées sont : < 10 s pour les solutions rapides (et probablement non optimales), (10 s, 300 s) pour les solutions de bonne qualité et > 300 s pour une recherche exhaustive. Les instances plus volumineuses peuvent nécessiter des limites de temps plus longues.

Cette valeur n'est pas une limite stricte et ne tient pas compte des frais de communication. La latence attendue pour résoudre le problème peut dépasser légèrement cette valeur.

Durée en secondes avec neuf chiffres au maximum après la virgule et se terminant par "s". Exemple : "3.5s"

multiDaySchedule

boolean

Si la valeur est "true", le résolveur génère des EmployeeSchedule qui incluent plusieurs quarts (par exemple, pour générer un calendrier d'une semaine). Sinon, chaque EmployeeSchedule inclut exactement un décalage. Les plannings de plusieurs jours partent du principe que l'heure de début du travail d'équipe est la même d'un jour à l'autre, et que le nombre de jours de repos pour ce type de planning est déterminé par les modèles d'horaires. La valeur par défaut est "false".

shiftEventsCanChange

boolean

Si la valeur est "true", les EmployeeSchedule de plusieurs jours peuvent inclure des horaires pour lesquels les heures de début et de fin des événements varient d'un jour à l'autre. Sinon, les heures de début et de fin de tous les décalages d'une EmployeeSchedule donnée doivent être les mêmes. Dans les deux cas, les horaires de début et de fin d'un planning de plusieurs jours sont identiques. Par conséquent, ce paramètre est ignoré si multiDaySchedule est défini sur "false". Si ce paramètre est défini sur "true", le temps de résolution peut être plus long. La valeur par défaut est "false".

ShiftTemplate

Modèle spécifiant les règles pour générer des quarts. Un quart de travail est une unité de travail qui spécifie une heure de début et une heure de fin, et qui peut contenir des événements (par exemple, déjeuner, pauses, etc.). Un changement sera attribué à une date spécifique dans la réponse.

Représentation JSON
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
Champs
id

string

ID unique de ce modèle.

earliestStartTime

object (TimeOfDay)

Première heure de la journée à laquelle une équipe peut commencer. Cette valeur est spécifiée en heures et en minutes. secondes et les nano-unités sont ignorées.

latestStartTime

object (TimeOfDay)

Dernière heure de la journée à laquelle une équipe peut commencer. Cette valeur est spécifiée en heures et en minutes. secondes et les nano-unités sont ignorées. Si cette valeur est inférieure à earliestStartTime, un décalage généré par ce modèle peut commencer avant ou après minuit.

durationMinutes

integer

Durée fixe d'une période de travail générée par ce modèle.

startTimeIncrementMinutes

integer

Incrément de temps (en minutes) utilisé pour générer l'ensemble des heures de début possibles entre earliestStartTime et latestStartTime. Par exemple, si l'heure de début au plus tôt est 8h, l'heure de début la plus tardive est 8h30 et que l'incrément de l'heure de début est de 10 minutes, toutes les heures de début possibles pour ce modèle de travail sont : 8h00, 8h10, 8h20 et 8h30.

daysOffCountPerWeek

integer

Nombre fixe de jours de repos par semaine. Un employé bénéficie d'un jour de congé donné s'il n'est pas affecté à un quart de travail qui commence ce jour-là. Une semaine dure sept jours et commence le dimanche.

eventTemplates[]

object (EventTemplate)

Règles permettant de générer des événements pour chaque équipe. Un seul événement sera inclus dans chaque quart de travail pour chaque événement spécifié.

minimumIntereventGapMinutes

integer

Nombre minimal de minutes entre la fin d'un événement et le début du suivant.

maximumEmployeeCount

integer

Nombre maximal d'employés pouvant être affectés à toutes les périodes de travail générées par ce modèle.

TimeOfDay

Représente une heure de la journée. La date et le fuseau horaire sont spécifiés ailleurs, ou ne sont pas significatifs. Une API peut choisir d'autoriser des secondes intercalaires. Les types associés sont google.type.Date et google.protobuf.Timestamp.

Représentation JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Champs
hours

integer

Heure de la journée au format 24 heures. Elle doit être comprise entre 0 à 23. Une API peut choisir d'autoriser la valeur "24:00:00" pour des cas tels que l'heure de fermeture des bureaux.

minutes

integer

Minutes de l'heure de la journée. Elles doivent être comprises entre 0 à 59.

seconds

integer

Secondes de l'heure de la journée. Elles doivent normalement être comprises entre 0 et 59. Une API peut autoriser la valeur 60 si elle autorise les secondes intercalaires.

nanos

integer

Fractions de secondes en nanosecondes. La valeur doit être comprise entre 0 et 999 999 999.

EventTemplate

Modèle spécifiant les règles pour générer un seul événement qui se produit pendant une équipe. Un événement peut représenter une réunion, une pause, un déjeuner, etc.

Représentation JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Champs
id

string

ID unique de ce modèle.

minimumMinutesAfterShiftStart

integer

Nombre minimal de minutes pendant lesquelles cet événement peut commencer après le début d'une période de travail.

maximumMinutesAfterShiftStart

integer

Nombre maximal de minutes pendant lesquelles cet événement peut commencer après le début d'une période de travail.

durationMinutes

integer

Durée fixe de cet événement, en minutes.

startTimeIncrementMinutes

integer

Incrément de temps (en minutes) utilisé pour générer l'ensemble des heures de début d'événements possibles entre minimumMinutesAfterShiftStart et maximumMinutesAfterShiftStart. Par exemple, si le nombre minimal de minutes après le début de la période de travail est de 30, que le nombre maximal de minutes après le début de la période de travail est de 45 et que l'heure de début est de 5 minutes, l'événement peut avoir lieu 30, 35, 40 ou 45 minutes après le début de la période de travail.

EmployeeDemand

Spécifie le nombre d'employés nécessaires pour couvrir la demande au cours de l'intervalle DateTime donné.

Représentation JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Champs
startDateTime

object (DateTime)

Début de l'intervalle de temps pour la demande donnée (inclus). Ces valeurs sont lues à la minute près. secondes et toutes les unités plus petites sont ignorées.

endDateTime

object (DateTime)

Fin de l'intervalle de temps pour la demande donnée (exclue). Ces valeurs sont lues à la minute près. secondes et toutes les unités plus petites sont ignorées.

employeeCount

integer

Nombre d'employés nécessaires pour couvrir la demande pour cet intervalle.

ShiftGenerationSolutionStatus

État de la solution fourni dans la réponse d'un résolveur.

Enums
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED État de la réponse non spécifié.
SHIFT_GENERATION_SOLVED Le résolveur a trouvé une solution dans le délai indiqué.
SHIFT_GENERATION_NOT_SOLVED Un problème a empêché le résolveur de générer des changements.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Les équipes n'ont pas pu être générées pour couvrir la demande dans le délai imparti.

EmployeeSchedule

Liste ordonnée de quarts de travail correspondant à un seul ShiftTemplate devant être attribué à un certain nombre d'employés.

Représentation JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Champs
shiftTemplateId

string

ID du modèle qui a été utilisé pour générer cet ensemble d'ajustements.

shifts[]

object (ShiftWithEvents)

Liste des horaires auxquels employeeCount de collaborateurs sont affectés. Les équipes et les événements sélectionnés pour la planification ont été générés à partir d'un seul modèle. Les changements sont triés par ordre chronologique et ne se chevauchent pas. Si SolverConfig.multi_day_schedule est défini sur "true", un jour de congé est implicitement représenté par l'absence de travail à partir de ce jour-là.

employeeCount

integer

Nombre d'employés devant être affectés à cet ensemble d'équipes pour répondre à la demande.

ShiftWithEvents

Spécifie les dates de début et de fin, ainsi que la liste des événements fixes d'un décalage généré par le résolveur.

Représentation JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Champs
startDateTime

object (DateTime)

Date et heure de début du quart de travail. Cette valeur est spécifiée à la minute. secondes et les unités inférieures ne sont pas fournies.

endDateTime

object (DateTime)

Date et heure de fin du quart de travail. Cette valeur est spécifiée à la minute près. secondes et les unités inférieures ne sont pas fournies.

events[]

object (Event)

Liste des événements inclus dans ce décalage, mappés exactement aux éléments ShiftTemplate.Event et dans le même ordre que ceux-ci. Si SolverConfig.shift_events_can_change est défini sur "true", les heures de début et de fin des événements peuvent varier pendant toutes les ShiftWithEvents de ce calendrier.

Événement

Spécifie les dates et heures de début et de fin d'un événement spécifique dans un décalage généré par le résolveur.

Représentation JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Champs
eventTemplateId

string

ID du modèle qui a été utilisé pour générer cet événement.

startDateTime

object (DateTime)

Date et heure de début de l'événement. Cette valeur est spécifiée à la minute près. secondes et les unités inférieures ne sont pas fournies.

endDateTime

object (DateTime)

Date et heure de fin de l'événement. Cette valeur est spécifiée à la minute. secondes et les unités inférieures ne sont pas fournies.

DemandCoverageViolation

Spécifie le cas de non-respect de la couverture de la demande pour l'intervalle donné. La demande des employés reste la même pendant tout l'intervalle spécifié.

Représentation JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Champs
startDateTime

object (DateTime)

Date et heure de début de l'intervalle de demande (incluses). Cette valeur est spécifiée à la minute près.

endDateTime

object (DateTime)

Date et heure de fin de l'intervalle de demande (exclues). Cette valeur est spécifiée à la minute près.

coverageViolation

integer

Non-respect de la couverture pendant la période spécifiée. Une valeur positive indique que la demande est surcouverte, tandis qu'une valeur négative indique que la demande est sous-couverte.