Method: scheduling.solveShiftGeneration

직원 수요를 처리하기 위해 주어진 교대 근무 템플릿에서 교대 근무를 생성하여 주어진 SolveShiftGenerationRequest에서 교대 근무 세대 문제를 해결합니다.

HTTP 요청

POST https://optimization.googleapis.com/v1/scheduling:solveShiftGeneration

URL은 gRPC 트랜스코딩 구문을 사용합니다.

요청 본문

요청 본문에는 다음과 같은 구조의 데이터가 포함됩니다.

JSON 표현
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
필드
solverConfig

object (SolverConfig)

선택사항입니다. 문제 해결사의 매개변수입니다.

shiftTemplates[]

object (ShiftTemplate)

필수 항목입니다. 근무 이벤트를 생성하기 위한 규칙을 지정하는 교대 근무 템플릿 모음입니다.

employeeDemands[]

object (EmployeeDemand)

필수 항목입니다. shiftTemplates로 인해 발생한 교대 근무를 처리해야 하는 총 직원 수요입니다.

응답 본문

Shift 세대 문제에 대한 응답입니다. 반환된 solutionStatusSOLVED이면 솔버가 생성한 유효한 시프트 집합이 employeeSchedules에 반환됩니다. 유효한 교대 근무 일정의 경우 다음 속성이 보존됩니다.

  1. employeeSchedules에서 발생한 각 변화는 상응하는 ShiftTemplate에 지정된 규칙을 준수합니다.
  2. 각 교대 근무에서 선택된 각 이벤트는 해당 ShiftTemplate.Event에 지정된 규칙을 준수합니다.
  3. 동일한 ShiftTemplate에서 생성된 교대 근무 세트에 할당된 총 직원 수가 해당 템플릿의 maximumEmployeeCount명을 초과하지 않습니다.
  4. 할당된 직원 그룹은 지정된 간격마다 수요를 처리합니다.

성공할 경우 응답 본문에 다음 구조의 데이터가 포함됩니다.

JSON 표현
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
필드
solutionStatus

enum (ShiftGenerationSolutionStatus)

반환된 솔루션의 상태입니다. solutionStatusSOLVED이 아니면 employeeSchedules는 비어 있습니다.

employeeSchedules[]

object (EmployeeSchedule)

문제 해결사가 생성한 교대 근무 세트와 각 일정에 할당된 직원 수

demandCoverageViolations[]

object (DemandCoverageViolation)

지정된 employeeSchedules에 할당된 employee_counts를 기준으로 한 수요 범위 위반입니다. 요청에 지정된 employeeDemands가 집계됩니다. 두 개의 employee_demand 간격이 겹치는 경우 간격의 겹치는 부분에 대한 수요가 합산됩니다.

SolverConfig

교대 근무 세대 문제를 해결하기 위한 추가 매개변수를 지정합니다.

JSON 표현
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
필드
timeLimit

string (Duration format)

문제 해결사가 문제에 소비해야 하는 최대 시간입니다. 설정하지 않으면 기본값은 1분입니다. 시간 제한은 문제의 규모에 따라 선택해야 합니다. 예를 들어 2개의 ShiftTemplates가 있는 7일 인스턴스를 해결할 때(각각 시작 시간이 약 20회이고 시작 시간이 약 30회이고 주 2일 쉬는 이벤트 2개를 보유하는 경우 권장값은 빠른 솔루션의 경우 10초 미만(그리고 최적일 가능성이 높음), (10초, 300초), 포괄적인 검색의 경우 300초 초과)입니다. 인스턴스가 클수록 시간 제한이 더 길어질 수 있습니다.

이 값은 엄격한 제한이 아니며 통신 오버헤드를 고려하지 않습니다. 문제를 해결하기 위한 예상 지연 시간이 이 값을 약간 초과할 수도 있습니다.

소수점 아래가 최대 9자리까지이고 's'로 끝나는 초 단위 기간입니다. 예를 들면 "3.5s"입니다.

multiDaySchedule

boolean

true인 경우 문제 해결사는 여러 교대 근무가 포함된 EmployeeSchedule을 생성합니다 (예: 일주일 단위 일정을 생성하기 위해). 그 밖의 경우에는 각 EmployeeSchedule에 정확히 1개의 교대 근무가 포함됩니다. 수일 단위의 일정은 교대 근무 시작 시간이 요일 간에 동일하다고 가정하고 이러한 일정의 휴일 일수는 교대 근무 템플릿에 의해 결정됩니다. 기본값은 false입니다.

shiftEventsCanChange

boolean

true인 경우 여러 날의 EmployeeSchedule에 일정의 시작 및 종료 시간이 요일마다 다른 교대 근무가 포함될 수 있습니다. 그렇지 않으면 특정 EmployeeSchedule의 모든 교대 근무의 시작 시간과 종료 시간이 동일해야 합니다. 두 경우 모두 여러 날로 구성된 일정의 모든 변경 시작 시간과 종료 시간은 동일합니다. 따라서 multiDaySchedule가 false인 경우 이 매개변수는 무시됩니다. 이 매개변수를 true로 설정하면 해결 시간이 더 길어질 수 있습니다. 기본값은 false입니다.

ShiftTemplate

교대 근무를 생성하기 위한 규칙을 지정하는 템플릿입니다. 교대 근무는 시작 시간과 종료 시간을 지정하는 작업 단위이며 이벤트 (점심, 휴식 등)를 포함할 수도 있습니다. 응답의 특정 날짜에 근무 시간이 할당됩니다.

JSON 표현
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
필드
id

string

이 템플릿의 고유 ID입니다.

earliestStartTime

object (TimeOfDay)

하루 중 근무 시간이 가장 이른 시간입니다. 이 값은 시간과 분으로 지정됩니다. 초와 나노는 무시됩니다.

latestStartTime

object (TimeOfDay)

하루 중 근무 시간이 가장 늦은 시간입니다. 이 값은 시간과 분으로 지정됩니다. 초와 나노는 무시됩니다. 이 값이 earliestStartTime보다 작으면 자정 이전 또는 이후에 이 템플릿에 의해 생성된 변화가 시작될 수 있습니다.

durationMinutes

integer

이 템플릿에서 생성되는 이동 시간이 고정되어 있습니다.

startTimeIncrementMinutes

integer

earliestStartTime~latestStartTime 사이에 가능한 시작 시간 집합을 생성하는 데 사용되는 시간 증분 (분)입니다. 예를 들어 가장 빠른 시작 시간이 8:00이고, 가장 늦은 시작 시간이 8:30이고, 시작 시간 증분이 10분인 경우, 이 Shift 템플릿의 가능한 모든 시작 시간은 8:00, 8:10, 8:20, 8:30입니다.

daysOffCountPerWeek

integer

일주일에 쉬는 날 수가 고정되어 있습니다. 직원이 해당 날짜에 시작하는 교대 근무에 배정되지 않으면 휴일이 주어집니다. 일주일은 7일이며 일요일에 시작됩니다.

eventTemplates[]

object (EventTemplate)

각 교대 근무의 이벤트를 생성하기 위한 규칙입니다. 지정된 각 이벤트의 각 교대 근무에 정확히 하나의 이벤트가 포함됩니다.

minimumIntereventGapMinutes

integer

한 이벤트가 끝나고 다음 이벤트가 시작될 때까지 걸리는 최소 시간(분)입니다.

maximumEmployeeCount

integer

이 템플릿으로 생성된 모든 교대근무에 할당할 수 있는 최대 직원 수입니다.

TimeOfDay

하루 중 특정 시간을 나타냅니다. 날짜와 시간대가 중요하지 않거나 아무 곳으로 지정됩니다. API는 윤초를 허용하도록 선택할 수 있습니다. 관련된 유형은 google.type.Dategoogle.protobuf.Timestamp입니다.

JSON 표현
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
필드
hours

integer

24시간 형식의 시간입니다. 0~23 사이의 값이어야 합니다. API는 비즈니스 종료 시간과 같은 시나리오에서 '24:00:00' 값을 허용하도록 선택할 수 있습니다.

minutes

integer

특정 시간의 분입니다. 0~59 사이의 값이어야 합니다.

seconds

integer

특정 분의 초입니다. 일반적으로 0~59 사이의 값이어야 합니다. API가 윤초를 허용하는 경우 값에 60을 사용할 수 있습니다.

nanos

integer

나노초 단위의 초수입니다. 0~999,999,999 사이의 값이어야 합니다.

EventTemplate

교대 근무 중에 발생하는 단일 이벤트를 생성하기 위한 규칙을 지정하는 템플릿입니다. 일정은 회의, 휴식, 점심시간 등을 나타낼 수 있습니다.

JSON 표현
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
필드
id

string

이 템플릿의 고유 ID입니다.

minimumMinutesAfterShiftStart

integer

교대 근무 시작 후 이 이벤트를 시작할 수 있는 최소 시간(분)입니다.

maximumMinutesAfterShiftStart

integer

교대 근무 시작 후 이 이벤트를 시작할 수 있는 최대 시간(분)입니다.

durationMinutes

integer

이 이벤트의 고정된 기간(분)

startTimeIncrementMinutes

integer

minimumMinutesAfterShiftStart~maximumMinutesAfterShiftStart 사이에 가능한 이벤트 시작 시간 집합을 생성하는 데 사용되는 시간 증분 (분)입니다. 예를 들어 교대 근무 시작 후 최소 시간(분)이 30분이고, 교대 근무 시작 후 최대 시간(분)이 45분이고 시작 시간 증가가 5분인 경우, 이벤트는 교대 근무 시작 후 30분, 35분, 40분 또는 45분 후에 발생할 수 있습니다.

EmployeeDemand

지정된 DateTime 간격에 수요를 처리하는 데 필요한 직원 수를 지정합니다.

JSON 표현
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
필드
startDateTime

object (DateTime)

지정된 수요에 대한 시간 간격의 시작입니다 (해당 시간 포함). 이 값은 분 단위로 판독됩니다. 초이며 더 작은 단위는 모두 무시됩니다.

endDateTime

object (DateTime)

지정된 수요에 대한 시간 간격의 종료 시간입니다 (제외). 이 값은 분 단위로 판독됩니다. 초이며 더 작은 단위는 모두 무시됩니다.

employeeCount

integer

이 간격에 대한 수요를 충당하는 데 필요한 직원 수입니다.

ShiftGenerationSolutionStatus

문제 해결사의 응답에 제공된 솔루션 상태입니다.

열거형
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED 응답의 상태가 지정되지 않았습니다.
SHIFT_GENERATION_SOLVED 문제 해결사가 제공된 시간 제한 내에 해결 방법을 찾았습니다.
SHIFT_GENERATION_NOT_SOLVED 문제가 발생하여 문제 해결사가 근무 시간을 생성할 수 없습니다.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED 주어진 시간 제한 내에 수요를 처리하기 위한 교대 근무를 생성할 수 없습니다.

EmployeeSchedule

여러 직원에게 할당할 단일 ShiftTemplate에 해당하는 정렬된 교대 근무 목록입니다.

JSON 표현
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
필드
shiftTemplateId

string

이 교대 근무 세트를 생성하는 데 사용된 템플릿의 ID입니다.

shifts[]

object (ShiftWithEvents)

employeeCount 직원이 할당된 교대 근무의 목록입니다. 일정에 선택된 교대 근무 및 이벤트는 단일 템플릿에서 생성되었습니다. 교대 근무는 시간순으로 정렬되며 겹치지 않습니다. SolverConfig.multi_day_schedule이 true인 경우 해당 날짜에 시작하는 교대 근무가 없다는 의미로 공휴일이 암시적으로 표시됩니다.

employeeCount

integer

수요를 충당하기 위해 이 교대 근무 세트에 배정되어야 하는 직원 수입니다.

ShiftWithEvents

문제 해결사가 생성한 변화의 고정된 이벤트 목록과 함께 시작일 및 종료일을 지정합니다.

JSON 표현
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
필드
startDateTime

object (DateTime)

이동 시작 날짜 및 시간입니다. 이 값은 분 단위로 지정됩니다. 초와 작은 단위는 제공되지 않습니다.

endDateTime

object (DateTime)

이동 종료 날짜 및 시간입니다. 이 값은 분 단위로 지정됩니다. 초와 작은 단위는 제공되지 않습니다.

events[]

object (Event)

이 이동에 포함된 이벤트 목록으로, ShiftTemplate.Event에 정확하게 매핑되고 동일한 순서로 매핑되어 있습니다. SolverConfig.shift_events_can_change이 true인 경우 이벤트의 시작 및 종료 시간이 이 일정의 모든 ShiftWithEvents에서 다를 수 있습니다.

이벤트

문제 해결사가 생성한 시간 변화에서 특정 이벤트의 시작 및 종료 DateTime을 지정합니다.

JSON 표현
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
필드
eventTemplateId

string

이 이벤트를 생성하는 데 사용된 템플릿의 ID입니다.

startDateTime

object (DateTime)

이벤트의 시작 날짜 및 시간입니다. 이 값은 분 단위로 지정됩니다. 초와 작은 단위는 제공되지 않습니다.

endDateTime

object (DateTime)

이벤트의 종료 날짜 및 시간입니다. 이 값은 분 단위로 지정됩니다. 초와 작은 단위는 제공되지 않습니다.

DemandCoverageViolation

지정된 간격의 수요 범위 위반을 지정합니다. 직원 수요는 지정된 전체 구간에서 동일합니다.

JSON 표현
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
필드
startDateTime

object (DateTime)

수요 간격의 시작 날짜 및 시간입니다 (해당 시간 포함). 이 값은 분 단위로 지정됩니다.

endDateTime

object (DateTime)

수요 간격의 종료 날짜 및 시간입니다 (제외). 이 값은 분 단위로 지정됩니다.

coverageViolation

integer

지정된 간격 동안의 노출 범위 위반입니다. 양수 값은 수요가 초과되었음을 나타내고 음수 값은 수요가 가려졌음을 나타냅니다.