Method: scheduling.solveShiftGeneration

Risolve un problema di generazione dei turni da un dato SolveShiftGenerationRequest generando dei turni da determinati modelli di turni per coprire la domanda dei dipendenti.

Richiesta HTTP

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

L'URL utilizza la sintassi di transcodifica gRPC.

Corpo della richiesta

Il corpo della richiesta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Campi
solverConfig

object (SolverConfig)

(Facoltativo) Parametri del risolutore.

shiftTemplates[]

object (ShiftTemplate)

Obbligatorio. Insieme di modelli di turni che specificano le regole per generare i turni.

employeeDemands[]

object (EmployeeDemand)

Obbligatorio. Domanda totale dei dipendenti che devono essere coperti dai turni generati da shiftTemplates.

Corpo della risposta

Risposta per il problema relativo alla generazione di turni. Se il valore solutionStatus restituito è SOLVED, viene restituito un insieme di variazioni valide generate dal risolutore in employeeSchedules. Per una pianificazione dei turni valida, vengono mantenute le seguenti proprietà:

  1. Ogni variazione generata in employeeSchedules è conforme alle regole specificate nei ShiftTemplate corrispondenti.
  2. Ogni evento selezionato in ogni turno rispetta le regole specificate nei ShiftTemplate.Event corrispondenti.
  3. Il numero totale di dipendenti assegnati all'insieme di turni generati dallo stesso modello ShiftTemplate non è superiore a maximumEmployeeCount di quel modello.
  4. L'insieme di dipendenti assegnati copre la domanda a intervalli specifici.

In caso di esito positivo, il corpo della risposta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Campi
solutionStatus

enum (ShiftGenerationSolutionStatus)

Stato della soluzione restituita. Se solutionStatus non è SOLVED, il campo employeeSchedules sarà vuoto.

employeeSchedules[]

object (EmployeeSchedule)

Insieme di turni generati dal risolutore insieme al numero di dipendenti assegnati a ciascun programma.

demandCoverageViolations[]

object (DemandCoverageViolation)

Violazioni della copertura della domanda in base al valore employee_counts assegnato nel criterio employeeSchedules specificato. I valori employeeDemands specificati nella richiesta vengono aggregati: se due intervalli employee_demand si sovrappongono, la domanda viene sommata per la parte sovrapposta dell'intervallo.

SolverConfig

Specifica parametri aggiuntivi per risolvere il problema relativo alla generazione di adattamenti.

Rappresentazione JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Campi
timeLimit

string (Duration format)

Tempo massimo che il risolutore dovrebbe dedicare al problema. Se non viene configurato, il valore predefinito è 1 minuto. La scelta di un limite di tempo deve dipendere dalla portata del problema. Per fare un esempio, quando si risolve un'istanza di 7 giorni con 2 ShiftTemplates, ognuno con circa 20 ore di inizio possibili e si organizzano 2 eventi con circa 30 ore di inizio possibili e due giorni liberi alla settimana, i valori consigliati sono: <10 s per soluzioni rapide (e probabilmente non ottimali), (10, 300 s) per soluzioni di buona qualità e > 300 s per una ricerca esaustiva. Le istanze di grandi dimensioni potrebbero richiedere limiti di tempo più lunghi.

Questo valore non rappresenta un limite rigido e non tiene conto dell'overhead di comunicazione. La latenza prevista per risolvere il problema potrebbe superare leggermente questo valore.

Durata in secondi con un massimo di nove cifre frazionarie e termina con "s". Esempio: "3.5s".

multiDaySchedule

boolean

Se true, il risolutore genera EmployeeSchedule che includono diversi turni (ad esempio, per generare una programmazione di una settimana). In caso contrario, ogni EmployeeSchedule include esattamente un turno. Le pianificazioni di più giorni presuppongono che l'ora di inizio del turno sia la stessa nei vari giorni e il numero di giorni liberi in una pianificazione di questo tipo è determinato dai modelli di turno. Il valore predefinito è false.

shiftEventsCanChange

boolean

Se true, i EmployeeSchedule di più giorni possono includere turni in cui l'ora di inizio e di fine degli eventi variano da un giorno all'altro. In caso contrario, tutti i turni di un determinato EmployeeSchedule devono avere l'ora di inizio e di fine dello stesso evento. In entrambi i casi, tutti i turni di una programmazione di più giorni hanno la stessa ora di inizio e di fine. Di conseguenza, questo parametro viene ignorato se multiDaySchedule è falso. L'impostazione di questo parametro su true potrebbe comportare tempi di risoluzione più lunghi. Il valore predefinito è false.

ShiftTemplate

Modello che specifica le regole per generare le variazioni. Un turno è un'unità di lavoro che specifica un'ora di inizio e di fine e può contenere eventi (ad esempio pranzo, pause e così via). A una data specifica verrà assegnato uno spostamento nella risposta.

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

string

ID univoco di questo modello.

earliestStartTime

object (TimeOfDay)

La prima ora del giorno in cui può iniziare un turno. Questo valore è specificato con ore e minuti; secondi e nano vengono ignorati.

latestStartTime

object (TimeOfDay)

L'ultima ora della giornata in cui può iniziare un turno. Questo valore è specificato con ore e minuti; secondi e nano vengono ignorati. Se questo valore è inferiore a earliestStartTime, la variazione generata da questo modello potrebbe iniziare prima o dopo la mezzanotte.

durationMinutes

integer

Durata fissa di una variazione generata da questo modello.

startTimeIncrementMinutes

integer

L'incremento di tempo (in minuti) utilizzato per generare l'insieme di possibili ore di inizio comprese tra earliestStartTime e latestStartTime. Ad esempio, se la prima ora di inizio è 8:00, l'ora di inizio più recente è 8:30 e l'incremento dell'ora di inizio è 10 minuti, tutti gli orari di inizio possibili per questo modello di spostamento sono: 8:00, 8:10, 8:20 e 8:30.

daysOffCountPerWeek

integer

Numero fisso di giorni liberi a settimana. Un dipendente ha un determinato giorno libero se non è assegnato a un turno che inizia in quella data. Una settimana dura 7 giorni e inizia la domenica.

eventTemplates[]

object (EventTemplate)

Regole per la generazione di eventi per ogni turno. Verrà incluso esattamente un evento in ogni turno per ogni evento specificato.

minimumIntereventGapMinutes

integer

Numero minimo di minuti tra la fine di un evento e l'inizio di quello successivo.

maximumEmployeeCount

integer

Numero massimo di dipendenti che può essere assegnato a tutti i turni generati da questo modello.

TimeOfDay

Rappresenta un'ora del giorno. La data e il fuso orario non sono significativi o sono specificati altrove. Un'API può scegliere di consentire i secondi intercalari. I tipi correlati sono google.type.Date e google.protobuf.Timestamp.

Rappresentazione JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Campi
hours

integer

Le ore del giorno nel formato 24 ore. Deve essere compreso tra 0 e 23. Un'API può scegliere di consentire il valore "24:00:00" per scenari come l'orario di chiusura dell'attività.

minutes

integer

Minuti dell'ora del giorno. Il valore deve essere compreso tra 0 e 59.

seconds

integer

Secondi di minuti del tempo. Normalmente deve essere compreso tra 0 e 59. Un'API potrebbe consentire il valore 60 se consente i secondi intercalari.

nanos

integer

Frazioni di secondi in nanosecondi. Deve essere compreso tra 0 e 999.999.999.

EventTemplate

Modello che specifica le regole per la generazione di un singolo evento che si verifica durante un turno. Un evento può rappresentare una riunione, una pausa, un pranzo e così via.

Rappresentazione JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Campi
id

string

ID univoco di questo modello.

minimumMinutesAfterShiftStart

integer

Numero minimo di minuti dopo l'inizio di un turno in cui può iniziare questo evento.

maximumMinutesAfterShiftStart

integer

Numero massimo di minuti dopo l'inizio di un turno in cui questo evento può iniziare.

durationMinutes

integer

Durata fissa in minuti di questo evento.

startTimeIncrementMinutes

integer

L'incremento di tempo (in minuti) utilizzato per generare l'insieme di possibili ore di inizio degli eventi tra il giorno minimumMinutesAfterShiftStart e il giorno maximumMinutesAfterShiftStart. Ad esempio, se il numero minimo di minuti dopo l'inizio del turno è 30, il numero massimo di minuti dopo l'inizio del turno è 45 e l'incremento dell'ora di inizio è 5 minuti, l'evento può svolgersi 30, 35, 40 o 45 minuti dopo l'inizio del turno.

EmployeeDemand

Specifica il numero di dipendenti necessari per coprire la domanda in un intervallo DateTime specificato.

Rappresentazione JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Campi
startDateTime

object (DateTime)

Inizio dell'intervallo di tempo per la domanda specificata (inclusa). Questi valori vengono letti al minuto; secondi e tutte le unità più piccole vengono ignorate.

endDateTime

object (DateTime)

Fine dell'intervallo di tempo per la domanda specificata (esclusa). Questi valori vengono letti al minuto; secondi e tutte le unità più piccole vengono ignorate.

employeeCount

integer

Numero di dipendenti necessari per coprire la domanda per questo intervallo.

ShiftGenerationSolutionStatus

Stato della soluzione fornito nella risposta di un risolutore.

Enum
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Stato non specificato per la risposta.
SHIFT_GENERATION_SOLVED Il risolutore ha trovato una soluzione nel limite di tempo indicato.
SHIFT_GENERATION_NOT_SOLVED Un problema ha impedito al risolutore di generare cambiamenti.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Non è stato possibile generare adattamenti per coprire la domanda entro il limite di tempo specificato.

EmployeeSchedule

Un elenco ordinato di turni corrispondente a un singolo ShiftTemplate da assegnare a più dipendenti.

Rappresentazione JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Campi
shiftTemplateId

string

ID del modello utilizzato per generare questo insieme di variazioni.

shifts[]

object (ShiftWithEvents)

Elenco dei turni a cui è assegnato il numero di dipendenti employeeCount. I cambiamenti e gli eventi selezionati per la pianificazione sono stati generati da un singolo modello. Le variazioni vengono ordinate in ordine cronologico e non si sovrappongono. Se il valore SolverConfig.multi_day_schedule è true, un giorno libero è rappresentato implicitamente dall'assenza di un turno a partire da quel giorno.

employeeCount

integer

Numero di dipendenti da assegnare a questo insieme di turni per coprire la domanda.

ShiftWithEvents

Specifica le date di inizio e di fine insieme a un elenco di eventi fissi di una variazione generata dal risolutore.

Rappresentazione JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Campi
startDateTime

object (DateTime)

Data e ora di inizio del turno. Questo valore viene specificato fino al minuto; secondi e unità più piccole.

endDateTime

object (DateTime)

Data e ora di fine del turno. Questo valore viene specificato fino al minuto; secondi e unità più piccole.

events[]

object (Event)

Elenco degli eventi inclusi in questa modifica, mappati esattamente e nello stesso ordine dei ShiftTemplate.Event. Se SolverConfig.shift_events_can_change è impostato su true, gli orari di inizio e di fine degli eventi potrebbero variare in tutti i ShiftWithEvents di questa programmazione.

Evento

Specifica la data e l'ora di inizio e di fine di un evento specifico in una variazione generata dal risolutore.

Rappresentazione JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Campi
eventTemplateId

string

ID del modello utilizzato per generare l'evento.

startDateTime

object (DateTime)

Data e ora di inizio dell'evento. Questo valore viene specificato fino al minuto; secondi e unità più piccole.

endDateTime

object (DateTime)

Data e ora di fine dell'evento. Questo valore viene specificato fino al minuto; secondi e unità più piccole.

DemandCoverageViolation

Specifica la violazione della copertura della domanda per l'intervallo specificato. La domanda dei dipendenti è la stessa per tutto l'intervallo specificato.

Rappresentazione JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Campi
startDateTime

object (DateTime)

Data e ora di inizio dell'intervallo di domanda (incluse). Questo valore viene specificato fino al minuto.

endDateTime

object (DateTime)

Data e ora di fine dell'intervallo di domanda (esclusa). Questo valore viene specificato fino al minuto.

coverageViolation

integer

Violazione della copertura durante l'intervallo specificato. Un valore positivo indica che la domanda è coperta da un limite di copertura, mentre un valore negativo indica che la domanda è coperta.