특정 SolveShiftSchedulingRequest의 고정 교대 근무 일정 문제를 해결합니다. 스케줄링 환경설정이 극대화되고 스케줄링 제약조건 위반이 최소화됩니다.
HTTP 요청
POST https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling
URL은 gRPC 트랜스코딩 구문을 사용합니다.
요청 본문
요청 본문에는 다음과 같은 구조의 데이터가 포함됩니다.
| JSON 표현 |
|---|
{ "requestId": string, "solveParameters": { object ( |
| 필드 | |
|---|---|
requestId |
문제 또는 요청 ID |
solveParameters |
문제의 단일 해결을 제어하는 매개변수입니다. |
employees[] |
예약 가능한 모든 직원이 있습니다. |
shifts[] |
모든 교대 근무자는 일정을 형성합니다. |
coverageRequirements[] |
전체 계획 범위의 적용 범위 요구사항. 특정 기간 또는 교대 근무 ID 목록 중에 각 역할을 수행하거나 기술을 보유해야 하는 직원 수를 지정합니다. 모든 적용 범위 요구사항은 기간 또는 근무 시간 ID 목록 중 하나로 지정해야 합니다 (둘 다 지정할 수는 없음). 서비스 지역 요구사항 (지정된 경우)은 각 위치에서 겹칠 수 없습니다. 이러한 각 제약조건의 기본 우선순위 수준은 역할 요구사항에서 |
roleIds[] |
인력 전반에서 가능한 모든 역할 목록입니다. 각 직원은 교대 근무에서 할당할 수 있는 역할이 하나 이상 있어야 합니다. 역할은 교대 근무 중 특정 직무 (예: 공인 간호사, 임원 요리사, 웨이터 등)를 의미합니다. 직원에게 교대 근무가 할당되면 해당 직원에게도 특정한 단일 역할이 할당됩니다. |
skillIds[] |
인력 전반에 걸쳐 가능한 모든 기술의 목록입니다. 기술이란 할당 가능한 특정 직무와 관련이 없는 직원에게 부여될 수 있는 추가 자격 (자격증, 사용하는 언어 등)을 의미합니다. 이 목록은 비워 둘 수 있습니다. 직원을 교대 근무에 할당하면 해당 교대 근무에 필요한 모든 기술을 충족해야 합니다. |
locationIds[] |
일정에 있는 교대 근무 세트의 가능한 모든 위치의 목록입니다. 이 목록은 비워 둘 수 있습니다. 여러 위치를 지정하는 것이 유용할 수 있습니다. 예를 들어 간호사 관리자가 병원의 여러 부서에서 여러 간호사의 일정을 정하려는 경우, 또는 호텔 관리자가 여러 호텔에 걸쳐 직원의 일정을 예약하려는 경우 등이 있습니다. |
budgetRequirements[] |
일정 문제에 대한 예산 사양입니다. 각 요구사항의 기본 우선순위 수준은 |
assignmentsHint[] |
일정 예약 문제에 대한 잠정적인 솔루션 (솔루션 힌트라고도 함)으로 사용할 할당을 전환합니다. 할당이 할당할 수 없는 교대 근무 또는 일정 예약 요청과 충돌하는 경우 과제 힌트가 무시됩니다. |
응답 본문
직원 예약 API에 대한 응답입니다. 반환된 solutionStatus이 NOT_SOLVED_DEADLINE_EXCEEDED 또는 INFEASIBLE인 경우 각 응답에서 shiftAssignments는 비어 있습니다. 반환된 solutionStatus이 OPTIMAL 또는 FEASIBLE이면 유효한 교대 근무 할당이 shiftAssignments에 반환됩니다. 유효한 교대 근무 할당의 경우 다음 속성이 유지됩니다.
- 각 직원 ID는 요청에 지정된 직원 집합에 포함됩니다.
- 직원에게 할당된 각 역할 ID는 해당 직원의 역할 ID 집합에 포함됩니다.
- 각 교대 근무 ID는 요청에 지정된 교대 근무 세트에 포함되어 있습니다.
- 각 교대 근무 ID는 해당 직원에게 할당할 수 없는 교대 근무 ID 중 하나가 아닙니다.
- 직원 한 명이 두 번의 교대 근무에 배정되지 않습니다.
- 지정된 일정에서 우선순위 수준이
PRIORITY_MANDATORY인 제약조건 또는 요청이 위반되지 않았습니다.
성공할 경우 응답 본문에 다음 구조의 데이터가 포함됩니다.
| JSON 표현 |
|---|
{ "requestId": string, "solutionStatus": enum ( |
| 필드 | |
|---|---|
requestId |
이 응답이 연결된 요청의 ID입니다. |
solutionStatus |
반환된 솔루션의 상태입니다. 솔루션이 FEASIBLE 또는 OPTIMAL이 아닌 경우 이 proto의 다른 필드는 비어 있을 수 있습니다. 상태가 NOT_SOLVED_DEADLINE_EXCEEDED인 경우 실행 가능한 솔루션을 찾지 못하거나 실행 가능한 솔루션이 있는지 확인하지 않고 시간 제한에 도달한 것입니다. 우선순위 수준 MANDATORY의 제약 조건을 모두 충족할 수 없는 경우 요청이 실행되지 않을 수 있습니다. |
shiftAssignments[] |
모든 할당 목록 각 |
statusMessage |
|
SolveParameters
교대 근무 일정 예약 문제의 단일 해답을 제어하는 매개변수입니다.
| JSON 표현 |
|---|
{ "timeLimit": string } |
| 필드 | |
|---|---|
timeLimit |
문제 해결사가 문제에 소비해야 하는 최대 시간입니다. 설정하지 않으면 기본값은 1분입니다. 이 값은 엄격한 제한이 아니며 통신 오버헤드를 고려하지 않습니다. 문제를 해결하기 위한 예상 지연 시간이 이 값을 약간 초과할 수도 있습니다. 소수점 아래가 최대 9자리까지이고 ' |
직원
예약 예정인 직원입니다.
| JSON 표현 |
|---|
{ "id": string, "roleIds": [ string ], "skillIds": [ string ], "shiftPreferences": [ { object ( |
| 필드 | |
|---|---|
id |
이 직원에게 할당된 고유 ID입니다. |
roleIds[] |
이 직원이 수행할 수 있는 역할 ID입니다. 역할이 1개 이상 지정되어야 합니다. 직원에게 교대 근무가 할당되면 이 목록에서도 하나의 역할이 할당됩니다. 일정 예약 기간 동안 직원이 다른 역할에 할당될 수 있습니다. |
skillIds[] |
이 직원이 소유한 기술 ID입니다. 이 목록은 비워 둘 수 있습니다. 직원이 교대 근무에 할당되면 여기에 나열된 기술 중 일부를 사용하여 할당된 교대 근무 기간 동안 기술 요구사항을 처리합니다. |
shiftPreferences[] |
이 직원의 환경설정을 변경합니다. 여기에 지정된 교대 근무 수는 해당 직원이 일정 예약 기간에 배정되기를 원하는 교대 근무를 나타냅니다. |
schedulingConstraints[] |
이 직원의 일정 제약 조건 목록입니다. 이러한 각 제약조건의 기본 우선순위 수준은 |
resourceConstraints[] |
|
shiftRequests[] |
직원의 교대 근무 요청 목록입니다. 특정 교대 근무자를 배정받기 위한 요청일 수도 있고 특정 교대 근무에 배정되지 않을 수도 있습니다. 직원의 고정 일정 할당은 우선순위가 |
hourlyContract |
직원에 대한 정규 및 초과 근무 시간 요금을 지정하는 계약입니다. |
ShiftPreference
특정 Shift ID의 숫자 환경설정입니다.
| JSON 표현 |
|---|
{ "shiftId": string, "preference": integer } |
| 필드 | |
|---|---|
shiftId |
환경설정이 지정된 Shift 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시간 또는 연속 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, 11:10], 11:10, 11:10입니다.
| JSON 표현 |
|---|
{ "earliestStartTime": { object ( |
| 필드 | |
|---|---|
earliestStartTime |
광고 시점의 가장 이른 시작 시간입니다 (해당 시간 포함). |
latestStartTime |
가장 늦은 광고 시점 시작 시간입니다 (해당 시간 포함). |
durationMinutes |
휴식 시간(분)입니다. |
ruleIncrementMinutes |
[선택사항] 이 광고 시점 규칙에서 고려할 수 있는 모든 광고 시점의 시간 증가분(분)입니다. 설정하지 않으면 기본값은 |
CoverageRequirement
적용 범위 요구사항은 특정 기간 동안 지정된 위치에서 일련의 역할 또는 기술에 필요한 직원 수를 지정합니다. 특정 위치의 DateTime 간격은 겹칠 수 없습니다. 또는 시간 및 위치 대신 교대 근무 ID 목록을 제공할 수 있습니다. 특정 역할을 할당할 수 있는 직원 또는 특정 기술을 보유한 직원만 이 요건을 충족할 수 있습니다.
주어진 역할 또는 기술의 보장 범위 요구사항은 특정 기간 중 매 순간 (또는 shiftIds 교대 근무마다) 최소 targetEmployeeCount명의 직원이 근무하는 경우에 충족됩니다. 반면에 특정 기간 (또는 shiftIds의 모든 교대 근무)에 해당 기간 동안 근무하는 직원이 targetEmployeeCount명 미만이면 보장 범위 요구사항을 위반하게 됩니다. targetEmployeeCount보다 일하는 직원이 더 많아도 여전히 요구사항을 충족하지만 문제 해결자가 과도한 인력을 감당할 수는 없습니다.
| JSON 표현 |
|---|
{ "startDateTime": { object ( |
| 필드 | |
|---|---|
startDateTime |
적용 범위 요구사항의 시작 시간입니다 (해당 시간 포함). 설정하는 경우 |
endDateTime |
보증 범위 요구사항 (제외)의 종료 시간입니다. 설정하는 경우 |
locationId |
직원이 필요한 위치입니다. |
shiftIds[] |
설정하면 역할 및 기술 요구사항이 이 목록의 모든 교대 근무 ID에 개별적으로 적용됩니다. ShiftId가 비어 있지 않은 경우 |
roleRequirements[] |
특정 기간 동안 지정된 역할에 할당되는 필수 직원 수입니다. 각 역할 ID에 최대 하나의 |
skillRequirements[] |
특정 기간 동안 교대 근무에 할당되는 특정 기술을 보유한 필수 직원 수입니다. 각 기술 ID에 최대 1개의 |
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 |
직원에게 할당된 Shift ID입니다. |
roleId |
해당 교대 근무를 위해 직원에게 할당된 역할 ID입니다. |
breaks[] |
이 교대 근무 배정의 휴식 목록입니다. |
휴식 시간
직원이 교대 근무 중에 업무를 중단하는 기간입니다.
| JSON 표현 |
|---|
{
"startDateTime": {
object ( |
| 필드 | |
|---|---|
startDateTime |
광고 시점의 시작 시간입니다. |
durationMinutes |
휴식 시간(분)입니다. |
SolutionStatus
문제 해결사의 응답에 제공된 솔루션 (즉, 일정) 상태입니다.
| 열거형 | |
|---|---|
SOLUTION_STATUS_UNSPECIFIED |
응답의 상태가 지정되지 않았습니다. |
FEASIBLE |
반환된 일정은 실행할 수 있지만 최적이 아닐 수 있습니다. |
OPTIMAL |
반환된 일정이 최적입니다. |
INFEASIBLE |
지정된 제약조건에 실행 가능한 일정이 없습니다. 우선순위 수준이 PRIORITY_MANDATORY인 제약 조건의 하위 집합을 충족할 수 없는 경우 솔버에서 이 값을 반환할 수 있습니다. |
NOT_SOLVED |
일정을 찾을 수 없습니다. |
NOT_SOLVED_DEADLINE_EXCEEDED |
지정된 제한 시간 내에 일정을 찾을 수 없습니다. |