シフトに従業員を割り当てて、特定の SolveShiftSchedulingRequest
からの固定シフトのスケジューリングの問題を解いて、スケジューリング設定が最大化され、スケジュール制約違反が最小限に抑えられます。
HTTP リクエスト
POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling
この URL は gRPC Transcoding 構文を使用します。
リクエストの本文
リクエストの本文には、次の構造のデータが含まれます。
JSON 表現 |
---|
{ "requestId": string, "solveParameters": { object ( |
フィールド | |
---|---|
requestId |
問題またはリクエスト ID。 |
solveParameters |
問題の 1 つの解き方を制御するパラメータ。 |
employees[] |
スケジュール可能なすべての従業員。 |
shifts[] |
スケジュールを作成するすべてのシフト。 |
coverageRequirements[] |
プランニング期間全体のカバレッジ要件。これらは、時間枠またはシフト ID のリストのいずれかにおいて、各役割を担う必要がある従業員、またはスキルを保有する必要がある従業員の数を指定します。適用範囲の要件はすべて、時間枠またはシフト ID のリスト(両方ではなく)で指定する必要があります。カバレッジ要件の期間(指定した場合)を地域ごとに重複させることはできません。これらの各制約のデフォルトの優先度は、ロール要件では |
roleIds[] |
従業員全体で可能なすべてのロールのリスト。各従業員には、シフトに割り当てることができるロールが少なくとも 1 つ必要です。Role は、シフト中に割り当てられた特定の職務を指します(登録看護師、エグゼクティブ シェフ、ウェイターなど)。従業員がシフトに割り当てられると、単一の特定のロールにも割り当てられます。 |
skillIds[] |
従業員全体で獲得し得るすべてのスキルのリスト。スキルとは、従業員が持っている、特定の割り当て可能な職務とは無関係な追加の資格を指します(認定資格、使用言語など)。このリストは空でもかまいません。従業員がシフトに割り当てられると、そのシフトに必要なすべてのスキルを習得する必要があります。 |
locationIds[] |
スケジュール内の一連のシフトに対して考えられるすべてのロケーションのリスト。このリストは空でもかまいません。たとえば、看護師のマネージャーが病院の複数の部門で多数の看護師の勤務スケジュールを設定したい場合や、ホテル マネージャーが複数のホテルにまたがって従業員のスケジュールを設定したい場合などに、異なる場所を指定すると便利です。 |
budgetRequirements[] |
スケジューリングの問題の予算の仕様。これらの各要件のデフォルトの優先度は |
assignmentsHint[] |
割り当てをシフトして、スケジューリングの問題への暫定的な解決策(別名、解答ヒント)として使用する。割り当てできないシフトまたはスケジュール リクエストと割り当てが一致しない場合、割り当てのヒントは無視されます。 |
レスポンスの本文
Workforce Scheduling API に対するレスポンス。各レスポンスで、返された solutionStatus
が NOT_SOLVED_DEADLINE_EXCEEDED
または INFEASIBLE
の場合、shiftAssignments
は空になります。返された solutionStatus
が OPTIMAL
または FEASIBLE
の場合、有効なシフト割り当てが shiftAssignments
で返されます。シフトの割り当てが有効な場合、次のプロパティが保持されます。
- 各従業員 ID は、リクエストで指定された従業員のセットに含まれます。
- 従業員に割り当てられた各ロール ID は、その従業員のロール ID のセットに含まれています。
- 各シフト ID は、リクエストで与えられた一連のシフトに含まれます。
- 各シフト ID は、その従業員の割り当て不可能なシフト ID ではありません。
- 1 人の従業員が、重複する 2 つのシフトに割り当てられることはありません。
- 指定されたスケジュールで、優先度レベル
PRIORITY_MANDATORY
の制約またはリクエストに違反はありません。
成功した場合、レスポンスの本文には次の構造のデータが含まれます。
JSON 表現 |
---|
{ "requestId": string, "solutionStatus": enum ( |
フィールド | |
---|---|
requestId |
このレスポンスが関連付けられているリクエストの ID。 |
solutionStatus |
返されたソリューションのステータス。解答が FEASIBLE または OPTIMAL でない場合、この proto の他のフィールドは空になる可能性があります。ステータスが NOT_SOLVED_DEADLINE_EXCEEDED の場合、実行可能な解決策が見つからなかったり、実行可能な解決策が存在するかどうかを判別することなく、制限時間に達しています。優先度レベル「MANDATORY」の制約をすべて満たすことができない場合、リクエストは不可能なことがあります。 |
shiftAssignments[] |
すべての割り当てのリスト。各 |
statusMessage |
|
SolveParameters
シフト スケジューリング問題の 1 つの解き方を制御するパラメータ。
JSON 表現 |
---|
{ "timeLimit": string } |
フィールド | |
---|---|
timeLimit |
解法が問題に費やす最大時間。設定しない場合、デフォルトは 1 分です。 この値はハードリミットではなく、通信のオーバーヘッドを考慮していません。問題を解決するために予想されるレイテンシは、この値をわずかに超えることがあります。
|
従業員
スケジュールを設定する従業員内の従業員。
JSON 表現 |
---|
{ "id": string, "roleIds": [ string ], "skillIds": [ string ], "shiftPreferences": [ { object ( |
フィールド | |
---|---|
id |
この従業員に割り当てられた一意の ID。 |
roleIds[] |
この従業員が実行できるロール ID。少なくとも 1 つのロールを指定する必要があります。従業員がシフトに割り当てられると、このリストから 1 つのロールにも割り当てられます。この従業員は、スケジュール期間中にさまざまなロールに割り当てられることがあります。 |
skillIds[] |
この従業員が所有しているスキル ID。このリストは空でもかまいません。シフトに割り当てられた従業員は、ここにリストされているスキルのサブセットを使用して、割り当てられたシフト期間全体を通じてスキル要件に対応します。 |
shiftPreferences[] |
この従業員の設定を変更します。ここで指定するシフトは、スケジューリング期間中に従業員に割り当てることを希望するシフトを表します。 |
schedulingConstraints[] |
この従業員のスケジュールの制約のリスト。これらの各制約のデフォルトの優先度は |
resourceConstraints[] |
|
shiftRequests[] |
従業員のシフト リクエストのリスト。特定のシフトに従業員の割り当てをリクエストすることも、割り当てないリクエストを指定することもできます。従業員の固定スケジュール割り当ては、優先度 |
hourlyContract |
従業員の通常勤務と残業時間給を定めた契約。 |
ShiftPreference
特定のシフト ID の数値設定。
JSON 表現 |
---|
{ "shiftId": string, "preference": integer } |
フィールド | |
---|---|
shiftId |
設定が指定されているシフト ID。 |
preference |
優先値が大きいほど、望ましいシフトを示します。 |
SchedulingConstraint
特定の従業員に対する特定のスケジュール制約。指定された制約は、指定された間隔 [startDateTime,
endDateTime)
にのみ適用されます。
JSON 表現 |
---|
{ "priority": enum ( |
フィールド | |
---|---|
priority |
このスケジューリング制約の優先度。すべてのスケジュール制約のデフォルトの優先度は |
startDateTime |
このスケジュール制約が適用される開始時間(両端を含む)。 |
endDateTime |
このスケジュール制約が適用される終了時間(この時間を含まない)。 |
共用体フィールド type 。指定する制約のタイプ。各制約は、上で指定した時間枠内でのみ適用されます。type は次のいずれかになります。 |
|
minimumMinutes |
従業員が勤務できる最短時間(分)。従業員が時間枠に(全体的または部分的に)重複するシフトに割り当てられていた場合、そのシフトが時間枠と重複する時間(分)もこの数に含まれます。 |
maximumMinutes |
時間枠内で従業員が勤務できる最長時間(分)。従業員が時間枠に(全体的または部分的に)重複するシフトに割り当てられていた場合、そのシフトが時間枠と重複する時間(分)もこの数に含まれます。 |
minimumConsecutiveWorkDays |
従業員が勤務できる最短連続日数。従業員は、特定の日に開始されるシフトに割り当てられている場合、その日に勤務します。この数には、その従業員に割り当てられているシフトのうち、その時間枠に始まるものも含まれます。 |
maximumConsecutiveWorkDays |
従業員が勤務できる最長連続日数。従業員は、特定の日に開始されるシフトに割り当てられている場合、その日に勤務します。その従業員に割り当てられたシフトが、その時間枠に始まるものはすべて、この数に含まれます。 |
minimumShiftCount |
従業員が勤務できる最低シフト数。その従業員に割り当てられたシフトが時間枠と完全に重複している場合は、この数に含まれます。 |
maximumShiftCount |
従業員が勤務できるシフトの最大数。その従業員に割り当てられたシフトが時間枠と完全に重複している場合は、この数に含まれます。 |
minimumRestMinutes |
あるシフトの終了後、従業員が別のシフトに割り当てられるまでの休憩時間の最小分数。この制約は、[ |
優先度
従業員のスケジュールまたは補償要件に対する制約の優先度。たとえば、SchedulingConstraint
、ResourceConstraint
、ShiftRequest
、CoverageRequirement
などです。競合する制約が存在する可能性があるため、すべての制約を必ずしも満たすとは限りません。そのため、各タイプの制約には優先度(ユーザーまたはデフォルトによる指定)があり、完全なスケジュールに適用されるすべての制約の相対的な重要度をソルバーに伝えます。
列挙型 | |
---|---|
PRIORITY_UNSPECIFIED |
不明な優先度。 |
PRIORITY_LOW |
最も低い優先度。この優先度の制約は、他の制約ほど重要ではありません。適切な解決策が見つからなかった場合、最初に違反と見なされる。 |
PRIORITY_MEDIUM |
優先度: 中。この優先度の制約は、優先度が PRIORITY_LOW の制約よりも重要ですが、PRIORITY_HIGH 優先度の制約よりも重要度は低くなります。優先度 PRIORITY_LOW の制約をすべて緩和しても実現可能な解が見つからなかった場合は、優先度 PRIORITY_MEDIUM の制約が次に違反とみなされます。 |
PRIORITY_HIGH |
最も高い優先度。この優先度の制約が最も重要です。これは、優先度の低い制約を緩和した後、実現可能な解決策が見つからなかった場合に、最後に違反とみなされるものです。 |
PRIORITY_MANDATORY |
ソルバーが違反できないものを表す優先度。ソルバーが SolutionStatus.INFEASIBLE を返す場合は、PRIORITY_MANDATORY 制約が多すぎる可能性があります。 |
ResourceConstraint
特定の「リソース」の量を制限する一般的な制約。使用しないでください。これは、より具体的な SchedulingConstraint
の抽象バージョンで、ユーザーにとってより柔軟です。SchedulingConstraint.type
で指定できない多くのスケジューリング制約は、代わりにこのメッセージを使用して指定できます。
JSON 表現 |
---|
{
"priority": enum ( |
フィールド | |
---|---|
priority |
このリソース制約の優先度。すべてのリソース制約のデフォルトの優先度は |
resourceUsages |
シフトで使用されるリソースの量。たとえば、この制約が特定の週の従業員の最小労働時間と最長労働時間に適用される場合、このマップには、その週に発生したシフトと各シフトの長さが時間単位で示されます。
|
minimumResourceUsage |
リソース制約を満たすための最小リソース使用量。 |
maximumResourceUsage |
リソース制約を満たすための最大リソース使用量。 |
ShiftRequest
従業員の特定のシフトへの割り当てまたは割り当て解除のリクエスト。
JSON 表現 |
---|
{ "priority": enum ( |
フィールド | |
---|---|
priority |
このスケジュール リクエストの優先度。すべてのスケジューリング リクエストのデフォルトの優先度は |
shiftIds[] |
スケジューリング リクエストのシフト ID。 |
type |
リクエストの種類(リクエストが一連のシフトに割り当てられているかどうかなど)。 |
WorkStatus
従業員が勤務中かどうか。
列挙型 | |
---|---|
WORK_STATUS_UNSPECIFIED |
作業ステータスが不明です。 |
STATUS_WORK |
働いている従業員を表すステータス。 |
STATUS_NOT_WORK |
非勤務従業員を表すステータス。 |
HourlyContract
従業員の報酬を決定するため、基本時給、料金差、残業の乗数を指定します。勤務地の規制により、残業報酬の計算方法が異なる場合があります。ソルバーは、総費用の近似値を最小化するか、予算を満たすように、残業報酬の概算を出します(BudgetRequirement
を参照)。給与計算のためのツールではありません。
JSON 表現 |
---|
{
"baseHourlyRate": number,
"hourlyRateShiftDifferentials": {
string: number,
...
},
"overtimePeriods": [
{
object ( |
フィールド | |
---|---|
baseHourlyRate |
残業以外の勤務時間に対する報酬。従業員に複数のレートが適用される場合は、この基本時間単価を基準にした料金の差が適用されます。また、複数の料金がある場合は、1 時間あたりの基本料金がこれらの料金の最小値である必要があります。 |
hourlyRateShiftDifferentials |
時間あたりの料金の差分。
|
overtimePeriods[] |
残業を計算する必要があるすべての期間のリスト。重複する期間は指定できません。 |
OvertimePeriod
残業報酬の金額を決定するために使用される、固定で定期的に繰り返される期間(通常は 168 時間、または連続する 24 時間 7 回)。各期間には延長戦の乗数(例:1.5)と、baseHourlyRate
の通常の勤務時間(残業以外)とみなされる時間数の制限を考慮します。startDateTime
(この値を含む)および endDateTime
(含まれない)の時間枠と重なるシフトは、その期間の総労働時間数にカウントされます。重複が部分的な場合は、重複する時間のみがカウントされます。
JSON 表現 |
---|
{ "overtimeMultiplier": number, "startDateTime": { object ( |
フィールド | |
---|---|
overtimeMultiplier |
残業の時給を計算するための乗数(1.0 以上の値)。通常、残業時間あたりの料金は |
startDateTime |
超過期間の開始時間。この時間帯にシフトが重なる場合、そのシフトの時間は |
endDateTime |
残業期間の終了時間。この時間帯にシフトが重複している場合は、その時間帯が |
maximumRegularHours |
通常の(残業以外の)料金で支払われる業務時間の上限。この数量は正の数で指定してください。 |
Shift
シフトでは、従業員が勤務できる固定の時間枠を指定します。
JSON 表現 |
---|
{ "id": string, "locationId": string, "startDateTime": { object ( |
フィールド | |
---|---|
id |
このシフトに割り当てられた一意の ID。 |
locationId |
このシフトが行われる勤務地の ID。空欄でもかまいません。 |
startDateTime |
シフトの開始時間(両端を含む)。 |
endDateTime |
シフトの終了時間(この時間を含まない)。現在、ソルバーでは 24 時間未満のシフトのみが許可されます。 |
breakRules[] |
シフト中に発生したブレークルールのリスト。このシフトを行う従業員には、 |
BreakRule
シフト内で休憩を開始できるタイミングとその時間を決定するルール。対象となるすべての挿入点のリストは、ruleIncrementMinutes
単位で決定されます。たとえば、休憩ルールが 10:00 から 11:00 の間に開始できる 30 分の休憩をモデル化していて、ルールの増分が 20 分の場合、考慮される休憩のリストは [10:00, 10:30], [10:20, 10:50], [10:40] [10:10] [10:10] [11:1]
JSON 表現 |
---|
{ "earliestStartTime": { object ( |
フィールド | |
---|---|
earliestStartTime |
休憩の最も早い開始時間(指定した時間を含む)。 |
latestStartTime |
ブレークの最も遅い開始時刻(この値を含む)。 |
durationMinutes |
休憩時間(分)。 |
ruleIncrementMinutes |
[省略可] このブレークルールで考慮できるすべてのブレークの増分時間(分)。設定しない場合、 |
CoverageRequirement
適用範囲の要件では、特定の期間や勤務地において、一連の役割やスキルに必要な従業員数を指定します。特定の場所の日時の間隔を重複させることはできません。または、時間枠と場所の代わりに、シフト ID のリストを指定することもできます。この要件を満たすことができるのは、特定の役割を割り当てることができる(または特定のスキルを持つ)従業員のみです。
特定の役割やスキルについて、時間枠内のあらゆる時間帯(または shiftIds
のシフトごと)に少なくとも targetEmployeeCount
名の従業員が勤務していれば、カバレッジの要件を満たします。一方、時間枠の任意の時点(または shiftIds
のいずれかのシフト)で、時間枠の任意の時点で働く従業員が targetEmployeeCount
人未満の場合、カバレッジ要件に違反します。targetEmployeeCount
よりも多くの従業員が勤務していても要件を満たしますが、人員の過剰な配置はソルバーによって最小限に抑えられます。
JSON 表現 |
---|
{ "startDateTime": { object ( |
フィールド | |
---|---|
startDateTime |
保証範囲の要件の開始時間(両端を含む)。設定する場合は、 |
endDateTime |
保証範囲の要件の終了時間(この時間を含まない)。設定する場合は、 |
locationId |
従業員が必要な場所。 |
shiftIds[] |
設定した場合、ロールとスキル要件はこのリスト内のすべてのシフト ID に個別に適用されます。ShiftId が空でない場合は、 |
roleRequirements[] |
期間中に指定されたロールに割り当てる必要がある従業員数。ロール ID ごとに最大で 1 つの |
skillRequirements[] |
時間枠の中でシフトに割り当てる必要がある、指定されたスキルを持つ従業員数。各スキル ID に指定できる |
RoleRequirement
期間中に指定されたロールに割り当てる必要がある従業員数。
JSON 表現 |
---|
{
"roleId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
フィールド | |
---|---|
roleId |
要件のロール ID。 |
targetEmployeeCount |
期間中にロールに割り当てる必要のある従業員数。 |
priority |
この要件制約の優先度。すべてのリソース制約のデフォルトの優先度は |
SkillRequirement
指定のスキルを持つ従業員のうち、期間中に業務を行う必要がある人数。
JSON 表現 |
---|
{
"skillId": string,
"targetEmployeeCount": integer,
"priority": enum ( |
フィールド | |
---|---|
skillId |
要件のスキル ID。 |
targetEmployeeCount |
所定のスキルを持つ、期間中に業務を遂行する従業員の目標数。 |
priority |
この要件制約の優先度。すべてのリソース制約のデフォルトの優先度は |
BudgetRequirement
特定の期間の予算要件。
JSON 表現 |
---|
{ "totalBudget": number, "startDateTime": { object ( |
フィールド | |
---|---|
totalBudget |
特定の期間の合計予算。優先度が
|
startDateTime |
この予算を適用する開始時間です。開始時間が指定されていない場合は、指定されたすべてのシフトの最も早い開始時間に設定されます。 |
endDateTime |
この予算が適用される期間の終了時間。終了時間が指定されていない場合、指定されたすべてのシフトの最も遅い終了時間に設定されます。 |
priority |
指定された時間枠内で予算要件を満たすことの優先度。デフォルトの優先度は この優先度が他の制約の優先度よりも高く、 |
ShiftAssignment
シフトロールを割り当てる従業員。
JSON 表現 |
---|
{
"employeeId": string,
"shiftId": string,
"roleId": string,
"breaks": [
{
object ( |
フィールド | |
---|---|
employeeId |
割り当てる従業員 ID。 |
shiftId |
従業員に割り当てられたシフト ID。 |
roleId |
シフトで従業員が割り当てられたロール ID。 |
breaks[] |
このシフト割り当ての休憩のリスト。 |
休憩
従業員がシフト中に業務を中断する期間。
JSON 表現 |
---|
{
"startDateTime": {
object ( |
フィールド | |
---|---|
startDateTime |
休憩の開始時間。 |
durationMinutes |
休憩時間(分)。 |
SolutionStatus
ソルバーの応答で提供されるソリューション(スケジュール)のステータス。
列挙型 | |
---|---|
SOLUTION_STATUS_UNSPECIFIED |
レスポンスの未指定のステータス。 |
FEASIBLE |
返されるスケジュールは可能ですが、最適ではない可能性があります。 |
OPTIMAL |
返されるスケジュールは最適な状態です。 |
INFEASIBLE |
指定された制約には実行可能なスケジュールが存在しません。優先順位が PRIORITY_MANDATORY の制約のサブセットを満たせない場合、ソルバーはこの値を返します。 |
NOT_SOLVED |
スケジュールが見つかりませんでした。 |
NOT_SOLVED_DEADLINE_EXCEEDED |
指定された制限時間内にスケジュールが見つかりませんでした。 |