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 中產生的每個 Shift 都會遵循對應的 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 產生問題的其他參數。

JSON 表示法
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
欄位
timeLimit

string (Duration format)

解題工具應花費多少時間處理問題。如果未設定,預設值為 1 分鐘。請根據問題大小,選擇適用的時間限制。舉例來說,假設解決一個為期 7 天的 ShiftTemplates 執行個體,每個值約 20 個,且每個事件的開始時間可能約 20,且每週有 20 天,建議值為:< 10 秒 (快速解決方案且可能不具最佳效能) 為 10 秒和 300 秒,以提供優質搜尋解決方案。較大型的執行個體可能需要較長的時間限制。

這個值並非硬性限制,也不會影響通訊費用。解決問題的預期延遲時間可能會稍微超過這個值。

時間長度以秒為單位,最多可有 9 個小數位數,並結尾為「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)

一天當中的最早時間。這個值是以小時和分鐘指定,會忽略秒數和 nanos。

latestStartTime

object (TimeOfDay)

一天內輪班可開始的最晚時間。這個值是以小時和分鐘指定,會忽略秒數和 nanos。如果這個值小於 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 允許閏秒,則可允許值為 60。

nanos

integer

秒數的小數,以奈秒為單位。值必須介於 0 到 999,999,999 之間。

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

指定在指定 DateTime 間隔內,滿足需求的員工人數。

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 員工人數的輪班清單。系統會從單一範本產生所選時間表的 Shift 和事件。調節作業會依時間順序排序,且不會重疊。如果 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.Events 完全相同,並按照相同順序對應。如果 SolverConfig.shift_events_can_change 為 true,則事件開始和結束時間可能在這個時間表的所有ShiftWithEvents中不同。

活動

指定解題工具產生的 Shift 值,藉此指定特定事件的開始和結束時間。

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

string

用於產生此事件的範本 ID。

startDateTime

object (DateTime)

活動的開始日期和時間。這個值指定為「分鐘」;沒有提供秒及較小的單位。

endDateTime

object (DateTime)

活動的結束日期和時間。這個值指定為「分鐘」;沒有提供秒及較小的單位。