残業手当と看護師のスケジューリング

この例は、看護師のスケジューリングの例に基づいて、モデルに 予算の要件に応じて、定期的および残業手当が支給されます。 看護師のスケジュールの制約があり、4 日間の予算に 10,000 ドルが 計画を立てますすべての看護師には、1 時間あたり 50 ドルの基本時給が支払われ、 シフトの差額は 19 時間から $10/時です。指定なし 40 時間経過後の勤務時間には、平均基本時給の 1.5 倍が支給される( ($50 +$60)÷ 2=$55)。

定期報酬と残業報酬

基本時間単価、シフト差分、残業乗数は、 employeehourlyContract フィールドで表されます。新しい 時間単位契約baseHourlyRatehourlyRateShiftDifferentials は、通常(残業以外)の報酬をモデル化します。 説明します。これらの値は、Google Cloud での平均的な 1 時間あたりの基本料金の見積もりにも使用されます。 overtimePeriods が指定されている場合は、残業代の報酬が支払われます。通常は残業 期間が 1 週間と一致し、一定の期間を超える延長期間を指定できます。 重複していません1 人目の看護師(Adam)の 1 時間あたりの契約は、 次のように表されます。

  {
   
"employees": [{
     
"id": "Adam",
     
"roleIds": ["Registered Nurse"],
     
...
        scheduling constraints
     
...
     
"hourlyContract": {
       
"baseHourlyRate": 50,
       
"hourlyRateShiftDifferentials": {
         
"2023-05-01 19hr": 10,
         
"2023-05-02 19hr": 10,
         
"2023-05-03 19hr": 10,
         
"2023-05-04 19hr": 10
       
},
       
"overtimePeriods": [
         
{
           
"overtimeMultiplier": 1.5,
           
"startDateTime": {
             
"year": 2023,
             
"month": 5,
             
"day": 1
           
},
           
"endDateTime": {
             
"year": 2023,
             
"month": 5,
             
"day": 5
           
},
           
"maximumRegularHours": 40
         
}
       
]
     
}
   
}
 
}

 
{
     
"employees": [
       
{
         
"id": "Adam",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
},
       
{
         
"id": "Grace",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
},
       
{
         
"id": "James",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
},
       
{
         
"id": "Alonso",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
}
   
]
 
}
 

予算の要件

合計予算 $10,000 は 予算の要件を満たしているか。開始時間と終了時間は 省略可。指定する場合は、この時間枠内のシフトと超過期間のみ。 この予算の制約の対象と見なされます。対応する表現 は、次のように更新できます。

  {
   
"totalBudget": 10000,
   
"priority": "PRIORITY_HIGH"
 
}

   
{
     
"employees": [
       
{
         
"id": "Adam",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
},
       
{
         
"id": "Grace",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
},
       
{
         
"id": "James",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
},
       
{
         
"id": "Alonso",
         
"roleIds": [
           
"Registered Nurse"
         
],
         
"schedulingConstraints": [
           
{
             
"priority": "PRIORITY_HIGH",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"minimumRestMinutes": 720
           
},
           
{
             
"priority": "PRIORITY_MEDIUM",
             
"startDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 1,
               
"hours": 7
             
},
             
"endDateTime": {
               
"year": 2023,
               
"month": 5,
               
"day": 5,
               
"hours": 7
             
},
             
"maximumMinutes": 2160
           
}
         
],
         
"hourlyContract": {
           
"baseHourlyRate": 50,
           
"hourlyRateShiftDifferentials": {
             
"2023-05-01 19h": 10,
             
"2023-05-02 19h": 10,
             
"2023-05-03 19h": 10,
             
"2023-05-04 19h": 10
           
},
           
"overtimePeriods": [
             
{
               
"overtimeMultiplier": 1.5,
               
"startDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 1
               
},
               
"endDateTime": {
                 
"year": 2023,
                 
"month": 5,
                 
"day": 5
               
},
               
"maximumRegularHours": 40
             
}
           
]
         
}
       
}
     
],
     
"shifts": [
       
{
         
"id": "2023-05-01 7h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 1,
           
"hours": 7
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 1,
           
"hours": 19
         
}
       
},
       
{
         
"id": "2023-05-01 13h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 1,
           
"hours": 13
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 2,
           
"hours": 1
         
}
       
},
       
{
         
"id": "2023-05-01 19h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 1,
           
"hours": 19
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 2,
           
"hours": 7
         
}
       
},
       
{
         
"id": "2023-05-02 7h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 2,
           
"hours": 7
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 2,
           
"hours": 19
         
}
       
},
       
{
         
"id": "2023-05-02 13h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 2,
           
"hours": 13
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 3,
           
"hours": 1
         
}
       
},
       
{
         
"id": "2023-05-02 19h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 2,
           
"hours": 19
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 3,
           
"hours": 7
         
}
       
},
       
{
         
"id": "2023-05-03 7h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 3,
           
"hours": 7
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 3,
           
"hours": 19
         
}
       
},
       
{
         
"id": "2023-05-03 13h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 3,
           
"hours": 13
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 4,
           
"hours": 1
         
}
       
},
       
{
         
"id": "2023-05-03 19h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 3,
           
"hours": 19
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 4,
           
"hours": 7
         
}
       
},
       
{
         
"id": "2023-05-04 7h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 4,
           
"hours": 7
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 4,
           
"hours": 19
         
}
       
},
       
{
         
"id": "2023-05-04 13h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 4,
           
"hours": 13
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 5,
           
"hours": 1
         
}
       
},
       
{
         
"id": "2023-05-04 19h",
         
"locationId": "department",
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 4,
           
"hours": 19
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 5,
           
"hours": 7
         
}
       
}
     
],
     
"coverageRequirements": [
       
{
         
"startDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 1,
           
"hours": 7
         
},
         
"endDateTime": {
           
"year": 2023,
           
"month": 5,
           
"day": 5,
           
"hours": 7
         
},
         
"locationId": "department",
         
"roleRequirements": [
           
{
             
"roleId": "Registered Nurse",
             
"targetEmployeeCount": 2,
             
"priority": "PRIORITY_MANDATORY"
           
}
         
]
       
}
     
],
     
"roleIds": [
       
"Registered Nurse"
     
],
     
"locationIds": [
       
"department"
     
],
     
"budgetRequirements": [
       
{
         
"totalBudget": 10000,
         
"priority": "PRIORITY_HIGH"
       
}
     
]
   
}
   

レスポンスの例

解法のレスポンスには、シフトへの看護師の割り当てと、 最適化手順のステータス。たとえば、チームに割り当てられたシフトが 最初の従業員は次のように返されます。

  {
   
"solutionStatus": "OPTIMAL",
   
"shiftAssignments": [
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-01 7hr",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-02 7hr",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-03 7hr",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-04 7hr",
       
"roleId": "Registered Nurse"
     
},
     
... ]
 
}

 
{
   
"solutionStatus": "OPTIMAL",
   
"shiftAssignments": [
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-01 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-02 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-03 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Adam",
       
"shiftId": "2023-05-04 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Grace",
       
"shiftId": "2023-05-01 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Grace",
       
"shiftId": "2023-05-02 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Grace",
       
"shiftId": "2023-05-03 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "Grace",
       
"shiftId": "2023-05-04 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "James",
       
"shiftId": "2023-05-01 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "James",
       
"shiftId": "2023-05-02 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "James",
       
"shiftId": "2023-05-03 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "James",
       
"shiftId": "2023-05-04 19h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "We",
       
"shiftId": "2023-05-01 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "We",
       
"shiftId": "2023-05-02 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "We",
       
"shiftId": "2023-05-03 7h",
       
"roleId": "Registered Nurse"
     
},
     
{
       
"employeeId": "We",
       
"shiftId": "2023-05-04 7h",
       
"roleId": "Registered Nurse"
     
}
   
]
 
}