Package google.research.optimization.v1

Índice

Optimización

Una API de One Platform que expone un conjunto de soluciones de optimización para problemas de investigación de operaciones de alto nivel. MOE:begin_strip

DesignShippingNetwork

rpc DesignShippingNetwork(DesignShippingNetworkRequest) returns (DesignShippingNetworkResponse)

Soluciona el problema de diseño y programación de la red de envío de transporte (LSNDSP) a partir de un DesignShippingNetworkRequest determinado.

El LSNDSP es un problema de optimización complejo que busca encontrar el diseño y la programación óptimos de una red de transporte de transporte. El objetivo es minimizar el costo total de operación de la red, al mismo tiempo que se satisface la mayor cantidad de demanda de carga entre puertos como sea posible.

El LSNDSP puede dividirse en dos subproblemas principales: diseño y programación de la red. El subproblema de diseño de la red determina el conjunto de puertos a los que debe prestar servicio la red, la cantidad de embarcaciones que deben desplegarse en cada ruta y las rutas que tomarán las embarcaciones. El subproblema de programación determina los horarios de navegación de las embarcaciones, teniendo en cuenta el tiempo que se tarda en navegar entre los puertos, el tiempo que se tarda en cargar y descargar la carga, y la demanda de transporte de carga entre los puertos.

En palabras sencillas, el LSNDSP es el problema de decidir qué puertos atender, cuántos barcos usar y cómo programar los barcos para que se minimice el costo de operación de la red y se maximicen los ingresos para satisfacer la demanda de carga. Un subcomponente desafiante de la LSNDSP es el enrutamiento de cargas, que determina qué demandas satisfacer y qué rutas asignar a la carga para maximizar los ingresos.

SolveMathOptModel

rpc SolveMathOptModel(SolveMathOptModelRequest) returns (SolveMathOptModelResponse)

Resuelve el modelo de entrada y muestra el resultado de una sola vez. Úsalo cuando no necesites devoluciones de llamada ni incrementalidad, ni hacer un seguimiento del progreso de una solución.

SolveShiftGeneration

rpc SolveShiftGeneration(SolveShiftGenerationRequest) returns (SolveShiftGenerationResponse)

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.

SolveShiftScheduling

rpc SolveShiftScheduling(SolveShiftSchedulingRequest) returns (SolveShiftSchedulingResponse)

Soluciona un problema fijo de programación de turnos de un SolveShiftSchedulingRequest dado asignando a los empleados turnos, de manera que se maximicen las preferencias de horarios de los empleados y se minimicen los incumplimientos de las restricciones de horario.

DesignShippingNetworkRequest

La solicitud contiene una instancia del LSNDSP y debe contener un conjunto de puertos, un conjunto de candidatos de etapa, un conjunto de clases de embarcaciones y un conjunto de demandas de materias primas que se deben cumplir.

Campos
request_id

string

ID de solicitud o problema.

solver_parameters

SolverParameters

Parámetros para la resolución

ports[]

Port

Lista de posibles puertos a los que se llamará en los servicios de embarcaciones. La solicitud solo debe contener los IDs de puerto que se encuentran en esta lista.

leg_candidates[]

LegCandidate

Lista de posibles candidatos para la etapa correspondiente a los servicios de embarcaciones. La solicitud solo debe contener los IDs de candidatos de etapa que se encuentren en esta lista.

vessel_classes[]

VesselClass

Lista de clases de embarcaciones para realizar servicios de embarcaciones. Ten en cuenta que todas las embarcaciones de la misma clase son completamente intercambiables. La solicitud solo debe contener los IDs de clase de embarcación que se encuentran en esta lista.

commodity_demands[]

CommodityDemand

Lista de posibles demandas de productos básicos (es decir, contenedores) que los servicios de embarcaciones deben satisfacer.

vessel_services[]

VesselService

Se puede proporcionar una red de servicios de embarcaciones válidos (por lo general, el estado actual de la red) para utilizarla como punto de partida para la optimización.

DesignShippingNetworkResponse

La respuesta contiene la solución a la instancia LSNDSP que se pasó en la solicitud. Contiene una red válida de servicios de embarcaciones y rutas de demanda de materias primas. La demanda total de productos básicos que atraviesa cada segmento no puede exceder la capacidad de la clase de embarcación que sirve para este segmento. Ten en cuenta que no tener servicios de embarcaciones ni satisfacer la demanda es siempre una solución factible al problema de diseño y programación de la red de envío de transporte transatlántico.

Campos
request_id

string

El ID de la solicitud con la que se asocia esta respuesta.

vessel_services[]

VesselService

Red de servicios marítimos. Para cada clase, la cantidad total de embarcaciones utilizadas no puede superar la cantidad disponible de embarcaciones para esta clase.

commodity_demand_paths[]

CommodityDemandPath

Lista de todas las rutas de demanda de productos básicos a través de las cuales se envía una demanda positiva de productos básicos. Ten en cuenta que es posible que algunos IDs de demanda de productos básicos no se incluyan si no se envía demanda. Como alternativa, la demanda de materias primas puede satisfacerse parcialmente. Para cada demanda de materias primas, la cantidad total entregada no puede superar la demanda total. Por último, commodity_demand_paths depende de recipient_services (consulta la definición de CommodityDemandPath).

SolveMathOptModelRequest

Solicitud de una resolución remota unario en MathOpt.

Campos
solver_type

SolverTypeProto

Opcional. Tipo de solucionador para resolver numéricamente el problema. Ten en cuenta que si un solucionador no admite una función específica en el modelo, el procedimiento de optimización no será exitoso.

model

ModelProto

Obligatorio. Representación matemática del problema de optimización que se debe resolver.

parameters

SolveParametersProto

Opcional. Parámetros para controlar una sola resolución. El parámetro enable_output se controla de manera específica. En el caso de los solucionadores que admiten devoluciones de llamada de mensajes, establecerlo en verdadero hará que el servidor registre una devolución de llamada de mensaje. Los mensajes resultantes se mostrarán en resolveMathOptModelResponse.messages. Para otros solucionadores, configurar enable_output como verdadero generará un error.

model_parameters

ModelSolveParametersProto

Opcional. Son parámetros para controlar una sola resolución que son específicos del modelo de entrada (consulta Resolver parámetrosProto para conocer los parámetros independientes del modelo).

SolveMathOptModelResponse

Respuesta para una resolución remota unario en MathOpt.

Campos
result

SolveResultProto

Descripción del resultado de la resolución del modelo en la solicitud.

messages[]

string

Si se usó ResolverParametersProto.enable_output, contendrá mensajes de registro para los solucionadores que admiten devoluciones de llamadas de mensajes.

SolveShiftGenerationRequest

Solicitud para resolver el problema de generación de turnos. Las reglas para generar cambios se describen en cada ShiftTemplate. Se pueden generar varios cambios en la respuesta a partir de un solo ShiftTemplate. Los turnos generados y seleccionados por el solucionador deben cumplir con las reglas descritas en ShiftTemplate y cubrir la demanda de empleados especificada.

Campos
solver_config

SolverConfig

Opcional. Parámetros para la resolución

shift_templates[]

ShiftTemplate

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

employee_demands[]

EmployeeDemand

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

SolveShiftGenerationResponse

Respuesta para el problema de generación de turnos. Si la solution_status que se muestra es SOLVED, en employee_schedules 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 employee_schedules 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 maximum_employee_count de esa plantilla.
  4. El conjunto de empleados asignados cubre la demanda en cada intervalo determinado.

Campos
solution_status

ShiftGenerationSolutionStatus

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

employee_schedules[]

EmployeeSchedule

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

demand_coverage_violations[]

DemandCoverageViolation

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

SolveShiftSchedulingRequest

Solicitud para la API de programación del personal. Como mínimo, la solicitud especifica un conjunto de empleados, un conjunto de turnos, un conjunto de posibles funciones que un empleado puede realizar y un conjunto de requisitos de cobertura. Los requisitos de cobertura especifican, a lo largo de un período, la cantidad de empleados necesarios para cumplir cada rol. A los empleados asignados a un turno también se les asigna una (y solo una) función para ese turno, y no se les puede asignar a dos turnos superpuestos. Consulta el siguiente SolveShiftSchedulingResponse para obtener más detalles sobre los motivos por los que una asignación de turnos es válida.

Se pueden especificar restricciones de horario adicionales para cada empleado a fin de limitar aún más el problema. Todas las restricciones de programación y los requisitos de cobertura tienen un nivel de prioridad (OBLIGATORIO, ALTO, MEDIO, BAJO). El solucionador debe satisfacer todas las restricciones con nivel de prioridad PRIORITY_MANDATORY. El solucionador puede incumplir las restricciones que tienen cualquier otra prioridad, pero estas infracciones se minimizan en el orden de prioridad. Consulta la enumeración Priority para obtener más detalles sobre cómo se controlan los niveles de prioridad de cada restricción.

La herramienta de resolución intentará maximizar los valores de ShiftPreference.preference para cada empleado con respecto a las restricciones determinadas. El solucionador no infringirá una restricción para satisfacer más preferencias; solo infringirá una restricción si la asignación de programación es inviable bajo las restricciones dadas.

Nota sobre la hora: Todas las horas del problema se especifican con el mensaje DateTime. El mensaje incluye un campo TimeZone. Se supone que la zona horaria es UTC, a menos que el usuario especifique lo contrario. Los mensajes DateTime solo deben especificarse hasta minutos. Se ignoran los segundos y nano.

Campos
request_id

string

ID de solicitud o problema.

solve_parameters

SolveParameters

Parámetros para controlar una única solución del problema.

employees[]

Employee

Se programan todos los empleados disponibles.

shifts[]

Shift

Todos los turnos para definir el cronograma.

coverage_requirements[]

CoverageRequirement

Requisitos de cobertura para todo el horizonte de planificación. Estas especifican la cantidad de empleados que deben cumplir cada función, o que poseen una habilidad, durante un período o una lista de IDs de turnos. Todos los requisitos de cobertura deben especificarse con un período o con una lista de los IDs de los cambios (pero no con ambos). Los períodos (si se proporcionan) de los requisitos de cobertura no pueden superponerse para cada ubicación determinada. El nivel de prioridad predeterminado para cada una de estas restricciones es PRIORITY_MANDATORY para los requisitos de la función y PRIORITY_LOW para los requisitos de habilidad. Consulta la enum Priority para obtener más detalles.

role_ids[]

string

Lista de todos los puestos posibles en la fuerza laboral. Cada empleado debe tener al menos una función que se le pueda asignar para un turno. Un rol se refiere a una asignación de trabajo específica durante un turno (es decir, enfermero registrado, chef ejecutivo, camarero, etcétera). Cuando se asigna un turno a un empleado, también se le asigna una función específica.

skill_ids[]

string

Lista de todas las habilidades posibles en la fuerza laboral. Una habilidad se refiere a cualquier calificación adicional que un empleado pueda tener y que no esté relacionada con un trabajo asignable específico (es decir, certificaciones, idiomas que se hablan, etc.). Esta lista puede estar vacía. Cuando se asigna un turno a un empleado, debe cumplir con todas las habilidades necesarias para ese turno.

location_ids[]

string

Lista de todas las ubicaciones posibles para el conjunto de turnos en el horario. Esta lista puede estar vacía. Especificar diferentes ubicaciones puede ser útil cuando, por ejemplo, un gerente de enfermería quiere programar muchas sesiones de enfermería en diferentes unidades de un hospital o, por ejemplo, el gerente de un hotel quiere reservar empleados en varios hoteles.

budget_requirements[]

BudgetRequirement

Especificación de presupuesto para el problema de programación. El nivel de prioridad predeterminado para cada uno de estos requisitos es PRIORITY_LOW. Consulta la enum Priority para obtener más detalles.

assignments_hint[]

ShiftAssignment

Cambia las asignaciones para usarlas como una solución tentativa (también conocida como sugerencia de solución) para el problema de programación. Las sugerencias de asignación se ignoran si la asignación contradice un cambio no asignable o una solicitud de programación.

SolveShiftSchedulingResponse

Respuesta para la API de programación del personal. Para cada respuesta, el shift_assignments estará vacío si el solution_status que se muestra es NOT_SOLVED_DEADLINE_EXCEEDED o INFEASIBLE. Si el solution_status que se muestra es OPTIMAL o FEASIBLE, se muestra una asignación de cambio válida en shift_assignments. Para una asignación de cambio válida, se cumplen las siguientes propiedades:

  1. Cada ID de empleado está incluido en el conjunto de empleados que se proporciona en la solicitud.
  2. Cada ID de rol asignado al empleado está incluido en el conjunto de ID de rol para el empleado dado.
  3. Cada ID de cambio está contenido en el conjunto de cambios indicado en la solicitud.
  4. Cada ID de turno no es uno de los ID de turno no asignables para el empleado dado.
  5. Un empleado nunca tendrá asignado dos turnos que se superpongan.
  6. Para la programación determinada, no se infringe ninguna de las restricciones o solicitudes con el nivel de prioridad PRIORITY_MANDATORY.

Campos
request_id

string

El ID de la solicitud con la que se asocia esta respuesta.

solution_status

SolutionStatus

Estado de la solución que se muestra. Si la solución no es ÓPTIMA ni FEASIBLE, es posible que otros campos de este protocolo estén vacíos. Si el estado es NOT_SOLVED_DEADLINE_EXCEEDED, se alcanzó el límite de tiempo sin encontrar una solución factible o determinar si existe una. Las solicitudes pueden ser inviables si no se pueden satisfacer todas las restricciones del nivel de prioridad OBLIGATORIO.

shift_assignments[]

ShiftAssignment

Lista de todas las asignaciones. Cada ShiftAssignment especifica un empleado, el turno que se le asigna y el rol que se le asigna para realizar en ese turno.

status_message

string

Si solution_status no es óptimo, este campo puede contener información adicional sobre la resolución.