특정 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 |
지정된 제한 시간 내에 일정을 찾을 수 없습니다. |