Method: scheduling.solveShiftGeneration

Resuelve un problema de generación de turnos a partir de un SolveShiftGenerationRequest determinado generando turnos a partir de plantillas de turnos determinadas para satisfacer 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. Parámetros para la resolución

shiftTemplates[]

object (ShiftTemplate)

Obligatorio. Un conjunto de plantillas de turnos que especifican las reglas para generar turnos.

employeeDemands[]

object (EmployeeDemand)

Obligatorio. Demanda total de los empleados que deben cubrir los turnos que genera shiftTemplates.

Cuerpo de la respuesta

Respuesta para el problema de generación de turnos. Si la solutionStatus que se muestra es SOLVED, en employeeSchedules se muestra un conjunto de cambios válidos generados por el solucionador de problemas. En el caso de un programa de turnos válido, se aplican las siguientes propiedades:

  1. Cada cambio generado en employeeSchedules cumple con las reglas especificadas en el ShiftTemplate correspondiente.
  2. Cada evento seleccionado en cada cambio cumple con las reglas especificadas en el ShiftTemplate.Event correspondiente.
  3. La cantidad total de empleados asignados al conjunto de turnos generados a partir del mismo ShiftTemplate no excede los 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)
    }
  ],
  "demandCoverageViolations": [
    {
      object (DemandCoverageViolation)
    }
  ]
}
Campos
solutionStatus

enum (ShiftGenerationSolutionStatus)

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

employeeSchedules[]

object (EmployeeSchedule)

Conjunto de turnos generados por el solucionador junto con el número de empleados asignados a cada programa.

demandCoverageViolations[]

object (DemandCoverageViolation)

Incumplimientos de cobertura de la demanda basados en la employee_counts asignada en la employeeSchedules determinada. Los employeeDemands de la solicitud se agregan. Si dos intervalos employee_demand se superponen, la demanda se suma a la parte del intervalo que se superpone.

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 agente de resolución debería dedicar al problema. Si no se establece, el valor predeterminado es 1 minuto. La elección de un límite de tiempo debería depender del tamaño del problema. Por ejemplo, cuando se resuelve una instancia de 7 días con 2 ShiftTemplates, cada una con alrededor de 20 horas de inicio posibles y manteniendo 2 eventos con alrededor de 30 horas de inicio posibles, y dos días libres por semana, los valores recomendados son los siguientes: <10 s para soluciones rápidas (y probablemente subóptimos), (10 s y 300 s) para soluciones de buena calidad, y más de 300 s para una búsqueda exhaustiva. Las instancias más grandes pueden requerir límites de tiempo más largos.

Este valor no es un límite estricto y no tiene en cuenta la sobrecarga de comunicación. Es posible que la latencia esperada para resolver el problema exceda un poco este valor.

Una duración en segundos con hasta nueve dígitos decimales, que terminan 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 turno es la misma para todos los días, y que las plantillas de turnos determinan la cantidad de días libres de ese horario. El valor predeterminado es falso.

shiftEventsCanChange

boolean

Si esta preferencia se establece como "true", los elementos EmployeeSchedule de varios días pueden incluir cambios para los cuales la hora de inicio y finalización de los eventos varía en todos los días. De lo contrario, todos los turnos de una EmployeeSchedule determinada deben tener las horas de inicio y finalización del mismo evento. En cualquier caso, todos los turnos de una programación 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 turnos. Un turno es una unidad de trabajo que especifica una hora de inicio y finalización, y puede contener eventos (por ejemplo, almuerzos, descansos, etc.). 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

ID único de esta plantilla.

earliestStartTime

object (TimeOfDay)

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

latestStartTime

object (TimeOfDay)

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

durationMinutes

integer

Duración fija de un cambio generado por esta plantilla.

startTimeIncrementMinutes

integer

El incremento de tiempo (en minutos) que se usa para generar el conjunto de horas de inicio posibles entre earliestStartTime y latestStartTime. Por ejemplo, si la primera hora de inicio es 8:00, la última hora de inicio es 8:30 y el incremento de la hora de inicio es 10 minutos, todos los horarios 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 se le asigna un turno que comience ese día. Una semana dura 7 días y comienza el domingo.

eventTemplates[]

object (EventTemplate)

Reglas de generación de eventos para cada turno Se incluirá exactamente un evento en cada turno para cada evento especificado.

minimumIntereventGapMinutes

integer

Minutos mínimos 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 con 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 las reglas para generar un solo evento que ocurre durante un turno. 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 en los que puede comenzar este evento después del comienzo de un turno.

maximumMinutesAfterShiftStart

integer

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

durationMinutes

integer

Duración fija en minutos del evento

startTimeIncrementMinutes

integer

El incremento de tiempo (en minutos) que se usa para generar el conjunto de posibles horas de inicio de eventos entre minimumMinutesAfterShiftStart y maximumMinutesAfterShiftStart. Por ejemplo, si la cantidad mínima 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 de la hora de inicio es de 5 minutos, el evento puede tener lugar 30, 35, 40 o 45 minutos después del cambio.

EmployeeDemand

Especifica la cantidad de empleados necesarios para cubrir la demanda en el intervalo de fecha y hora determinado.

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

object (DateTime)

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

endDateTime

object (DateTime)

Final del intervalo de la demanda determinada (exclusivo). Estos valores se leen por minuto. segundos y se ignoran 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 una resolución.

Enumeraciones
SHIFT_GENERATION_SOLUTION_STATUS_UNSPECIFIED Estado sin especificar 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 establecido.

EmployeeSchedule

Una lista ordenada de turnos correspondientes a un único ShiftTemplate que se asignará a una cantidad de empleados.

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

string

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

shifts[]

object (ShiftWithEvents)

Lista de turnos a los que se asignó employeeCount número de empleados. Los turnos y eventos seleccionados para la programación se generaron a partir de una sola plantilla. Los cambios se ordenan 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 que comience ese día.

employeeCount

integer

Cantidad de empleados que deben asignarse 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 el solucionador.

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

object (DateTime)

Es la fecha y hora de inicio del cambio. Este valor se especifica por minuto. segundos y unidades más pequeñas.

endDateTime

object (DateTime)

Es la fecha y hora de finalización del cambio. Este valor se especifica por minuto. segundos y 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 todos los ShiftWithEvents de este programa.

Evento

Especifica la fecha y hora de inicio y finalización de un evento específico en un cambio que generó el solucionador.

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

string

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

startDateTime

object (DateTime)

Es la fecha y hora de inicio del evento. Este valor se especifica por minuto. segundos y unidades más pequeñas.

endDateTime

object (DateTime)

Es la fecha y hora de finalización del evento. Este valor se especifica por minuto. segundos y unidades más pequeñas.

DemandCoverageViolation

Especifica el incumplimiento de la cobertura de la demanda para el intervalo determinado. La demanda de empleados es la misma durante todo el intervalo especificado.

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

object (DateTime)

Es la fecha y hora de inicio del intervalo de demanda (inclusive). Este valor se especifica por minuto.

endDateTime

object (DateTime)

Es la fecha y hora de finalización del intervalo de demanda (exclusivo). Este valor se especifica por minuto.

coverageViolation

integer

Incumplimiento de cobertura durante el intervalo especificado. Un valor positivo indica que la demanda está sobrecubierta, y un valor negativo indica que está subcubierta.