従業員のスケジュールの好みが最大限に高まり、スケジュールの制約違反が最小限になるように、従業員をシフトに割り当てて、指定された SolveShiftSchedulingRequest
に基づく固定のシフトのスケジューリングの問題を解決します。
HTTP リクエスト
POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling
この URL は gRPC Transcoding 構文を使用します。
リクエスト本文
リクエストの本文には、次の構造のデータが含まれます。
JSON 表現 |
---|
{ "requestId": string, "solveParameters": { object ( |
フィールド | |
---|---|
requestId |
問題またはリクエスト ID。 |
solveParameters |
問題の単一の解法を制御するパラメータ。 |
employees[] |
予約可能なすべての従業員。 |
shifts[] |
すべてのシフトがスケジュールを形成します。 |
coverageRequirements[] |
プランニング期間全体のカバレッジ要件。これらは、時間枠またはシフト ID のリストの間に、各役割を遂行する必要がある従業員、またはスキルを持っている従業員の数を指定します。すべての適用範囲要件は、時間枠またはシフト ID のリストのいずれかで指定する必要があります(両方は指定できません)。カバレッジ要件の時間枠(指定されている場合)は、指定された各場所で重複してはいけません。これらの各制約のデフォルトの優先度は、ロールの要件は |
roleIds[] |
従業員全体で考えられるすべての役割のリスト。各従業員には、シフトの割り当て可能なロールが少なくとも 1 つ必要です。ロールとは、シフト中の特定の職務(登録看護師、料理長、給仕係など)を指します。シフトに割り当てられた従業員には、特定の 1 つの役割も割り当てられます。 |
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 でもない場合、このプロトコルの他のフィールドは空になる可能性があります。ステータスが NOT_SOLVED_DEADLINE_EXCEEDED の場合は、実行可能な解決策が見つからない、または実行可能な解決策が存在するかどうかの判断がされず、制限時間に達したことを示します。優先度レベル MANDATORY の制約をすべて満たすことができない場合、リクエストは実行不可能になる可能性があります。 |
shiftAssignments[] |
すべての割り当てのリスト。各 |
statusMessage |
|
SolveParameters
シフト スケジューリング問題の単一の解法を制御するパラメータ。
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 |
残業以外の時間の勤務に対する報酬。社員に複数の料金が適用される場合、この基本の時間給を基準として、料金の差額が適用されます。また、料金が複数ある場合、時間あたりの基本料金はこれらの料金の最低額である必要があります。 |
hourlyRateShiftDifferentials |
時間あたりの差額です。
|
overtimePeriods[] |
残業を計算する必要があるすべての期間のリスト。これらの期間が重ならないようにしてください。 |
OvertimePeriod
残業手当の金額を決定するために使用される固定された定期的な期間(通常は 168 時間、または連続する 7 回の 24 時間期間)。各期間には残業乗数(例: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:1]、[11:1]、[11:1] です。
JSON 表現 |
---|
{ "earliestStartTime": { object ( |
フィールド | |
---|---|
earliestStartTime |
休憩の最も早い開始時間(この時間を含む)。設定できるのは |
latestStartTime |
休憩の最も遅い開始時間(その時間を含む)。設定できるのは |
durationMinutes |
休憩の長さ(分単位)。 |
ruleIncrementMinutes |
[省略可] このブレークルールで考慮できるすべてのブレークの時間を分単位で指定します。設定しない場合、 |
CoverageRequirement
適用範囲要件では、特定の時間枠および特定の場所において、一連の役割/スキルに必要な従業員数を指定します。特定の場所の DateTime 間隔は重複できません。時間枠と場所の代わりに、シフト ID のリストを指定することもできます。この要件を満たすことができるのは、特定の役割を割り当てられる(または特定のスキルを持つ)従業員のみです。
特定の役割/スキルについて、特定の時間枠内の任意の時点で(または shiftIds
のシフトごとに)targetEmployeeCount
名以上の従業員が勤務すると、補償範囲の要件が満たされます。一方、時間枠内の任意の時点(または shiftIds
のいずれかのシフト)で勤務する従業員が targetEmployeeCount
人未満の場合、保証要件に違反します。targetEmployeeCount
よりも多くの従業員が働いても要件は満たされますが、ソルバーによって過剰な人員配置が最小限に抑えられます。
JSON 表現 |
---|
{ "startDateTime": { object ( |
フィールド | |
---|---|
startDateTime |
保証要件の開始時間(この時間を含む)。設定する場合、 |
endDateTime |
保証要件の終了時刻(この時刻を含まない)。設定する場合、 |
locationId |
従業員が必要な場所。 |
shiftIds[] |
設定すると、役割とスキルの要件がこのリスト内のすべてのシフト ID に個別に適用されます。shiftIds が空でない場合、 |
roleRequirements[] |
期間中に指定したロールに割り当てる必要のある従業員数。ロール ID ごとに指定できる |
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 |
指定された制限時間内にスケジュールが見つかりませんでした。 |