Method: scheduling.solveShiftGeneration

従業員の需要を満たすために、特定のシフト テンプレートからシフトを生成することで、指定された SolveShiftGenerationRequest からのシフト生成問題を解きます。

HTTP リクエスト

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

この URL は gRPC Transcoding 構文を使用します。

リクエストの本文

リクエストの本文には、次の構造のデータが含まれます。

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)

指定された employeeSchedules に割り当てられた employee_counts に基づくデマンド カバレッジ違反。リクエストで指定された employeeDemands は集計されます。2 つの employee_demand 間隔が重複する場合、デマンドは間隔の重複部分で合計されます。

SolverConfig

シフト生成の問題を解決するための追加のパラメータを指定します。

JSON 表現
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
フィールド
timeLimit

string (Duration format)

解法が問題に費やす最大時間。設定しない場合、デフォルトは 1 分です。制限時間は、問題の規模に応じて選択する必要があります。たとえば、2 つの ShiftTemplates で 7 日間のインスタンスを解き、それぞれ開始時間が 20 回程度、イベントを 30 回程度で 2 つのイベントを開催し、週に 2 日休ませる場合、推奨値は、高速なソリューションの場合は 10 秒未満(最適ではない可能性が高い)、高品質のソリューションの場合は(10 秒、300 秒)、網羅的な検索の場合は 300 秒超です。インスタンスのサイズが大きいほど、制限時間が長くなる可能性があります。

この値はハードリミットではなく、通信のオーバーヘッドを考慮していません。問題を解決するために予想されるレイテンシは、この値をわずかに超えることがあります。

s で終わる小数 9 桁までの秒単位の期間。例: "3.5s"。

multiDaySchedule

boolean

true の場合、ソルバーは複数のシフトを含む EmployeeSchedule を生成します(1 週間のスケジュールを生成する場合など)。それ以外の場合、各 EmployeeSchedule には 1 つのシフトが含まれます。複数日のスケジュールは、シフトの開始時刻が複数の日にわたって同じであることを想定し、このようなスケジュールの休日の数はシフト テンプレートによって決まります。デフォルトは 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)

シフトを開始する最も早い時刻。この値は時間と分で指定します。秒と nano は無視されます。

latestStartTime

object (TimeOfDay)

シフトを開始する最後の時刻。この値は時間と分で指定します。秒と nano は無視されます。この値が earliestStartTime よりも小さい場合、このテンプレートによって生成されたシフトは、午前 0 時の前または後に開始する可能性があります。

durationMinutes

integer

このテンプレートによって生成されたシフトの固定期間。

startTimeIncrementMinutes

integer

earliestStartTime~latestStartTime の間の使用可能な開始時間のセットを生成するために使用される時間増分(分)。たとえば、最も早い開始時間が 8:00、最も遅い開始時間が 8:30、開始時間の増分が 10 分の場合、このシフト テンプレートで使用可能なすべての開始時間は 8:00、8:10、8:20、8:30 になります。

daysOffCountPerWeek

integer

1 週間の休日日数は固定されています。従業員がその日に始まるシフトに割り当てられていない場合、その日は休みになります。1 週間は 7 日間で、日曜日から始まります。

eventTemplates[]

object (EventTemplate)

シフトごとにイベントを生成するためのルール。指定した各イベントのシフトごとに、1 つのイベントのみが含まれます。

minimumIntereventGapMinutes

integer

イベントの終了から次のイベントの開始までの時間の最小値(分)。

maximumEmployeeCount

integer

このテンプレートで生成されたすべてのシフトに割り当てることができる従業員の最大数。

TimeOfDay

1 日のうちの時刻を表します。日付とタイムゾーンは重要ではないか、他の場所で指定されています。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 である必要があります。

EventTemplate

シフト中に発生する単一のイベントを生成するためのルールを指定するテンプレート。イベントは、会議、休憩、昼食などを表します。

JSON 表現
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
フィールド
id

string

このテンプレートの一意の ID。

minimumMinutesAfterShiftStart

integer

シフトを開始してからこのイベントを開始できる最短時間(分)。

maximumMinutesAfterShiftStart

integer

シフトを開始してからこのイベントを開始できる最大時間(分)。

durationMinutes

integer

このイベントの固定期間(分単位)。

startTimeIncrementMinutes

integer

一連のイベント開始時間(minimumMinutesAfterShiftStart~maximumMinutesAfterShiftStart)を生成するために使用される時間間隔(分単位)。たとえば、シフト開始後の最小分が 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

複数の従業員に割り当てる 1 つの 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 と終了 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

指定した間隔でのカバレッジ違反。正の値は需要が過大であることを示し、負の値は需要が過小に含まれていることを示します。