Method: scheduling.solveShiftGeneration

Soluciona um problema de geração de turnos com o SolveShiftGenerationRequest especificado, gerando turnos com base em modelos de turnos fornecidos para atender à demanda de funcionários.

Solicitação HTTP

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

O URL usa a sintaxe de transcodificação gRPC.

Corpo da solicitação

O corpo da solicitação contém dados com a seguinte estrutura:

Representação JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Campos
solverConfig

object (SolverConfig)

Opcional. Parâmetros para o solucionador.

shiftTemplates[]

object (ShiftTemplate)

Obrigatório. Conjunto de modelos de turno que especificam regras para gerar turnos.

employeeDemands[]

object (EmployeeDemand)

Obrigatório. Demanda total dos funcionários que os turnos gerados por shiftTemplates precisam atender.

Corpo da resposta

Resposta para o problema de geração de turno. Se o solutionStatus retornado for SOLVED, um conjunto de mudanças válidas geradas pelo solucionador será retornado em employeeSchedules. Para uma programação de turnos válida, as seguintes propriedades são mantidas:

  1. Cada mudança gerada em employeeSchedules segue as regras especificadas no ShiftTemplate correspondente.
  2. Cada evento selecionado em cada turno segue as regras especificadas no ShiftTemplate.Event correspondente.
  3. O número total de funcionários atribuídos ao conjunto de turnos gerados com o mesmo ShiftTemplate não excede maximumEmployeeCount desse modelo.
  4. O conjunto de funcionários atribuídos abrange a demanda em todos os intervalos.

Se bem-sucedido, o corpo da resposta incluirá dados com a estrutura a seguir:

Representação JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Campos
solutionStatus

enum (ShiftGenerationSolutionStatus)

Status da solução retornada. Se solutionStatus não for SOLVED, employeeSchedules estará vazio.

employeeSchedules[]

object (EmployeeSchedule)

Conjunto de turnos gerados pelo solucionador com o número de funcionários atribuídos a cada programação.

demandCoverageViolations[]

object (DemandCoverageViolation)

Violações de cobertura da demanda com base no employee_counts atribuído no employeeSchedules especificado. Os employeeDemands fornecidos na solicitação são agregados. Se dois intervalos employee_demand se sobrepuserem, a demanda será somada na parte sobreposta do intervalo.

SolverConfig

Especifica parâmetros adicionais para resolver o problema de geração de Shift.

Representação JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Campos
timeLimit

string (Duration format)

O tempo máximo que o solucionador deve gastar no problema. Se não for definido, o padrão será um minuto. A escolha de um limite de tempo depende do tamanho do problema. Como exemplo, ao resolver uma instância de 7 dias com 2 ShiftTemplates, cada uma com cerca de 20 horários de início possíveis e mantendo 2 eventos com aproximadamente 30 horários de início possíveis e 2 dias de folga por semana, os valores recomendados são: menos de 10 s para soluções rápidas (e provavelmente inferior ao ideal), (10 s e 300 s) para soluções de boa qualidade e > 300 s para uma pesquisa exaustiva. Instâncias maiores podem exigir limites de tempo mais longos.

Esse valor não é um limite fixo e não considera a sobrecarga de comunicação. A latência esperada para resolver o problema pode exceder um pouco esse valor.

Duração em segundos com até nove dígitos fracionários, terminando em "s". Exemplo: "3.5s".

multiDaySchedule

boolean

Se verdadeiro, o solucionador gera EmployeeSchedules que incluem várias mudanças (por exemplo, para gerar uma programação de uma semana). Caso contrário, cada EmployeeSchedule inclui exatamente uma mudança. As programações de vários dias pressupõem que o horário de início do turno é o mesmo em todos os dias, e o número de dias de folga é determinado pelos modelos de turno. O padrão é false

shiftEventsCanChange

boolean

Se verdadeiro, os EmployeeSchedules de vários dias podem incluir turnos em que os horários de início e término dos eventos variam todos os dias. Caso contrário, todos os turnos de uma EmployeeSchedule específica precisam ter os mesmos horários de início e término do evento. Em ambos os casos, todos os turnos de uma programação de vários dias têm o mesmo horário de início e término. Por isso, esse parâmetro vai ser ignorado se multiDaySchedule for falso. Definir esse parâmetro como "true" pode resultar em tempos de resolução mais longos. O padrão é false

ShiftTemplate

Modelo que especifica regras para gerar turnos. Um turno é uma unidade de trabalho que especifica um horário de início e de término e pode conter eventos (como almoço, intervalos etc). Um turno será atribuído a uma data específica na resposta.

Representação JSON
{
  "id": string,
  "earliestStartTime": {
    object (TimeOfDay)
  },
  "latestStartTime": {
    object (TimeOfDay)
  },
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer,
  "daysOffCountPerWeek": integer,
  "eventTemplates": [
    {
      object (EventTemplate)
    }
  ],
  "minimumIntereventGapMinutes": integer,
  "maximumEmployeeCount": integer
}
Campos
id

string

ID exclusivo desse modelo.

earliestStartTime

object (TimeOfDay)

Primeiro horário do dia em que um turno pode começar. Esse valor é especificado com horas e minutos. segundos e nanos são ignorados.

latestStartTime

object (TimeOfDay)

É o último horário do dia em que uma mudança pode começar. Esse valor é especificado com horas e minutos. segundos e nanos são ignorados. Se esse valor for menor que earliestStartTime, uma mudança gerada por esse modelo poderá começar antes ou depois da meia-noite.

durationMinutes

integer

Duração fixa de um turno gerado por este modelo.

startTimeIncrementMinutes

integer

O incremento de tempo (em minutos) usado para gerar o conjunto de possíveis horários de início entre earliestStartTime e latestStartTime. Por exemplo, se o horário de início mais cedo for 8:00, o horário de início mais recente for 8:30 e o incremento do horário de início for 10 minutos, todos os horários de início possíveis para este modelo de turno serão: 8:00, 8:10, 8:20 e 8:30.

daysOffCountPerWeek

integer

Número fixo de dias de folga por semana. Um funcionário tem um determinado dia de folga se não for designado para um turno que comece nesse dia. Uma semana dura sete dias e começa no domingo.

eventTemplates[]

object (EventTemplate)

Regras para gerar eventos para cada turno. Exatamente um evento será incluído em cada turno para cada evento especificado.

minimumIntereventGapMinutes

integer

Mínimo de minutos entre o fim de um evento e o início de outro.

maximumEmployeeCount

integer

Número máximo de funcionários que podem ser atribuídos a todos os turnos gerados por este modelo.

TimeOfDay

Representa um horário do dia. A data e o fuso horário não são relevantes ou são especificados em outro lugar. Uma API pode permitir segundos bissextos. Os tipos relacionados são google.type.Date e google.protobuf.Timestamp.

Representação JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Campos
hours

integer

Horas do dia no formato de 24 horas. Precisa ser de 0 a 23. Uma API pode permitir o valor "24:00:00" para o horário de fechamento da empresa, por exemplo.

minutes

integer

Minutos da hora do dia. Precisa ser de 0 a 59.

seconds

integer

Segundos do minutos do horário. Normalmente precisa ser de 0 a 59. Uma API pode permitir o valor 60 se permitir segundos bissextos.

nanos

integer

Frações de segundos em nanossegundos. Precisa ser de 0 a 999.999.999.

EventTemplate

Modelo que especifica regras para gerar um único evento que ocorre durante um turno. Um evento pode representar uma reunião, intervalo, almoço etc.

Representação JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Campos
id

string

ID exclusivo desse modelo.

minimumMinutesAfterShiftStart

integer

Número mínimo de minutos após o início de um turno para que este evento possa começar.

maximumMinutesAfterShiftStart

integer

Número máximo de minutos após o início de um turno que este evento pode iniciar.

durationMinutes

integer

Duração corrigida em minutos deste evento.

startTimeIncrementMinutes

integer

O incremento de tempo (em minutos) usado para gerar o conjunto de possíveis horários de início do evento entre minimumMinutesAfterShiftStart e maximumMinutesAfterShiftStart. Por exemplo, se o mínimo de minutos após o início do turno for 30, o máximo de minutos após o início do turno for 45 e o incremento do horário de início for de 5 minutos, o evento poderá ocorrer 30, 35, 40 ou 45 minutos após o início do turno.

EmployeeDemand

Especifica o número de funcionários necessários para cobrir a demanda em um determinado intervalo DateTime.

Representação JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Campos
startDateTime

object (DateTime)

Início do intervalo de tempo da demanda especificada (inclusive). Esses valores são lidos até os minutos; segundos, e todas as unidades menores serão ignoradas.

endDateTime

object (DateTime)

Fim do intervalo de tempo da demanda em questão (exclusivo). Esses valores são lidos até os minutos; segundos, e todas as unidades menores serão ignoradas.

employeeCount

integer

Número de funcionários necessários para cobrir a demanda desse intervalo.

ShiftGenerationSolutionStatus

Status da solução fornecido na resposta de um solucionador.

Enums
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Status não especificado para a resposta.
SHIFT_GENERATION_SOLVED O solucionador encontrou uma solução no limite de tempo fornecido.
SHIFT_GENERATION_NOT_SOLVED Um problema impediu que o solucionador gerasse mudanças.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED Não foi possível gerar os turnos para cobrir a demanda dentro do limite de tempo.

EmployeeSchedule

Uma lista ordenada de turnos correspondente a uma única ShiftTemplate que será atribuída a vários funcionários.

Representação JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Campos
shiftTemplateId

string

ID do modelo usado para gerar esse conjunto de turnos.

shifts[]

object (ShiftWithEvents)

Lista de turnos a que employeeCount de funcionários está atribuído. Os turnos e eventos selecionados para a programação foram gerados com base em um único modelo. Os turnos são classificados cronologicamente e não se sobrepõem. Se SolverConfig.multi_day_schedule for verdadeiro, um dia de folga será representado implicitamente pela ausência de um turno a partir desse dia.

employeeCount

integer

Número de funcionários que devem ser atribuídos a esse conjunto de turnos para cobrir a demanda.

ShiftWithEvents

Especifica as datas de início e término com uma lista de eventos fixos de uma mudança gerada pelo solucionador.

Representação JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Campos
startDateTime

object (DateTime)

Data e hora de início do turno. Esse valor é especificado até o minuto. segundos e unidades menores não são fornecidas.

endDateTime

object (DateTime)

Data e hora de término do turno. Esse valor é especificado até o minuto. segundos e unidades menores não são fornecidas.

events[]

object (Event)

Lista de eventos incluídos nesse turno, mapeados exatamente para e na mesma ordem que os ShiftTemplate.Events. Se SolverConfig.shift_events_can_change for verdadeiro, os horários de início e término dos eventos poderão variar em todos os ShiftWithEvents desta programação.

Evento

Especifica o DateTime de início e término de um evento específico em uma mudança gerada pelo solucionador.

Representação JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Campos
eventTemplateId

string

ID do modelo usado para gerar esse evento.

startDateTime

object (DateTime)

Data e hora de início do evento. Esse valor é especificado até o minuto. segundos e unidades menores não são fornecidas.

endDateTime

object (DateTime)

Data e hora de término do evento. Esse valor é especificado até o minuto. segundos e unidades menores não são fornecidas.

DemandCoverageViolation

Especifica a violação de cobertura da demanda para o intervalo especificado. A demanda de funcionários é a mesma durante todo o intervalo especificado.

Representação JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "coverageViolation": integer
}
Campos
startDateTime

object (DateTime)

Data e hora de início do intervalo de demanda (inclusivo). Esse valor é especificado até o minuto.

endDateTime

object (DateTime)

Data e hora de término do intervalo de demanda (não incluso). Esse valor é especificado até o minuto.

coverageViolation

integer

Violação de cobertura durante o intervalo especificado. Um valor positivo indica que a demanda foi supercoberta e um valor negativo indica que ela está supercoberta.