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 不是 SOLVEDemployeeSchedules 會是空白的。

employeeSchedules[]

object (EmployeeSchedule)

解題工具產生的輪班名單,以及指派給每個時間表的員工人數。

demandCoverageViolations[]

object (DemandCoverageViolation)

根據指定employeeSchedules中獲派的employee_counts,需求涵蓋率違規問題。系統會匯總要求中提供的 employeeDemands。如果兩個 employee_demand 間隔重疊,系統會將需求加總並計入時間間隔的重疊部分。

SolverConfig

指定其他參數以解決位移產生問題。

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

string (Duration format)

解題工具應在問題上花費的時間上限。如果未設定,預設為 1 分鐘。選擇時間限制應取決於問題的大小。舉例來說,如果要用 2 ShiftTemplates 解析 7 天的執行個體,每個可能的開始時間為 20 個,且每個事件的開始時間約為 30,且每週會關閉兩天,建議值為 <10 秒 (可能不夠理想),建議值為 10 秒 (可能不夠理想),搜尋品質最好時 10 秒、300 秒以上;針對一個 300 秒,則針對某個搜尋提供 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

說明在指定日期時間間隔內滿足需求的員工人數。

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 中不同。

活動

在解題工具產生的偏移中,指定特定事件的開始與結束 DateTime。

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

在指定時間範圍內違反涵蓋率政策。正值表示需求遭到忽略,負值則代表需求未涵蓋。