Method: scheduling.solveShiftGeneration

Rozwiązuje problem generowania zmian z podanego elementu SolveShiftGenerationRequest przez generowanie korekt z określonych szablonów zmian w celu zaspokojenia zapotrzebowania pracowników.

Żądanie HTTP

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

Adres URL używa składni transkodowania gRPC.

Treść żądania

Treść żądania zawiera dane o następującej strukturze:

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

object (SolverConfig)

Opcjonalnie: Parametry rozwiązania.

shiftTemplates[]

object (ShiftTemplate)

Wymagane. Zestaw szablonów zmian określających reguły generowania zmian.

employeeDemands[]

object (EmployeeDemand)

Wymagane. Łączny popyt, jaki muszą pokryć zmiany wygenerowane przez firmę shiftTemplates.

Treść odpowiedzi

Odpowiedź na problem z generowaniem zmian. Jeśli zwrócona funkcja solutionStatus ma wartość SOLVED, to w funkcji employeeSchedules jest zwracany zestaw prawidłowych przesunięć wygenerowanych przez rozwiązanie. W przypadku prawidłowego harmonogramu zmian obowiązują następujące właściwości:

  1. Każda zmiana wygenerowana w employeeSchedules jest zgodna z regułami określonymi w dokumencie ShiftTemplate.
  2. Każde zdarzenie wybrane na każdej zmianie jest zgodne z regułami określonymi w dokumencie ShiftTemplate.Event.
  3. Łączna liczba pracowników przypisanych do zbioru zmian wygenerowanych na podstawie tego samego szablonu Shift nie przekracza maximumEmployeeCount tego szablonu.
  4. Zbiór przypisanych pracowników zaspokaja zapotrzebowanie w każdym przedziale czasu.

W przypadku powodzenia treść żądania zawiera dane o następującej strukturze:

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

enum (ShiftGenerationSolutionStatus)

Stan zwróconego rozwiązania. Jeśli solutionStatus nie ma wartości SOLVED, pole employeeSchedules jest puste.

employeeSchedules[]

object (EmployeeSchedule)

Zestaw zmian wygenerowanych przez narzędzie do rozwiązywania problemów wraz z liczbą pracowników przypisanych do każdego harmonogramu.

demandCoverageViolations[]

object (DemandCoverageViolation)

Przypadki naruszenia zasięgu popytu na podstawie przypisanego elementu employee_counts w: employeeSchedules. Dane employeeDemands podane w żądaniu są zagregowane – jeśli 2 przedziały employee_demand się nakładają, żądanie jest sumowane w pokrywającej się części tego przedziału.

SolverConfig

Określa dodatkowe parametry potrzebne do rozwiązania problemu z generowaniem zmian.

Zapis JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Pola
timeLimit

string (Duration format)

Maksymalny czas, który musi poświęcić na rozwiązanie problemu. Jeśli nie zostanie skonfigurowana, domyślna wartość to 1 minuta. Wybór limitu czasu powinien zależeć od skali problemu. Dla przykładu: gdy rozwiązujemy 7-dniową instancję z 2 ShiftTemplates, każde z około 20 możliwymi czasami rozpoczęcia i 2 wydarzeniami z ok. 30 możliwymi czasami rozpoczęcia oraz 2 dni przerwy w tygodniu, zalecane wartości to: <10 s w przypadku szybkich rozwiązań (i prawdopodobnie nieoptymalne), (10 s, 300 s) dla rozwiązań wysokiej jakości i ponad 300 s w przypadku kompleksowych wyszukiwań. Większe instancje mogą wymagać dłuższych limitów czasu.

Ta wartość nie jest sztywnym ograniczeniem i nie uwzględnia nakładów związanych z komunikacją. Przewidywany czas oczekiwania na rozwiązanie problemu może nieznacznie przekroczyć tę wartość.

Czas trwania w sekundach składający się z maksymalnie 9 cyfr po przecinku, kończący się cyfrą „s”. Przykład: "3.5s".

multiDaySchedule

boolean

Jeśli zasada ma wartość prawda, funkcja rozwiązania generuje EmployeeSchedule z kilkoma zmianami (np. w celu wygenerowania tygodniowego harmonogramu). W przeciwnym razie każde pole EmployeeSchedule zawiera dokładnie 1 zmianę. W harmonogramach wielodniowych zakłada się, że godzina rozpoczęcia zmiany jest taka sama w poszczególnych dniach, a liczba dni wolnych od pracy w takim harmonogramie jest określana przez szablony zmian. Wartość domyślna to false (fałsz).

shiftEventsCanChange

boolean

Jeśli wartość to prawda, wielodniowe zdarzenia EmployeeSchedule mogą obejmować zmiany, w przypadku których czas rozpoczęcia i zakończenia zdarzeń ich wydarzeń różnią się we wszystkich dniach. W przeciwnym razie wszystkie zmiany w określonym EmployeeSchedule muszą mieć ten sam czas rozpoczęcia i zakończenia wydarzenia. W obu przypadkach wszystkie zmiany w harmonogramie wielodniowym mają tę samą godzinę rozpoczęcia i zakończenia. W związku z tym ten parametr jest ignorowany, jeśli multiDaySchedule ma wartość fałsz. Ustawienie tego parametru na wartość true może wydłużyć czas rozwiązywania problemów. Wartość domyślna to false (fałsz).

ShiftTemplate

Szablon określający reguły generowania zmian. Zmiana to jednostka pracy, która określa godzinę rozpoczęcia i zakończenia. Może ona zawierać zdarzenia (np. obiad, przerwy itp.). Zmiana zostanie przypisana w odpowiedzi do konkretnej daty.

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

string

Unikalny identyfikator tego szablonu.

earliestStartTime

object (TimeOfDay)

Najwcześniejsza godzina, o której może rozpocząć się zmiana. Wartość tę określa się za pomocą godzin i minut. i nanos są ignorowane.

latestStartTime

object (TimeOfDay)

Najpóźniejszy czas rozpoczęcia zmiany. Wartość tę określa się za pomocą godzin i minut. i nanos są ignorowane. Jeśli ta wartość jest mniejsza niż earliestStartTime, przesunięcie generowane przez ten szablon może rozpocząć się przed północą lub później.

durationMinutes

integer

Stały czas trwania zmiany wygenerowanej przez ten szablon.

startTimeIncrementMinutes

integer

Przyrost czasu (w minutach) używany do wygenerowania zestawu możliwych czasów rozpoczęcia między earliestStartTime a latestStartTime. Jeśli np. najwcześniejsza godzina rozpoczęcia to 8:00, najpóźniejsza godzina rozpoczęcia to 8:30, a jej zmiana wynosi 10 minut, wtedy wszystkie możliwe godziny rozpoczęcia w tym szablonie zmiany to: 8:00, 8:10, 8:20 i 8:30.

daysOffCountPerWeek

integer

Stała liczba dni w tygodniu. Pracownik ma dzień wolny, jeśli nie został przydzielony na zmianę rozpoczynającą się tego dnia. Tydzień zaczyna się w niedzielę i trwa 7 dni.

eventTemplates[]

object (EventTemplate)

Reguły generowania zdarzeń na każdą zmianę. Każde określone zdarzenie obejmuje dokładnie 1 zdarzenie.

minimumIntereventGapMinutes

integer

Minimalna liczba minut między końcem jednego wydarzenia a początkiem następnego.

maximumEmployeeCount

integer

Maksymalna liczba pracowników, których można przypisać do wszystkich zmian wygenerowanych przez ten szablon.

TimeOfDay

Przedstawia porę dnia. Data i strefa czasowa są nieistotne lub zostały określone w innym miejscu. Interfejs API może zezwolić na sekundy przestępne. Podobne typy to google.type.Date i google.protobuf.Timestamp.

Zapis JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Pola
hours

integer

Godziny dnia w formacie 24-godzinnym. Wartość powinna mieścić się w zakresie od 0 do 23. Interfejs API może zezwolić na wartość „24:00:00” w takich sytuacjach jak zamknięcie firmy.

minutes

integer

Minuty dnia. Wartość musi mieścić się w przedziale od 0 do 59.

seconds

integer

Sekundy czasu trwania. Zwykle musi mieścić się w zakresie od 0 do 59. Interfejs API może akceptować wartość 60, jeśli zezwala na użycie sekund przestępnych.

nanos

integer

Ułamki sekund w nanosekundach. Musi mieścić się w przedziale od 0 do 999 999 999.

EventTemplate

Szablon określający reguły generowania pojedynczego zdarzenia, które wystąpi podczas zmiany. Wydarzenie może reprezentować spotkanie, przerwę, lunch itp.

Zapis JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Pola
id

string

Unikalny identyfikator tego szablonu.

minimumMinutesAfterShiftStart

integer

Minimalna liczba minut po rozpoczęciu zmiany, przez którą to zdarzenie może się rozpocząć.

maximumMinutesAfterShiftStart

integer

Maksymalna liczba minut po rozpoczęciu zmiany, przez którą to zdarzenie może się rozpocząć.

durationMinutes

integer

Stały czas trwania tego wydarzenia (w minutach).

startTimeIncrementMinutes

integer

Przyrost czasu (w minutach) używany do wygenerowania zestawu możliwych czasów rozpoczęcia zdarzeń między minimumMinutesAfterShiftStart a maximumMinutesAfterShiftStart. Jeśli na przykład minimalna liczba minut po rozpoczęciu zmiany wynosi 30 minut, maksymalna liczba minut po rozpoczęciu zmiany to 45, a czas rozpoczęcia wynosi 5 minut, zdarzenie może nastąpić 30, 35, 40 lub 45 minut po rozpoczęciu zmiany.

EmployeeDemand

Określa liczbę pracowników wymaganych do zaspokojenia zapotrzebowania w danym przedziale czasowym DateTime.

Zapis JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Pola
startDateTime

object (DateTime)

Początek przedziału czasu dla danego żądania (włącznie). Wartości te są odczytywane z dokładnością do minuty. a wszystkie mniejsze są ignorowane.

endDateTime

object (DateTime)

Koniec przedziału czasu dla danego żądania (z wyłączeniem). Wartości te są odczytywane z dokładnością do minuty. a wszystkie mniejsze są ignorowane.

employeeCount

integer

Liczba pracowników potrzebna do pokrycia zapotrzebowania w tym przedziale czasu.

ShiftGenerationSolutionStatus

Stan rozwiązania podany w odpowiedzi rozwiązania.

Wartości w polu enum
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Nieokreślony stan odpowiedzi.
SHIFT_GENERATION_SOLVED Rozwiązanie znalazło rozwiązanie w podanym terminie.
SHIFT_GENERATION_NOT_SOLVED Wystąpił problem, który uniemożliwił działanie rozwiązania przez zmianę.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Nie udało się wygenerować zmian, aby uwzględnić popyt w podanym terminie.

EmployeeSchedule

Uporządkowana lista zmian odpowiadających pojedynczemu elementowi ShiftTemplate, który ma zostać przypisany do określonej liczby pracowników.

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

string

Identyfikator szablonu, który został użyty do wygenerowania tego zbioru zmian.

shifts[]

object (ShiftWithEvents)

Lista zmian, do których przypisano employeeCount pracowników. Zmiany i wydarzenia wybrane do harmonogramu zostały wygenerowane na podstawie jednego szablonu. Zmiany są sortowane chronologicznie i nie nakładają się na siebie. Jeśli zasada SolverConfig.multi_day_schedule ma wartość prawda, dzień wolny jest domyślnie reprezentowany przez brak zmiany, która zaczyna się tego dnia.

employeeCount

integer

Liczba pracowników, którzy powinni zostać przypisani do danego zestawu zmian, aby obsłużyć zapotrzebowanie.

ShiftWithEvents

Określa datę rozpoczęcia i zakończenia oraz listę stałych zdarzeń przesunięcia wygenerowanego przez rozwiązanie.

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

object (DateTime)

Data i godzina rozpoczęcia zmiany. Ta wartość jest określana z dokładnością do minuty. sekund i mniejszych jednostek.

endDateTime

object (DateTime)

Data i godzina zakończenia zmiany. Ta wartość jest określana z dokładnością do minuty. sekund i mniejszych jednostek.

events[]

object (Event)

Lista zdarzeń uwzględnionych w tej zmianie, zmapowana dokładnie na zdarzenia ShiftTemplate.Event (i w tej samej kolejności). Jeśli SolverConfig.shift_events_can_change ma wartość prawda, godziny rozpoczęcia i zakończenia wydarzeń mogą być różne we wszystkich strefach ShiftWithEvents tego harmonogramu.

Zdarzenie

Określa datę i godzinę rozpoczęcia i zakończenia określonego zdarzenia w przesunięciu wygenerowanym przez rozwiązanie.

Zapis JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Pola
eventTemplateId

string

Identyfikator szablonu, który został użyty do wygenerowania tego zdarzenia.

startDateTime

object (DateTime)

Data i godzina rozpoczęcia wydarzenia. Ta wartość jest określana z dokładnością do minuty. sekund i mniejszych jednostek.

endDateTime

object (DateTime)

Data i godzina zakończenia wydarzenia. Ta wartość jest określana z dokładnością do minuty. sekund i mniejszych jednostek.

DemandCoverageViolation

Określa naruszenie pokrycia popytu w danym przedziale czasu. Popyt pracowników jest taki sam w całym określonym przedziale czasu.

Zapis JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Pola
startDateTime

object (DateTime)

Data i godzina rozpoczęcia interwału popytu (włącznie). Ta wartość jest określana z dokładnością do minuty.

endDateTime

object (DateTime)

Data i godzina zakończenia przedziału popytu (bez jej uwzględnienia). Ta wartość jest określana z dokładnością do minuty.

coverageViolation

integer

Naruszenie zakresu w określonym przedziale czasu. Wartość dodatnia oznacza, że popyt jest przesadzony, a wartość ujemna, że popyt jest niewystarczający.