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 simples, 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 del LSNDSP es el enrutamiento de cargas, que determina qué demandas satisfacer y qué rutas asignar a la carga para maximizar los ingresos.
Solicitud HTTP
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
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 |
---|
{ "requestId": string, "solverParameters": { object ( |
Campos | |
---|---|
requestId |
ID de solicitud o problema. |
solverParameters |
Parámetros para la resolución |
ports[] |
Lista de posibles puertos a los que se llamará en los servicios de embarcaciones. La solicitud solo debe contener los IDs de puerto que figuran en esta lista. |
legCandidates[] |
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. |
vesselClasses[] |
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. |
commodityDemands[] |
Lista de posibles demandas de productos básicos (es decir, contenedores) que los servicios de embarcaciones deben satisfacer. |
vesselServices[] |
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. |
Cuerpo de la respuesta
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 de transporte.
Si se ejecuta correctamente, el cuerpo de la respuesta contendrá datos con la siguiente estructura:
Representación JSON |
---|
{ "requestId": string, "vesselServices": [ { object ( |
Campos | |
---|---|
requestId |
El ID de la solicitud con la que se asocia esta respuesta. |
vesselServices[] |
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. |
commodityDemandPaths[] |
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, commodityDemandPaths depende de barcoServices (consulte la definición de CommodityDemandPath). |
SolverParameters
Son parámetros que controlan una resolución única de LSNDSP.
Representación JSON |
---|
{ "timeLimit": string } |
Campos | |
---|---|
timeLimit |
Tiempo máximo que el agente de resolución debería dedicar al problema. 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 “ |
Puerto
Puerto, p.ej., una terminal o todas las terminales de un puerto.
Representación JSON |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Campos | |
---|---|
id |
Es el ID único asignado a este puerto. |
minimumPortStayDuration |
Es la duración mínima de la estadía para una llamada de puerto. La mayoría de los estudios se mantienen constantes, ya que suelen asignar más grúas a las embarcaciones más grandes con una alta cantidad de movimientos, ya que ocupan más espacio. |
minimumTransshipmentDuration |
Duración mínima de un transbordo en un puerto determinado, incluida la duración de la descarga de un contenedor y su carga en otra embarcación. |
transshipmentCost |
Costo del transenvío de un contenedor. Por lo general, será inferior a la suma de carga y descarga, ya que el transbordo no requiere papeleo de aduana en el puerto. |
vesselClassCosts |
Costos generados al llamar a este puerto asignados por el ID de clase de la embarcación. Una clase de embarcación solo puede llamar a este puerto si tiene una entrada en este mapa. Es un objeto que contiene una lista de pares |
Duración
La duración (estadía o transporte desde el puerto, o transporte público en función de la demanda) se define en un nivel de detalle por hora.
Representación JSON |
---|
{ "hours": string } |
Campos | |
---|---|
hours |
Cantidad de horas que definen la duración. |
VesselCost
El costo del buque por llamar y permanecer en este puerto se define como una función lineal de la duración de la estadía (fixedCost
+ hourlyCost
* horas).
Representación JSON |
---|
{ "fixedCost": number, "hourlyCost": number } |
Campos | |
---|---|
fixedCost |
Costo fijo para llamar a este puerto. |
hourlyCost |
Costo por hora de estadía en este puerto. |
LegCandidate
Candidato para el tramo de servicio en buques. Puede haber varios candidatos de etapa entre los mismos dos puertos, p.ej., que representen diferentes rutas oceánicas o velocidades de las embarcaciones.
Representación JSON |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Campos | |
---|---|
id |
ID único asignado a este candidato del segmento. |
departurePortId |
ID del puerto de salida. |
arrivalPortId |
ID del puerto de llegada. |
duration |
Duración de la pierna. |
vesselClassCosts |
Costo por asignar esta variante de tramo a una clase determinada de embarcación. Esto puede incluir el costo operativo de la embarcación, el costo del búnker y el costo del chárter. Una clase de embarcación solo puede navegar por este tramo candidato si tiene una entrada en este mapa. Es un objeto que contiene una lista de pares |
VesselClass
Clase del buque, es decir, un grupo de embarcaciones que comparten las mismas propiedades. No hay forma de diferenciar entre dos embarcaciones de la misma clase.
Representación JSON |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
Campos | |
---|---|
id |
Es un ID único asignado a esta clase de embarcación. |
containerCapacity |
Capacidad de la clase del depósito (en contenedores). |
vesselCount |
Cantidad de embarcaciones en esta clase de embarcaciones. |
CommodityDemand
Demanda de productos básicos, es decir, una demanda potencial que debe satisfacer un transportista.
Representación JSON |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
Campos | |
---|---|
id |
Es el ID único asignado a esta demanda de productos básicos. |
originPortId |
ID del puerto de origen. |
destinationPortId |
Es el ID del puerto de destino. |
containerCount |
Cantidad máxima de contenedores que se entregarán. |
freightRate |
Es la tarifa de flete por contenedor (que podría incluir una sanción por la demanda no satisfecha). Debería quitar el costo de carga y descarga por contenedor en el origen y el destino. |
maximumTransitDuration |
Duración máxima en tránsito (si se establece, debe ser estrictamente positiva). El tiempo en tránsito se define desde el momento en que la primera embarcación que entrega esta demanda sale del puerto de origen hasta el momento en que la última embarcación que entrega esta demanda llega al puerto de destino. |
VesselService
Servicio de embarcaciones que puede usarse para atender la demanda de materias primas. IMPORTANTE: Actualmente, se supone que los servicios tienen una frecuencia semanal y que los tiempos de estadía del puerto no pueden exceder una semana. Considera la siguiente secuencia de tramos de servicio de la embarcación: barcoServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" originDepartureTime { day: 4 } destinationArrivalTime { day: 7 hourOfDay: 12 } } Estos tramos definen líneas de servicio de una semana que pasan por dos puertos con tiempos de estadía del puerto de 12 horas.
Representación JSON |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Campos | |
---|---|
vesselClassId |
Es el ID de la clase del buque que realiza el servicio. |
vesselServiceLegs[] |
Para un servicio de transporte marítimo válido, se cumplen las siguientes propiedades: 1. No puede estar vacío. 2. Etapas consecutivos destinationPortId y originPortId deben coincidir (incluso para el último segmento y el primer segmento). |
VesselServiceLeg
Una sola etapa de un servicio de embarcaciones.
Representación JSON |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Campos | |
---|---|
legCandidateId |
Se asignó el ID de candidato de etapa. |
originDepartureTime |
Hora de salida en el puerto de origen según el horario semanal. |
destinationArrivalTime |
Hora de llegada al puerto de destino en el horario semanal. |
ScheduleTime
Un horario programado (salida/llegadas de buques/demandas) se define en una frecuencia semanal en una hora determinada.
Representación JSON |
---|
{ "day": string, "hourOfDay": integer } |
Campos | |
---|---|
day |
Día programado. El día 0 es el primer día posible. |
hourOfDay |
La hora del día de la hora programada debe ser un número entero entre 0 y 23, ambos incluidos. |
CommodityDemandPath
Son los diferentes servicios y puertos que recibe una fracción de la demanda de un producto básico. Los índices que se utilizan a continuación se basan en el orden de los servicios de embarcaciones en la respuesta y el orden de los tramos de servicio en los servicios de embarcaciones individuales.
Representación JSON |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Campos | |
---|---|
commodityDemandId |
ID de demanda de productos básicos completado. |
containerCount |
Cantidad de contenedores que pasan por esta ruta. Para cada demanda de materias primas, la cantidad total entregada no puede superar la demanda total. |
vesselServiceLegIds[] |
Lista de los IDs de los tramos de servicio de la embarcación que se toman por esta ruta. Para una ruta válida de demanda de materias primas, las siguientes propiedades cumplen con lo siguiente: 1. El valor de departurePortId del primer segmento debe coincidir con originPortId de la demanda de productos básicos. 2. El destinationPortId del último segmento debe coincidir con el valor destinationPortId de la demanda de productos básicos. 3. Etapas consecutivos Los valores de startPortId y departurePortId deben coincidir. 4. Si se proporciona para esta demanda de productos básicos, el tiempo máximo en tránsito debe ser mayor o igual que la duración total de la ruta. |
VesselServiceLegId
Tramo de servicio de una sola embarcación usado en una ruta de demanda de materias primas. Por ejemplo, considera que existen dos servicios de embarcaciones. El primero está compuesto por tres segmentos (0, 1 y 2 indexados) y los dos segundos (0 y 1 indexados). Además, la primera etapa del primer servicio llega al puerto de salida de la segunda etapa del segundo servicio. Una ruta de productos básicos que consta de los tres siguientes IDs de tramos de servicio de embarcaciones: {vesselServiceIndex: 0, recipientServiceLegIndex: 2} {vesselServiceIndex: 0, recipientServiceLegIndex: 0} {vesselServiceIndex: 1, recipientServiceLegIndex: 1} significa que los contenedores de servicio de embarcaciones toman 2 tramos de servicio consecutivo 1 a cada buque 0 en el ciclo de 1 de cada servicio.
Representación JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
Campos | |
---|---|
vesselServiceIndex |
Índice del servicio de embarcaciones. |
vesselServiceLegIndex |
Índice del tramo del servicio de embarcaciones indexado por |