Method: shipping.designShippingNetwork

Risolve il problema di progettazione e pianificazione della rete di spedizione di linea (LSNDSP) dal DesignShippingNetworkRequest specificato.

L'LSNDSP è un complesso problema di ottimizzazione che cerca di trovare la progettazione e la pianificazione ottimali di una rete di spedizione di linea. L'obiettivo è ridurre al minimo il costo totale di gestione della rete e soddisfare il più possibile la domanda di merci tra i porti.

L'LSNDSP può essere suddiviso in due sottoproblemi principali: progettazione della rete e pianificazione. Il sottoproblema di progettazione della rete determina l'insieme di porte servite dalla rete, il numero di navi da impiegare su ciascuna rotta e le rotte che dovranno seguire. Il sottoproblema di pianificazione determina gli orari delle navi, tenendo conto del tempo necessario per navigare tra i porti, del tempo necessario per caricare e scaricare le merci e la richiesta di trasporto di merci tra i porti.

In parole semplici, l'LSNDSP è il problema di decidere quali porti servire, quante navi usare e come pianificare le navi in modo da ridurre al minimo il costo di gestione della rete e massimizzare al contempo le entrate per soddisfare la domanda di carico. Un sottocomponente complesso dell'LSNDSP è il routing delle merci, che determina quali richieste soddisfare e quali percorsi assegnare alle merci per massimizzare le entrate.

Richiesta HTTP

POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork

L'URL utilizza la sintassi di transcodifica gRPC.

Corpo della richiesta

Il corpo della richiesta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "requestId": string,
  "solverParameters": {
    object (SolverParameters)
  },
  "ports": [
    {
      object (Port)
    }
  ],
  "legCandidates": [
    {
      object (LegCandidate)
    }
  ],
  "vesselClasses": [
    {
      object (VesselClass)
    }
  ],
  "commodityDemands": [
    {
      object (CommodityDemand)
    }
  ],
  "vesselServices": [
    {
      object (VesselService)
    }
  ]
}
Campi
requestId

string

ID problema o richiesta.

solverParameters

object (SolverParameters)

Parametri del risolutore.

ports[]

object (Port)

Elenco di possibili porte da chiamare nei servizi navale. La richiesta deve contenere solo gli ID delle porte presenti in questo elenco.

legCandidates[]

object (LegCandidate)

Elenco di potenziali candidati alla tappa da aggiungere ai servizi navale. La richiesta deve contenere solo gli ID dei candidati alle gambe presenti in questo elenco.

vesselClasses[]

object (VesselClass)

Elenco di classi di imbarcazioni per eseguire servizi su imbarcazioni. Nota che tutte le navi della stessa classe sono completamente intercambiabili. La richiesta deve contenere solo gli ID delle classi delle imbarcazioni presenti in questo elenco.

commodityDemands[]

object (CommodityDemand)

Elenco delle potenziali richieste di materie prime (ad es. container) che devono essere soddisfatte dai servizi navale.

vesselServices[]

object (VesselService)

È possibile fornire una rete di servizi navale validi (in genere lo stato attuale della rete) da utilizzare come punto di partenza per l'ottimizzazione.

Corpo della risposta

La risposta contiene la soluzione dell'istanza LSNDSP passata nella richiesta. Contiene una rete valida di servizi navale e percorsi di domanda delle materie prime. La domanda totale di materie prime attraversando ogni tratto non può superare la capacità della classe della nave che gestisce questa tratta. Tieni presente che non disporre di servizi per navi senza domanda soddisfatta è sempre una soluzione fattibile al problema di progettazione e pianificazione della rete di spedizione di linea.

In caso di esito positivo, il corpo della risposta contiene dati con la seguente struttura:

Rappresentazione JSON
{
  "requestId": string,
  "vesselServices": [
    {
      object (VesselService)
    }
  ],
  "commodityDemandPaths": [
    {
      object (CommodityDemandPath)
    }
  ]
}
Campi
requestId

string

L'ID della richiesta a cui è associata questa risposta.

vesselServices[]

object (VesselService)

Rete di servizi navale. Per ciascuna classe di navi, il numero totale di navi utilizzate non può superare il numero disponibile di navi per questa classe.

commodityDemandPaths[]

object (CommodityDemandPath)

Elenco di tutti i percorsi di domanda delle materie prime attraverso cui viene evasa la domanda positiva delle materie prime. Tieni presente che alcuni ID domanda di materie prime potrebbero non essere inclusi se non viene evasa nessuna domanda. In alternativa, la domanda di materie prime può essere parzialmente soddisfatta. Per ogni domanda di materie prime, la quantità totale soddisfatta non può superare la domanda totale. Infine, i valori commodityDemandPath dipendono da vesselServices (consulta la definizione di CommodityDemandPath).

SolverParameters

Parametri che controllano una singola risoluzione dell'LSNDSP.

Rappresentazione JSON
{
  "timeLimit": string
}
Campi
timeLimit

string (Duration format)

Tempo massimo che il risolutore dovrebbe dedicare al problema. Questo valore non rappresenta un limite rigido e non tiene conto dell'overhead di comunicazione. La latenza prevista per risolvere il problema potrebbe superare leggermente questo valore.

Durata in secondi con un massimo di nove cifre frazionarie e termina con "s". Esempio: "3.5s".

Porta

Porta, ad es. un terminale o tutti i terminali di una porta.

Rappresentazione JSON
{
  "id": string,
  "minimumPortStayDuration": {
    object (Duration)
  },
  "minimumTransshipmentDuration": {
    object (Duration)
  },
  "transshipmentCost": number,
  "vesselClassCosts": {
    string: {
      object (VesselCost)
    },
    ...
  }
}
Campi
id

string

ID univoco assegnato a questa porta.

minimumPortStayDuration

object (Duration)

Durata minima del soggiorno per una chiamata di trasferimento. La maggior parte degli studi ipotizza una situazione costante poiché i porti di solito assegnano più gru a navi più grandi con un numero di movimenti elevato, in quanto occupano più spazio.

minimumTransshipmentDuration

object (Duration)

Durata minima di un trasbordo in un determinato porto, inclusa la durata dello scarico di un container e del ricaricamento su un'altra imbarcazione.

transshipmentCost

number

Costo della transspedizione di un container. Di solito è inferiore alla somma delle operazioni di carico e scarico, in quanto il transspedizione non richiede documenti doganali al porto.

vesselClassCosts

map (key: string, value: object (VesselCost))

Costi sostenuti per la chiamata a questa porta mappati in base all'ID classe dell'imbarcazione. Una classe imbarcazione può chiamare questa porta solo se è presente una voce in questa mappa.

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

Durata

La durata (soggiorno/trasporto al porto, trasporto della domanda) viene definita con una granularità oraria.

Rappresentazione JSON
{
  "hours": string
}
Campi
hours

string (int64 format)

Numero di ore che definiscono la durata.

VesselCost

Il costo dell'imbarcazione per chiamare e soggiornare in questo porto è definito come una funzione lineare della durata del soggiorno (fixedCost + hourlyCost * ore).

Rappresentazione JSON
{
  "fixedCost": number,
  "hourlyCost": number
}
Campi
fixedCost

number

Costo fisso per la chiamata di questa porta.

hourlyCost

number

Costo orario del soggiorno in questo porto.

LegCandidate

Candidato ramo di servizio imbarcazione. Possono esserci più sezioni candidati tra le stesse due porte, ad esempio che rappresentano le diverse rotte oceaniche e/o velocità delle navi.

Rappresentazione JSON
{
  "id": string,
  "departurePortId": string,
  "arrivalPortId": string,
  "duration": {
    object (Duration)
  },
  "vesselClassCosts": {
    string: number,
    ...
  }
}
Campi
id

string

ID univoco assegnato a questo candidato di una fase.

departurePortId

string

ID del porto di partenza.

arrivalPortId

string

ID della porta di arrivo.

duration

object (Duration)

Durata della gamba.

vesselClassCosts

map (key: string, value: number)

Costo di assegnazione di questo candidato di gamba a una determinata classe di imbarcazioni. Possono essere inclusi i costi di gestione dell'imbarcazione, i costi del bunker e il costo del noleggio. Una classe imbarcazione può navigare attraverso questa gamba candidata solo se è presente una voce in questa mappa.

Un oggetto contenente un elenco di "key": value coppie. Esempio: { "name": "wrench", "mass": "1.3kg", "count": "3" }.

VesselClass

Classe di imbarcazione, ovvero un gruppo di navi che condividono le stesse proprietà. Non c'è modo di distinguere tra due navi della stessa classe.

Rappresentazione JSON
{
  "id": string,
  "containerCapacity": string,
  "vesselCount": string
}
Campi
id

string

ID univoco assegnato a questa classe imbarcazione.

containerCapacity

string (int64 format)

Capacità della classe del recipiente (in container).

vesselCount

string (int64 format)

Numero di navi in questa classe navale.

CommodityDemand

Domanda di materie prime, ovvero una domanda potenziale che il corriere deve soddisfare.

Rappresentazione JSON
{
  "id": string,
  "originPortId": string,
  "destinationPortId": string,
  "containerCount": string,
  "freightRate": number,
  "maximumTransitDuration": {
    object (Duration)
  }
}
Campi
id

string

ID univoco assegnato a questa domanda di materie prime.

originPortId

string

ID della porta di origine.

destinationPortId

string

ID della porta di destinazione.

containerCount

string (int64 format)

Numero massimo di container da completare.

freightRate

number

Tariffa di trasporto per container (che potrebbe includere una sanzione per la domanda inevasa). Deve rimuovere i costi di carico e scarico per container all'origine e alla destinazione.

maximumTransitDuration

object (Duration)

Durata massima di transito (se impostata, deve essere strettamente positiva). Il tempo di transito è definito dal momento in cui la prima nave che gestisce questa domanda lascia il porto di origine a quello in cui l'ultima imbarcazione che risponde alla domanda arriva al porto di destinazione.

VesselService

Servizio di imbarcazioni che può essere utilizzato per soddisfare le richieste di materie prime. IMPORTANTE: si presume attualmente che i servizi abbiano una frequenza settimanale e che i tempi di soggiorno delle porte non possano superare una settimana. Considera la seguente sequenza di tratti di servizio della nave: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" originDepartureTime { day: 4 } destinationArrivalTime { day: 7 hourOfDay: 12 } } Questi tratti definiscono una linea di servizio di una settimana che attraversa due porti e in entrambi i casi i tempi di sosta delle porte sono di 12 ore.

Rappresentazione JSON
{
  "vesselClassId": string,
  "vesselServiceLegs": [
    {
      object (VesselServiceLeg)
    }
  ]
}
Campi
vesselClassId

string

ID classe dell'imbarcazione che esegue il servizio.

vesselServiceLegs[]

object (VesselServiceLeg)

Per un servizio navale valido, valgono le seguenti proprietà: 1. Non può essere vuoto. 2. Gambe consecutive destinationPortId e originPortId devono corrispondere (inclusi per l'ultimo e il primo tratto).

VesselServiceLeg

Un singolo tratto di servizio navale.

Rappresentazione JSON
{
  "legCandidateId": string,
  "originDepartureTime": {
    object (ScheduleTime)
  },
  "destinationArrivalTime": {
    object (ScheduleTime)
  }
}
Campi
legCandidateId

string

ID candidato alla fase assegnata.

originDepartureTime

object (ScheduleTime)

Ora di partenza dal porto di origine nell'orario di partenza settimanale.

destinationArrivalTime

object (ScheduleTime)

Ora di arrivo alla porta di destinazione nell'orario settimanale.

ScheduleTime

Un orario di programmazione (partenza/domanda di partenza/arrivo dell'imbarcazione) viene definito con una frequenza settimanale di una determinata ora.

Rappresentazione JSON
{
  "day": string,
  "hourOfDay": integer
}
Campi
day

string (int64 format)

È una giornata specifica. Il giorno 0 è il primo giorno possibile.

hourOfDay

integer

L'ora del giorno dell'orario di pianificazione deve essere un numero intero compreso tra 0 e 23 inclusi.

CommodityDemandPath

I diversi servizi e porte assunti da una frazione della domanda di una determinata materie prime. Gli indici utilizzati di seguito si basano sull'ordine dei servizi navale nella risposta e sull'ordine dei tratti di servizio nei servizi delle singole imbarcazioni.

Rappresentazione JSON
{
  "commodityDemandId": string,
  "containerCount": string,
  "vesselServiceLegIds": [
    {
      object (VesselServiceLegId)
    }
  ]
}
Campi
commodityDemandId

string

ID domanda delle materie prime soddisfatto.

containerCount

string (int64 format)

Numero di container che percorrono questo percorso. Per ogni domanda di materie prime, la quantità totale soddisfatta non può superare la domanda totale.

vesselServiceLegIds[]

object (VesselServiceLegId)

Elenco di ID tratto di servizio dell'imbarcazione seguiti in questo percorso. Per un percorso di domanda delle materie prime valido, sono valide le seguenti proprietà: 1. Il valore departurePortId della prima tappa deve corrispondere al valore originPortId della domanda di materie prime. 2. Il valore destinationPortId dell'ultima tratta deve corrispondere al valore destinationPortId della domanda delle materie prime. 3. Gambe consecutive arrivePortId e departurePortId devono corrispondere. 4. Se fornito per la domanda di merci, il tempo di transito massimo deve essere superiore o uguale alla durata totale del percorso.

VesselServiceLegId

Ramo singolo di servizio imbarcazione utilizzato in un percorso di domanda delle materie prime. Ad esempio, supponiamo che ci siano due servizi navale. La prima è composta da tre gambe (indicizzati 0, 1 e 2) e le altre due (indicizzate 0 e 1). Inoltre, la prima tratta del primo servizio arriva al porto di partenza della seconda tratta del secondo servizio. Un percorso di merci costituito dai tre seguenti ID di tratti di servizio navale: {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceLegIndex: 1} significa che i container prendono 2 tronchi consecutivi dal primo tratto di servizio nave e

Rappresentazione JSON
{
  "vesselServiceIndex": integer,
  "vesselServiceLegIndex": integer
}
Campi
vesselServiceIndex

integer

Indice del servizio navale.

vesselServiceLegIndex

integer

Indice del tratto del servizio dell'imbarcazione indicizzato da vesselServiceIndex.