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产生的班次需要涵盖的员工需求总量。

响应正文

对 Shift 生成问题的响应。如果返回的 solutionStatusSOLVED,系统会在 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)

基于指定employeeSchedules中的指定employee_counts,需求覆盖率违规。请求中指定的 employeeDemands 会进行汇总 - 如果两个 employee_demand 区间重叠,则需求的总和将与区间的重叠部分相加。

SolverConfig

指定用于解决 Shift 生成问题的其他参数。

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

string (Duration format)

求解器应该在解题上花费的时间上限。如果未设置,则默认为 1 分钟。时间限制的选择应取决于问题的规模。举个例子,在解决一个包含 2 个 ShiftTemplates 的 7 天实例时,每个实例都有大约 20 个可能的开始时间,每个事件都有大约 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)

活动的结束日期和时间。该值精确到分钟,未指定秒数和更小的单位。

DemandCoverageViolation

指定给定时间间隔内的需求覆盖率违规情况。在整个指定的时间间隔内,员工需求是相同的。

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

object (DateTime)

需求间隔的开始日期和时间(含)。此值精确到分钟。

endDateTime

object (DateTime)

需求间隔的结束日期(不含)。此值精确到分钟。

coverageViolation

integer

指定时间间隔内的覆盖范围违规。正值表示需求被覆盖,负值表示需求被低估。