Method: scheduling.solveShiftGeneration

Решает проблему создания смен на основе заданного SolveShiftGenerationRequest путем создания смен на основе заданных шаблонов смен, чтобы удовлетворить спрос сотрудников.

HTTP-запрос

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

URL-адрес использует синтаксис транскодирования gRPC .

Тело запроса

Тело запроса содержит данные следующей структуры:

JSON-представление
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Поля
solverConfig

object ( SolverConfig )

Необязательный. Параметры решателя.

shiftTemplates[]

object ( ShiftTemplate )

Необходимый. Набор шаблонов смен, определяющих правила формирования смен.

employeeDemands[]

object ( EmployeeDemand )

Необходимый. Общий спрос сотрудников, который необходимо покрыть сменами, созданными с помощью shiftTemplates .

Тело ответа

Ответ на проблему генерации смен. Если возвращенный solutionStatus имеет значение SOLVED , то набор допустимых сдвигов, сгенерированных решателем, возвращается в employeeSchedules . Для действительного графика смен сохраняются следующие свойства:

  1. Каждая смена, созданная в employeeSchedules соответствует правилам, указанным в соответствующем ShiftTemplate .
  2. Каждое событие, выбранное в каждой смене, соответствует правилам, указанным в соответствующем ShiftTemplate.Event .
  3. Общее количество сотрудников, назначенных набору смен, созданному на основе одного и того же ShiftTemplate, не превышает maximumEmployeeCount этого шаблона.
  4. Набор назначенных сотрудников покрывает спрос в каждый заданный интервал.

В случае успеха тело ответа содержит данные следующей структуры:

JSON-представление
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Поля
solutionStatus

enum ( ShiftGenerationSolutionStatus )

Статус возвращенного решения. Если solutionStatus не SOLVED , employeeSchedules будут пустыми.

employeeSchedules[]

object ( EmployeeSchedule )

Набор смен, созданный решателем, а также количество сотрудников, назначенных каждому графику.

demandCoverageViolations[]

object ( DemandCoverageViolation )

Нарушения покрытия спроса на основе назначенных employee_counts в заданных employeeSchedules . employeeDemands , заданные в запросе, агрегируются: если два интервала employee_demand перекрываются, спрос суммируется по перекрывающейся части интервала.

SolverConfig

Задает дополнительные параметры для решения проблемы создания смен.

JSON-представление
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Поля
timeLimit

string ( Duration format)

Максимальное время, которое решатель должен потратить на решение задачи. Если не установлено, по умолчанию — 1 минута. Выбор срока должен зависеть от масштаба проблемы. В качестве примера: при решении 7-дневного экземпляра с двумя шаблонами ShiftTemplates , каждый из которых имеет ~20 возможных времен начала, и проведением 2 мероприятий с ~30 возможными временами начала и двумя выходными в неделю, рекомендуемые значения: <10 с для быстрых решений. (и, вероятно, неоптимально), (10, 300) для решений хорошего качества и >300 для исчерпывающего поиска. Для более крупных экземпляров могут потребоваться более длительные сроки.

Это значение не является жестким пределом и не учитывает накладные расходы на связь. Ожидаемая задержка решения проблемы может немного превышать это значение.

Длительность в секундах, содержащая до девяти дробных цифр и оканчивающаяся на « s ». Пример: "3.5s" .

multiDaySchedule

boolean

Если принимает значение true, решатель генерирует EmployeeSchedule , включающие несколько смен (например, для создания недельного расписания). В противном случае каждое EmployeeSchedule включает ровно одну смену. Многодневные графики предполагают, что время начала смены одинаково для всех дней, а количество выходных дней в таком графике определяется шаблонами смен. По умолчанию — ложь.

shiftEventsCanChange

boolean

Если это правда, то многодневные EmployeeSchedule могут включать смены, для которых время начала и окончания событий различается в течение всех дней. В противном случае все смены определенного EmployeeSchedule должны иметь одно и то же время начала и окончания события. В любом случае все смены многодневного графика имеют одинаковое время начала и окончания. Таким образом, этот параметр игнорируется, если multiDaySchedule имеет значение false. Установка для этого параметра значения true может привести к увеличению времени решения. По умолчанию — ложь.

ShiftШаблон

Шаблон, задающий правила формирования смен. Смена — это единица работы, которая определяет время начала и окончания и может содержать события (например, обед, перерывы и т. д.). В ответе смена будет назначена на конкретную дату.

JSON-представление
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
Поля
id

string

Уникальный идентификатор этого шаблона.

earliestStartTime

object ( TimeOfDay )

Самое раннее время дня, когда может начаться смена. Это значение указывается в часах и минутах; секунды и нано игнорируются.

latestStartTime

object ( TimeOfDay )

Самое позднее время в течение дня, когда может начаться смена. Это значение указывается в часах и минутах; секунды и нано игнорируются. Если это значение меньше, чем earliestStartTime , то смена, созданная этим шаблоном, может начаться до или после полуночи.

durationMinutes

integer

Фиксированная продолжительность смены, созданная этим шаблоном.

startTimeIncrementMinutes

integer

Приращение времени (в минутах), используемое для создания набора возможных времен начала между earliestStartTime и latestStartTime . Например, если самое раннее время начала — 8:00, самое позднее время начала — 8:30, а приращение времени начала — 10 минут, то все возможные времена начала для этого шаблона смены: 8:00, 8:10, 8:20 и 8:30.

daysOffCountPerWeek

integer

Фиксированное количество выходных в неделю. Сотруднику предоставляется выходной, если он не назначен на смену, начинающуюся в этот день. Неделя состоит из 7 дней и начинается в воскресенье.

eventTemplates[]

object ( EventTemplate )

Правила генерации событий для каждой смены. В каждую смену для каждого указанного события будет включено ровно одно событие.

minimumIntereventGapMinutes

integer

Минимальное количество минут между окончанием одного события и началом следующего.

maximumEmployeeCount

integer

Максимальное количество сотрудников, которое можно назначить на все смены, созданные с помощью этого шаблона.

ВремяДня

Обозначает время суток. Дата и часовой пояс либо не имеют значения, либо указаны в другом месте. API может разрешить високосные секунды. Связанные типы: google.type.Date и google.protobuf.Timestamp .

JSON-представление
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Поля
hours

integer

Часы суток в 24-часовом формате. Должно быть от 0 до 23. API может разрешить использование значения «24:00:00» для таких сценариев, как время закрытия предприятия.

minutes

integer

Минуты часа дня. Должно быть от 0 до 59.

seconds

integer

Секунды минут времени. Обычно должно быть от 0 до 59. API может допускать значение 60, если он допускает дополнительные секунды.

nanos

integer

Доли секунды в наносекундах. Должно быть от 0 до 999 999 999.

Шаблон события

Шаблон, определяющий правила для создания одного события, происходящего во время смены. Событие может представлять собой встречу, перерыв, обед и т. д.

JSON-представление
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Поля
id

string

Уникальный идентификатор этого шаблона.

minimumMinutesAfterShiftStart

integer

Минимальное количество минут после начала смены, в течение которого может начаться это событие.

maximumMinutesAfterShiftStart

integer

Максимальное количество минут после начала смены, в течение которого может начаться это событие.

durationMinutes

integer

Фиксированная продолжительность этого события в минутах.

startTimeIncrementMinutes

integer

Приращение времени (в минутах), используемое для создания набора возможных времен начала событий между minimumMinutesAfterShiftStart и maximumMinutesAfterShiftStart . Например, если минимальное количество минут после начала смены равно 30, максимальное количество минут после начала смены равно 45, а приращение времени начала составляет 5 минут, событие может произойти через 30, 35, 40 или 45 минут после начала смены. .

Спрос на сотрудников

Указывает количество сотрудников, необходимых для покрытия спроса в заданном интервале DateTime.

JSON-представление
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Поля
startDateTime

object ( DateTime )

Начало временного интервала для данной заявки (включительно). Эти значения считываются с точностью до минуты; секунды, а все меньшие единицы игнорируются.

endDateTime

object ( DateTime )

Окончание временного интервала для данного спроса (эксклюзивного). Эти значения считываются с точностью до минуты; секунды, а все меньшие единицы игнорируются.

employeeCount

integer

Количество сотрудников, необходимое для покрытия спроса за этот интервал.

Статус ShiftGenerationSolution

Статус решения указывается в ответе решателя.

Перечисления
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Неопределенный статус ответа.
SHIFT_GENERATION_SOLVED Решатель нашел решение за отведенное время.
SHIFT_GENERATION_NOT_SOLVED Проблема не позволяла решателю генерировать сдвиги.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Не удалось создать смены для покрытия спроса в установленный срок.

График работы сотрудников

Упорядоченный список смен, соответствующий одному ShiftTemplate , который должен быть назначен нескольким сотрудникам.

JSON-представление
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Поля
shiftTemplateId

string

Идентификатор шаблона, который использовался для создания этого набора смен.

shifts[]

object ( ShiftWithEvents )

Список смен, которым назначено количество employeeCount . Смены и события, выбранные для расписания, были сгенерированы по единому шаблону. Смены отсортированы в хронологическом порядке и не пересекаются. Если SolverConfig.multi_day_schedule имеет значение true, выходной день неявно обозначается отсутствием смены, начинающейся в этот день.

employeeCount

integer

Количество сотрудников, которые должны быть назначены на этот набор смен для покрытия спроса.

ShiftWithEvents

Указывает дату начала и окончания, а также список фиксированных событий смены, созданный решателем.

JSON-представление
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Поля
startDateTime

object ( DateTime )

Дата и время начала смены. Это значение указывается с точностью до минуты; секунды и более мелкие единицы не приводятся.

endDateTime

object ( DateTime )

Дата и время окончания смены. Это значение указывается с точностью до минуты; секунды и более мелкие единицы не приводятся.

events[]

object ( Event )

Список событий, включенных в этот сдвиг, сопоставленных точно и в том же порядке, что и ShiftTemplate.Event s. Если SolverConfig.shift_events_can_change имеет значение true, время начала и окончания событий может различаться для всех ShiftWithEvents этого расписания.

Событие

Указывает начальную и конечную дату и время определенного события в смене, созданной решателем.

JSON-представление
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Поля
eventTemplateId

string

Идентификатор шаблона, который использовался для создания этого события.

startDateTime

object ( DateTime )

Дата и время начала мероприятия. Это значение указывается с точностью до минуты; секунды и более мелкие единицы не приводятся.

endDateTime

object ( DateTime )

Дата и время окончания мероприятия. Это значение указывается с точностью до минуты; секунды и более мелкие единицы не приводятся.

Нарушение покрытия спроса

Указывает нарушение покрытия спроса для данного интервала. Спрос на сотрудников одинаков на протяжении всего заданного интервала.

JSON-представление
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Поля
startDateTime

object ( DateTime )

Дата и время начала интервала спроса (включительно). Это значение указывается с точностью до минуты.

endDateTime

object ( DateTime )

Дата и время окончания интервала спроса (эксклюзивно). Это значение указывается с точностью до минуты.

coverageViolation

integer

Нарушение покрытия в течение указанного интервала. Положительное значение указывает на то, что спрос перекрыт, а отрицательное значение указывает на то, что спрос недостаточно покрыт.