Method: scheduling.solveShiftGeneration

Resuelve un problema de generación de cambios de una SolveShiftGenerationRequest determinada mediante la generación de cambios a partir de plantillas de turnos determinadas para cubrir la demanda de los empleados.

Solicitud HTTP

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

La URL usa la sintaxis de la transcodificación gRPC.

Cuerpo de la solicitud

El cuerpo de la solicitud contiene datos con la siguiente estructura:

Representación JSON
{
  "solverConfig": {
    object (SolverConfig)
  },
  "shiftTemplates": [
    {
      object (ShiftTemplate)
    }
  ],
  "employeeDemands": [
    {
      object (EmployeeDemand)
    }
  ]
}
Campos
solverConfig

object (SolverConfig)

Opcional. Son los parámetros del solucionador.

shiftTemplates[]

object (ShiftTemplate)

Obligatorio. Conjunto de plantillas de turnos que especifican reglas para generar cambios.

employeeDemands[]

object (EmployeeDemand)

Obligatorio. Demanda total de los empleados que deben cubrir los turnos generados por shiftTemplates. Los intervalos de DateTime especificados en cada EmployeeDemand deben ser inconexos y pueden no ser adyacentes.

Cuerpo de la respuesta

Respuesta al problema de generación de turnos. Si la solutionStatus que se muestra es SOLVED, entonces se muestra un conjunto de cambios válidos generados por la resolución en employeeSchedules. Para un programa de turnos válido, se cumplen las siguientes propiedades:

  1. Cada cambio generado en employeeSchedules cumple con las reglas especificadas en el ShiftTemplate correspondiente.
  2. Cada evento seleccionado en cada turno cumple con las reglas especificadas en el ShiftTemplate.Event correspondiente.
  3. La cantidad total de empleados asignados al conjunto de turnos generados desde la misma ShiftTemplate no supera el maximumEmployeeCount de esa plantilla.
  4. El conjunto de empleados asignados cubre la demanda en cada intervalo determinado.

Si se ejecuta correctamente, el cuerpo de la respuesta contendrá datos con la siguiente estructura:

Representación JSON
{
  "solutionStatus": enum (ShiftGenerationSolutionStatus),
  "employeeSchedules": [
    {
      object (EmployeeSchedule)
    }
  ]
}
Campos
solutionStatus

enum (ShiftGenerationSolutionStatus)

Estado de la solución devuelta. Si solutionStatus no es SOLVED, employeeSchedules estará vacío.

employeeSchedules[]

object (EmployeeSchedule)

Conjunto de turnos generados por la resolución junto con la cantidad de empleados asignados a cada programa.

SolverConfig

Especifica parámetros adicionales para resolver el problema de generación de turnos.

Representación JSON
{
  "timeLimit": string,
  "multiDaySchedule": boolean,
  "shiftEventsCanChange": boolean
}
Campos
timeLimit

string (Duration format)

Tiempo máximo que el solucionador debe dedicar al problema Si no está configurado, la configuración predeterminada es de 1 minuto. La elección de un límite de tiempo debe depender del tamaño del problema. Por ejemplo, cuando se resuelve una instancia de 7 días con 2 ShiftTemplates, cada una con aproximadamente 20 horas de inicio posibles y con 2 eventos con aprox. 30 posibles horas de inicio y dos días libres por semana, los valores recomendados son <10 s para soluciones rápidas (y probablemente subóptimo), (10 s, 300 s) para soluciones de buena calidad y más de 300 s para una búsqueda exhaustiva. Es posible que las instancias más grandes requieran límites de tiempo más largos.

Este valor no es un límite estricto y no considera la sobrecarga de comunicación. La latencia esperada para resolver el problema puede superar ligeramente este valor.

Una duración en segundos con hasta nueve dígitos decimales que terminen en "s". Ejemplo: "3.5s".

multiDaySchedule

boolean

Si es verdadero, el solucionador genera EmployeeSchedule que incluyen varios cambios (p.ej., para generar un programa de una semana). De lo contrario, cada EmployeeSchedule incluye exactamente un cambio. Los programas de varios días suponen que la hora de inicio del cambio es la misma todos los días, y la cantidad de días libres en ese horario está determinada por las plantillas de turnos. El valor predeterminado es falso.

shiftEventsCanChange

boolean

Si es verdadero, los elementos EmployeeSchedule de varios días pueden incluir cambios en los que la hora de inicio y finalización de sus eventos varía entre todos los días. De lo contrario, todos los cambios de un EmployeeSchedule en particular deben tener las mismas horas de inicio y finalización del evento. En cualquier caso, todos los turnos de un programa de varios días tienen la misma hora de inicio y de finalización. Por lo tanto, este parámetro se ignora si multiDaySchedule es falso. Si estableces este parámetro como verdadero, es posible que los tiempos de resolución sean más largos. El valor predeterminado es falso.

ShiftTemplate

Plantilla que especifica las reglas para generar cambios. Un turno es una unidad de trabajo que especifica una hora de inicio y finalización, y puede contener eventos (p.ej., almuerzo, descansos, etcétera). Se asignará un cambio a una fecha específica en la respuesta.

Representación 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

Es el ID único de esta plantilla.

earliestStartTime

object (TimeOfDay)

Hora más temprana del día en que puede comenzar un cambio. Este valor se especifica con horas y minutos; se ignoran los segundos y los nanos.

latestStartTime

object (TimeOfDay)

Hora más reciente del día en que puede comenzar un turno. Este valor se especifica con horas y minutos; se ignoran los segundos y los nanos. Si este valor es inferior a earliestStartTime, entonces un cambio que genere esta plantilla puede comenzar antes o después de la medianoche.

durationMinutes

integer

La duración fija de un cambio que genera esta plantilla.

startTimeIncrementMinutes

integer

El incremento de tiempo (en minutos) que se usa para generar el conjunto de posibles horas de inicio entre la(s) earliestStartTime y la(s) latestStartTime. Por ejemplo, si la primera hora de inicio es a las 8:00, la última hora de inicio es 8:30 y el incremento de la hora de inicio es de 10 minutos, todas las horas de inicio posibles para esta plantilla de cambio son: 8:00, 8:10, 8:20 y 8:30.

daysOffCountPerWeek

integer

Cantidad fija de días libres por semana. Un empleado tiene un día libre determinado si no está asignado a un turno que comience ese día. Una semana es de 7 días y comienza el domingo.

eventTemplates[]

object (EventTemplate)

Reglas para generar eventos en cada turno. Se incluirá exactamente un evento en cada turno para cada Evento especificado.

minimumIntereventGapMinutes

integer

Cantidad mínima de minutos entre el final de un evento y el inicio del siguiente.

maximumEmployeeCount

integer

Cantidad máxima de empleados que pueden asignarse a todos los turnos generados por esta plantilla.

TimeOfDay

Representa una hora del día. La fecha y la zona horaria no son significativas o se especifican en otro lugar. Una API puede optar por permitir segundos bisiestos. Los tipos relacionados son google.type.Date y google.protobuf.Timestamp.

Representación JSON
{
  "hours": integer,
  "minutes": integer,
  "seconds": integer,
  "nanos": integer
}
Campos
hours

integer

Horas del día en formato de 24 horas. Debe ser del 0 al 23. Una API puede permitir el valor “24:00:00” para casos como el horario de cierre de empresas.

minutes

integer

Minutos de horas del día. Debe ser un valor entre 0 y 59.

seconds

integer

Segundos de minutos de la hora. Por lo general, debe ser un valor entre 0 y 59. Una API puede permitir el valor 60 si permite segundos bisiestos.

nanos

integer

Fracciones de segundos en nanosegundos. Debe ser un valor entre 0 y 999,999,999.

EventTemplate

Plantilla que especifica reglas para generar un solo evento que ocurre durante un cambio. Un evento puede representar una reunión, un descanso, un almuerzo, etcétera.

Representación JSON
{
  "id": string,
  "minimumMinutesAfterShiftStart": integer,
  "maximumMinutesAfterShiftStart": integer,
  "durationMinutes": integer,
  "startTimeIncrementMinutes": integer
}
Campos
id

string

Es el ID único de esta plantilla.

minimumMinutesAfterShiftStart

integer

Cantidad mínima de minutos después del comienzo de un turno en los que puede comenzar este evento.

maximumMinutesAfterShiftStart

integer

Cantidad máxima de minutos después del comienzo de un turno en los que puede comenzar este evento.

durationMinutes

integer

La duración fija de este evento en minutos.

startTimeIncrementMinutes

integer

El incremento de tiempo (en minutos) que se usa para generar el conjunto de posibles horas de inicio del evento entre la(s) minimumMinutesAfterShiftStart y la(s) maximumMinutesAfterShiftStart. Por ejemplo, si el mínimo de minutos después del inicio del turno es de 30, la cantidad máxima de minutos después del inicio del turno es de 45 y el incremento del tiempo de inicio es de 5 minutos, el evento puede ocurrir 30, 35, 40 o 45 minutos después del inicio del turno.

EmployeeDemand

Especifica la cantidad de empleados necesarios para cubrir la demanda en el intervalo DateTime determinado.

Representación JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "employeeCount": integer
}
Campos
startDateTime

object (DateTime)

Inicio del intervalo para la demanda determinada (inclusive). Estos valores se leen hasta el minuto. Se ignoran los segundos y todas las unidades más pequeñas.

endDateTime

object (DateTime)

Final del intervalo de tiempo para la demanda determinada (excluido). Estos valores se leen hasta el minuto. Se ignoran los segundos y todas las unidades más pequeñas.

employeeCount

integer

Cantidad de empleados necesarios para cubrir la demanda de este intervalo.

ShiftGenerationSolutionStatus

Estado de la solución proporcionado en la respuesta de un solucionador.

Enumeradores
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Estado no especificado para la respuesta.
SHIFT_GENERATION_SOLVED El solucionador encontró una solución en el límite de tiempo proporcionado.
SHIFT_GENERATION_NOT_SOLVED Un problema impidió que la herramienta de resolución generara cambios.
SHIFT_GENERATION_NOT_SOLVED_DEADLINE_EXCEEDED No se pudieron generar cambios para cubrir la demanda dentro del límite de tiempo determinado.

EmployeeSchedule

Es una lista ordenada de turnos que corresponde a un único ShiftTemplate que se asignará a un número de empleados.

Representación JSON
{
  "shiftTemplateId": string,
  "shifts": [
    {
      object (ShiftWithEvents)
    }
  ],
  "employeeCount": integer
}
Campos
shiftTemplateId

string

ID de la plantilla que se usó para generar este conjunto de cambios.

shifts[]

object (ShiftWithEvents)

Lista de turnos a los que se asigna la cantidad de employeeCount de empleados. Los turnos y eventos seleccionados para el programa se generaron a partir de una sola plantilla. Los cambios están ordenados cronológicamente y no se superponen. Si el valor de SolverConfig.multi_day_schedule es verdadero, un día libre se representa de forma implícita por la ausencia de un cambio a partir de ese día.

employeeCount

integer

Cantidad de empleados que se deben asignar a este conjunto de turnos para cubrir la demanda.

ShiftWithEvents

Especifica la fecha de inicio y finalización, junto con una lista de eventos fijos de un cambio generado por la resolución.

Representación JSON
{
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  },
  "events": [
    {
      object (Event)
    }
  ]
}
Campos
startDateTime

object (DateTime)

Fecha y hora de inicio del cambio. Este valor se especifica en minutos; no se proporcionan los segundos ni las unidades más pequeñas.

endDateTime

object (DateTime)

Fecha y hora de finalización del cambio. Este valor se especifica en minutos; no se proporcionan los segundos ni las unidades más pequeñas.

events[]

object (Event)

Lista de eventos incluidos en este cambio, asignados exactamente a los ShiftTemplate.Event y en el mismo orden que estos. Si el valor de SolverConfig.shift_events_can_change es verdadero, las horas de inicio y finalización de los eventos pueden variar en todas las ShiftWithEvents de esta programación.

Evento

Especifica la fecha y hora de inicio y finalización de un evento específico en un cambio generado por la resolución.

Representación JSON
{
  "eventTemplateId": string,
  "startDateTime": {
    object (DateTime)
  },
  "endDateTime": {
    object (DateTime)
  }
}
Campos
eventTemplateId

string

ID de la plantilla que se usó para generar este evento.

startDateTime

object (DateTime)

Fecha y hora de inicio del evento Este valor se especifica en minutos; no se proporcionan los segundos ni las unidades más pequeñas.

endDateTime

object (DateTime)

Fecha y hora de finalización del evento Este valor se especifica en minutos; no se proporcionan los segundos ni las unidades más pequeñas.