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에서 발생된 근무 교대근무에 포함해야 하는 총 직원 수요입니다. 각 EmployeeDemand에 지정된 DateTime 간격은 분리되어야 하며 인접하지 않을 수 있습니다.

응답 본문

Shift 생성 문제에 대한 응답입니다. 반환된 solutionStatusSOLVED이면 솔버에 의해 생성된 유효한 이동 집합이 employeeSchedules에 반환됩니다. 유효한 교대 근무 일정의 경우 다음 속성이 유지됩니다.

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

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

JSON 표현
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ]
}
입력란
solutionStatus

enum (ShiftGenerationSolutionStatus)

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

employeeSchedules[]

object (EmployeeSchedule)

각 일정에 할당된 직원 수와 함께 문제 해결사가 생성한 교대 근무 조합입니다.

SolverConfig

Shift 생성 문제를 해결하기 위한 추가 매개변수를 지정합니다.

JSON 표현
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
입력란
timeLimit

string (Duration format)

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

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

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

multiDaySchedule

boolean

true인 경우 문제 해결사가 여러 교대 근무를 포함하는 EmployeeSchedule를 생성합니다 (예: 일주일 단위의 일정 생성). 그 외의 경우 각 EmployeeSchedule에는 정확히 하나의 Shift가 포함됩니다. 수일 일정에서는 교대 근무 시작 시간이 요일 간에 동일하다고 가정하며, 이러한 일정에서 쉬는 날의 수는 교대 근무 템플릿에 의해 결정됩니다. 기본값은 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분인 경우 이 근무조 템플릿에 사용할 수 있는 모든 시작 시간은 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)

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