Method: scheduling.solveShiftGeneration

Löst ein Problem bei der Schichtgenerierung aus den angegebenen SolveShiftGenerationRequest, indem Schichten aus vorgegebenen Schichtvorlagen generiert werden, um die Nachfrage der Mitarbeitenden zu decken.

HTTP-Anfrage

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

Die URL verwendet die Syntax der gRPC-Transcodierung.

Anfragetext

Der Anfragetext enthält Daten mit folgender Struktur:

JSON-Darstellung
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Felder
solverConfig

object (SolverConfig)

Optional. Parameter für den Solver.

shiftTemplates[]

object (ShiftTemplate)

Erforderlich. Satz von Schichtvorlagen, die Regeln zum Generieren von Schichten festlegen.

employeeDemands[]

object (EmployeeDemand)

Erforderlich. Die Gesamtnachfrage der Mitarbeitenden, die durch die von „shiftTemplates“ erzeugten Schichten abgedeckt werden muss.

Antworttext

Antwort auf das Problem der Schichtgenerierung. Wenn die zurückgegebene solutionStatus SOLVED lautet, wird eine Reihe gültiger Änderungen, die vom Solverr generiert wurden, in employeeSchedules zurückgegeben. Für einen gültigen Schichtplan gelten die folgenden Properties:

  1. Jede in employeeSchedules generierte Verschiebung unterliegt den Regeln, die in der entsprechenden ShiftTemplate angegeben sind.
  2. Jedes in den einzelnen Schichten ausgewählte Ereignis unterliegt den Regeln, die in der entsprechenden ShiftTemplate.Event festgelegt sind.
  3. Die Gesamtzahl der Mitarbeiter, die den Schichten zugewiesen sind, die aus derselben Schichtvorlage generiert wurden, überschreitet maximumEmployeeCount dieser Vorlage nicht.
  4. Die zugewiesenen Mitarbeitenden decken den Bedarf in jedem gegebenen Intervall ab.

Bei Erfolg enthält der Antworttext Daten mit der folgenden Struktur:

JSON-Darstellung
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Felder
solutionStatus

enum (ShiftGenerationSolutionStatus)

Status der zurückgegebenen Lösung. Wenn solutionStatus nicht SOLVED ist, ist employeeSchedules leer.

employeeSchedules[]

object (EmployeeSchedule)

Satz der vom Matherechner generierten Schichten und die Anzahl der Mitarbeitenden, die den einzelnen Zeitplänen zugewiesen sind.

demandCoverageViolations[]

object (DemandCoverageViolation)

Verstöße gegen die Nachfrageabdeckung basierend auf dem zugewiesenen employee_counts in der angegebenen employeeSchedules. Die in der Anfrage angegebenen employeeDemands werden zusammengefasst. Wenn sich zwei employee_demand-Intervalle überschneiden, wird der Bedarf über den sich überschneidenden Anteil des Intervalls addiert.

SolverConfig

Gibt zusätzliche Parameter zur Lösung des Problems der Generierung der Umschalttaste an.

JSON-Darstellung
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Felder
timeLimit

string (Duration format)

Maximale Zeit, die der Rechner mit der Aufgabe verbringen sollte. Wenn nichts festgelegt ist, wird der Standardwert 1 Minute verwendet. Die Wahl eines Zeitlimits sollte von der Größe des Problems abhängen. Wenn Sie beispielsweise eine 7-tägige Instanz mit 2 ShiftTemplates mit jeweils etwa 20 möglichen Startzeiten lösen und 2 Ereignisse mit ungefähr 30 möglichen Startzeiten und zwei freien Tagen pro Woche lösen, werden folgende Werte empfohlen: < 10 s für schnelle Lösungen (und wahrscheinlich suboptimal), (10 s, 300 s) für gute Lösungen und > 300 s für eine umfassende Suche. Größere Instanzen erfordern möglicherweise längere Zeitlimits.

Dieser Wert ist kein fester Grenzwert und berücksichtigt nicht den Kommunikationsaufwand. Die erwartete Latenz zur Behebung des Problems kann diesen Wert geringfügig überschreiten.

Die Dauer in Sekunden mit bis zu neun Nachkommastellen und am Ende mit "s". Beispiel: "3.5s".

multiDaySchedule

boolean

Bei Einstellung auf „true“ generiert der Solver EmployeeSchedules mit mehreren Schichten (z.B. zum Erstellen eines einwöchigen Fahrplans). Andernfalls enthält jede EmployeeSchedule genau eine Schicht. Bei mehrtägigen Zeitplänen wird davon ausgegangen, dass der Beginn der Schicht über mehrere Tage hinweg gleich ist. Die Anzahl der freien Tage in einem solchen Zeitplan wird durch die Schichtvorlagen bestimmt. Der Standardwert ist "false".

shiftEventsCanChange

boolean

Falls wahr, können mehrtägige EmployeeSchedule Schichten enthalten, bei denen die Start- und Endzeit ihrer Termine über jeden Tag variiert. Andernfalls müssen alle Verschiebungen einer bestimmten EmployeeSchedule die Start- und Endzeit des Ereignisses haben. In beiden Fällen haben alle Schichten eines mehrtägigen Fahrplans dieselbe Start- und Endzeit. Daher wird dieser Parameter ignoriert, wenn multiDaySchedule „false“ ist. Wird dieser Parameter auf „true“ gesetzt, dauert die Bearbeitungszeit möglicherweise länger. Der Standardwert ist "false".

ShiftTemplate

Vorlage, die Regeln zum Generieren von Schichten angibt. Eine Schicht ist eine Arbeitseinheit, die eine Startzeit und ein Ende angibt und Ereignisse umfassen kann (z. B. Mittagessen, Pausen usw.). Eine Schicht wird einem bestimmten Datum in der Antwort zugewiesen.

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

string

Eindeutige ID dieser Vorlage.

earliestStartTime

object (TimeOfDay)

Frühester Zeitpunkt am Tag, zu dem eine Schicht beginnen kann. Dieser Wert wird mit Stunden und Minuten angegeben. Sekunden und Nanos werden ignoriert.

latestStartTime

object (TimeOfDay)

Spätester Zeitpunkt des Tages, an dem eine Schicht beginnen kann. Dieser Wert wird mit Stunden und Minuten angegeben. Sekunden und Nanos werden ignoriert. Wenn dieser Wert kleiner als earliestStartTime ist, kann eine von dieser Vorlage generierte Verschiebung vor oder nach Mitternacht beginnen.

durationMinutes

integer

Feste Dauer einer von dieser Vorlage generierten Verschiebung.

startTimeIncrementMinutes

integer

Das Zeitinkrement (in Minuten), das zum Generieren der möglichen Startzeiten zwischen earliestStartTime und latestStartTime verwendet wird. Beispiel: Wenn die früheste Startzeit 8:00 Uhr ist, die späteste Startzeit 8:30 ist und die Startzeit 10 Minuten beträgt, dann lauten alle möglichen Startzeiten für diese Schichtvorlage wie folgt: 8:00, 8:10, 8:20 und 8:30.

daysOffCountPerWeek

integer

Feste Anzahl an freien Tagen pro Woche. Ein Mitarbeiter hat einen freien Tag, wenn er keiner Schicht zugewiesen ist, die an diesem Tag beginnt. Eine Woche umfasst 7 Tage und beginnt am Sonntag.

eventTemplates[]

object (EventTemplate)

Regeln zum Generieren von Ereignissen für jede Schicht. In jeder Schicht für jedes angegebene Ereignis wird genau ein Ereignis enthalten.

minimumIntereventGapMinutes

integer

Mindestanzahl von Minuten zwischen dem Ende eines Ereignisses und dem Beginn des nächsten.

maximumEmployeeCount

integer

Maximale Anzahl von Mitarbeitern, die allen Schichten zugewiesen werden kann, die durch diese Vorlage generiert werden.

TimeOfDay

Stellt eine Tageszeit dar. Das Datum und die Zeitzone sind entweder nicht relevant oder werden an anderer Stelle angegeben. Eine API kann Schaltsekunden zulassen. Vergleichbare Typen sind google.type.Date und google.protobuf.Timestamp.

JSON-Darstellung
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Felder
hours

integer

Stunden im 24-Stunden-Format. Sollte zwischen 0 und 23 liegen. Eine API kann den Wert "24:00:00" für Szenarien wie Geschäftsschlusszeit zulassen.

minutes

integer

Minuten der Zeitangabe. Muss zwischen 0 und 59 liegen.

seconds

integer

Sekunden der Zeitangabe. Muss normalerweise zwischen 0 und 59 liegen. Eine API kann den Wert 60 zulassen, wenn sie Schaltsekunden zulässt.

nanos

integer

Sekundenbruchteile in Nanosekunden. Muss zwischen 0 und 999.999.999 liegen.

EventTemplate

Vorlage mit Regeln zum Generieren eines einzelnen Ereignisses, das während einer Schicht auftritt. Ein Ereignis kann beispielsweise eine Besprechung, eine Pause oder ein Mittagessen sein.

JSON-Darstellung
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Felder
id

string

Eindeutige ID dieser Vorlage.

minimumMinutesAfterShiftStart

integer

Mindestanzahl von Minuten nach Beginn einer Schicht, die dieses Ereignis beginnen kann.

maximumMinutesAfterShiftStart

integer

Maximale Anzahl von Minuten nach Beginn einer Schicht, die dieses Ereignis beginnen kann.

durationMinutes

integer

Feste Dauer dieses Termins in Minuten.

startTimeIncrementMinutes

integer

Das Zeitinkrement (in Minuten), das zum Generieren der Gruppe möglicher Ereignisstartzeiten zwischen minimumMinutesAfterShiftStart und maximumMinutesAfterShiftStart verwendet wird. Beispiel: Wenn die Mindestanzahl der Minuten nach Schichtbeginn 30, die maximale Anzahl der Minuten nach Schichtbeginn 45 und die Startzeit 5 Minuten beträgt, kann das Ereignis 30, 35, 40 oder 45 Minuten nach Schichtbeginn stattfinden.

EmployeeDemand

Gibt die Anzahl der Mitarbeiter an, die erforderlich sind, um den Bedarf im angegebenen DateTime-Intervall zu decken.

JSON-Darstellung
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Felder
startDateTime

object (DateTime)

Beginn des Zeitintervalls für die angegebene Nachfrage (einschließlich). Diese Werte werden minutengenau abgelesen. Sekunden und alle kleineren Einheiten werden ignoriert.

endDateTime

object (DateTime)

Ende des Zeitintervalls für die jeweilige Nachfrage (exklusiv). Diese Werte werden minutengenau abgelesen. Sekunden und alle kleineren Einheiten werden ignoriert.

employeeCount

integer

Anzahl der Mitarbeiter, die benötigt werden, um den Bedarf für dieses Intervall abzudecken.

ShiftGenerationSolutionStatus

Lösungsstatus, der in der Antwort eines Matherechners angegeben wurde.

Enums
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Unbekannter Status für die Antwort.
SHIFT_GENERATION_SOLVED Der Matherechner hat innerhalb des angegebenen Zeitlimits eine Lösung gefunden.
SHIFT_GENERATION_NOT_SOLVED Ein Problem hat verhindert, dass der Rechner keine Schichten erzeugt.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Es konnten keine Schichten generiert werden, um die Nachfrage innerhalb des festgelegten Zeitlimits zu decken.

EmployeeSchedule

Eine sortierte Liste von Schichten, die einer einzelnen ShiftTemplate entsprechen, die einer Anzahl von Mitarbeitern zugewiesen werden soll.

JSON-Darstellung
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Felder
shiftTemplateId

string

ID der Vorlage, die zum Generieren dieser Schichten verwendet wurde.

shifts[]

object (ShiftWithEvents)

Liste der Schichten, denen employeeCount Mitarbeiter zugewiesen sind. Die für den Zeitplan ausgewählten Schichten und Ereignisse wurden aus einer einzigen Vorlage generiert. Die Schichten sind chronologisch sortiert und überschneiden sich nicht. Wenn SolverConfig.multi_day_schedule wahr ist, wird ein freier Tag implizit durch das Fehlen einer Schicht, die an diesem Tag beginnt, dargestellt.

employeeCount

integer

Anzahl der Mitarbeitenden, die diesen Schichten zugewiesen werden sollten, um den Bedarf zu decken.

ShiftWithEvents

Gibt das Start- und Enddatum sowie eine Liste fester Ereignisse eines Wechsels an, die vom Matherechner generiert wurden.

JSON-Darstellung
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Felder
startDateTime

object (DateTime)

Startdatum und -zeit der Schicht. Dieser Wert wird minutengenau angegeben. Sekunden und kleinere Einheiten werden nicht angegeben.

endDateTime

object (DateTime)

Enddatum und -zeit der Schicht. Dieser Wert wird minutengenau angegeben. Sekunden und kleinere Einheiten werden nicht angegeben.

events[]

object (Event)

Liste der Ereignisse, die in dieser Schicht enthalten sind. Diese sind genau den ShiftTemplate.Events und in derselben Reihenfolge zugeordnet. Wenn SolverConfig.shift_events_can_change „true“ ist, können Start- und Endzeiten der Ereignisse im gesamten ShiftWithEvents dieses Zeitplans variieren.

Ereignis

Gibt den Start- und Endzeitpunkt (DateTime) eines bestimmten Ereignisses in einer vom Saldo generierten Verschiebung an.

JSON-Darstellung
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Felder
eventTemplateId

string

ID der Vorlage, die zum Generieren dieses Ereignisses verwendet wurde.

startDateTime

object (DateTime)

Startdatum und -zeit des Ereignisses. Dieser Wert wird minutengenau angegeben. Sekunden und kleinere Einheiten werden nicht angegeben.

endDateTime

object (DateTime)

Enddatum und -zeit des Ereignisses. Dieser Wert wird minutengenau angegeben. Sekunden und kleinere Einheiten werden nicht angegeben.

DemandCoverageViolation

Gibt den Verstoß zur Nachfrageabdeckung für das angegebene Intervall an. Der Bedarf an Mitarbeitenden ist während des gesamten angegebenen Intervalls gleich.

JSON-Darstellung
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Felder
startDateTime

object (DateTime)

Startdatum und -zeit des Nachfrageintervalls (einschließlich). Dieser Wert wird minutengenau angegeben.

endDateTime

object (DateTime)

Enddatum und -zeit des Nachfrageintervalls (ausschließlich). Dieser Wert wird minutengenau angegeben.

coverageViolation

integer

Verletzung der Abdeckung während des angegebenen Intervalls. Ein positiver Wert bedeutet, dass die Nachfrage überdeckt ist, ein negativer Wert, dass die Nachfrage zu wenig abgedeckt ist.