Method: scheduling.solveShiftGeneration

通过根据给定的班次模板生成班次,以满足员工需求,从而解决给定 SolveShiftGenerationRequest 中的班次生成问题。

HTTP 请求

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

网址采用 gRPC 转码语法。

请求正文

请求正文中包含结构如下的数据:

JSON 表示法
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
字段
solverConfig

object (SolverConfig)

可选。求解器的参数。

shiftTemplates[]

object (ShiftTemplate)

必需。一组班次模板,用于指定班次生成规则。

employeeDemands[]

object (EmployeeDemand)

必需。shiftTemplates产生的轮班需要覆盖的员工总需求。每个 EmployeeDemand 中指定的 DateTime 间隔必须是不相交的,并且不能相邻。

响应正文

对 Shift 键生成问题的响应。如果返回的 solutionStatusSOLVED,则 employeeSchedules 中会返回由求解器生成的一组有效偏移。为了实现有效的轮班安排,您需要具备以下属性:

  1. employeeSchedules 中生成的每次偏移都遵循相应 ShiftTemplate 中指定的规则。
  2. 每次调整中选择的每个事件都遵守相应 ShiftTemplate.Event 中指定的规则。
  3. 根据同一个 ShiftTemplate 生成一组轮班的员工总数不超过该模板的 maximumEmployeeCount
  4. 所分配的员工组会按一定的时间间隔满足客户的需求。

如果成功,响应正文将包含结构如下的数据:

JSON 表示法
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ]
}
字段
solutionStatus

enum (ShiftGenerationSolutionStatus)

所返回解决方案的状态。如果 solutionStatus 不是 SOLVEDemployeeSchedules 将为空。

employeeSchedules[]

object (EmployeeSchedule)

求解器生成的一组班次,以及分配给每个时间表的员工数。

SolverConfig

指定用于解决“Shift Generation”问题的其他参数。

JSON 表示法
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
字段
timeLimit

string (Duration format)

求解器在问题上花费的时间上限。如果未设置,则默认为 1 分钟。时间限制的选择应取决于问题的规模。举个例子,当使用 2 个 ShiftTemplates 处理一个 7 天的实例时,每个实例都有大约 20 个可能的开始时间,并举办 2 个活动,开始时间约为 30 天,每周休息两天。建议值为:<10 秒(适用于快速解决方案,可能不太理想),10 秒、300 秒)(适用于优质解决方案)和 300 秒以上(适用于执行详尽搜索)。较大的实例可能需要更长的时间限制。

这个值不是硬性限制,也没有考虑通信开销。解决该问题的预期延迟时间可能会略微超过此值。

此时长以秒为单位,最多包含九个小数位,以“s”结尾。示例:"3.5s"

multiDaySchedule

boolean

如果为 true,求解器会生成包含多项偏移的 EmployeeSchedule(例如,生成为期一周的时间表)。否则,每个 EmployeeSchedule 都只包含一个偏移。多日时间表会假定轮班的开始时间在各天相同,并且此类时间表中的休假天数由轮班模板决定。默认值为 false。

shiftEventsCanChange

boolean

如果为 true,多日 EmployeeSchedule 可能会包含轮班,即其活动的开始时间和结束时间在每一天都有所差异。否则,特定 EmployeeSchedule 的所有班次都必须具有相同的事件开始时间和结束时间。无论是哪种情况,多日时间表中的所有班次都会具有相同的开始和结束时间。因此,如果 multiDaySchedule 为 false,此参数会被忽略。将此参数设置为 true 可能会导致求解时间变长。默认值为 false。

ShiftTemplate

指定生成偏移的规则的模板。轮班是指定开始时间和结束时间的工作单元,可能会包含活动(如午餐、休息等)。系统会在回复中的特定日期分配偏移。

JSON 表示法
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
字段
id

string

此模板的唯一 ID。

earliestStartTime

object (TimeOfDay)

一天中开始轮班的最早时间。此值使用小时和分钟指定;系统会忽略秒和纳米。

latestStartTime

object (TimeOfDay)

一天中可以开始调整的最晚时间。此值使用小时和分钟指定;系统会忽略秒和纳米。如果此值小于 earliestStartTime,则此模板生成的偏移可能会在午夜之前或之后开始。

durationMinutes

integer

此模板生成的偏移的固定时长。

startTimeIncrementMinutes

integer

用于生成一组可能的开始时间(介于 earliestStartTimelatestStartTime 之间)的时间增量(以分钟为单位)。例如,如果最早的开始时间是 8:00,最晚的开始时间是 8:30,开始时间增量是 10 分钟,那么此轮班模板的所有可能开始时间为:8:00、8:10、8:20 和 8:30。

daysOffCountPerWeek

integer

每周固定的休息天数。如果员工没有分配到从当天开始的轮班,则该员工可以休息。一周为 7 天,从星期日开始。

eventTemplates[]

object (EventTemplate)

用于为每个班次生成事件的规则。对于指定的每个事件,每个班次将只包含一个事件。

minimumIntereventGapMinutes

integer

一项活动结束和下一项活动开始之间的最短分钟数。

maximumEmployeeCount

integer

此模板生成的所有班次可分配的员工数量上限。

TimeOfDay

表示一天中的某个时间。日期和时区不重要,或在别处指定。API 可以选择允许闰秒。相关类型为 google.type.Dategoogle.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 允许闰秒,则 API 可以允许 60 一值。

nanos

integer

秒数的小数部分(以纳秒为单位)。值必须是介于 0 和 999999999 之间的数字。

EventTemplate

模板,用于指定生成轮班期间发生的单个事件的规则。活动可能表示会议、休息、午餐等。

JSON 表示法
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
字段
id

string

此模板的唯一 ID。

minimumMinutesAfterShiftStart

integer

轮班开始后,此事件可以开始的最短分钟数。

maximumMinutesAfterShiftStart

integer

轮班开始后,此事件可以开始的分钟数上限。

durationMinutes

integer

此事件的固定时长(以分钟为单位)。

startTimeIncrementMinutes

integer

用于生成一组可能的事件开始时间的时间增量(以分钟为单位),介于 minimumMinutesAfterShiftStartmaximumMinutesAfterShiftStart 之间。例如,如果轮班开始后的最短分钟数为 30,开始轮班后最长的分钟数为 45,而开始时间增量为 5 分钟,那么事件可能会在轮班开始后 30、35、40 或 45 分钟内发生。

EmployeeDemand

指定在给定日期时间间隔内满足需求所需的员工数。

JSON 表示法
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
字段
startDateTime

object (DateTime)

指定需求(含边界值)的时间范围的开始时间。这些值会读到分钟;秒和所有较小的单位都会被忽略。

endDateTime

object (DateTime)

指定需求(不含边界)的时间间隔结束值。这些值会读到分钟;秒和所有较小的单位都会被忽略。

employeeCount

integer

满足此间隔期间的需求所需的员工数。

ShiftGenerationSolutionStatus

求解器响应中提供的解状态。

枚举
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED 未指定的响应状态。
SHIFT_GENERATION_SOLVED 求解器在规定的时间内找到了解决方案。
SHIFT_GENERATION_NOT_SOLVED 某个问题导致求解器无法产生位移。
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED 无法在指定时间内按需求调整预算。

EmployeeSchedule

一个有序排班列表,对应于要分配给多个员工的单个 ShiftTemplate

JSON 表示法
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
字段
shiftTemplateId

string

用于生成此组偏移的模板的 ID。

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,且顺序相同。如果 SolverConfig.shift_events_can_change 为 true,则在此时间表的所有 ShiftWithEvents 中,活动的开始时间和结束时间可能会有所不同。

事件

指定求解器生成的偏移中特定事件的开始和结束日期时间。

JSON 表示法
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
字段
eventTemplateId

string

用于生成此事件的模板的 ID。

startDateTime

object (DateTime)

事件的开始日期和时间。该值精确到分钟;不提供秒和更小的单位。

endDateTime

object (DateTime)

活动的结束日期和时间。该值精确到分钟;不提供秒和更小的单位。