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 ( |
Campi | |
---|---|
requestId |
ID problema o richiesta. |
solverParameters |
Parametri del risolutore. |
ports[] |
Elenco di possibili porte da chiamare nei servizi navale. La richiesta deve contenere solo gli ID delle porte presenti in questo elenco. |
legCandidates[] |
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[] |
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[] |
Elenco delle potenziali richieste di materie prime (ad es. container) che devono essere soddisfatte dai servizi navale. |
vesselServices[] |
È 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 ( |
Campi | |
---|---|
requestId |
L'ID della richiesta a cui è associata questa risposta. |
vesselServices[] |
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[] |
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 |
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 " |
Porta
Porta, ad es. un terminale o tutti i terminali di una porta.
Rappresentazione JSON |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Campi | |
---|---|
id |
ID univoco assegnato a questa porta. |
minimumPortStayDuration |
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 |
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 |
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 |
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 |
Durata
La durata (soggiorno/trasporto al porto, trasporto della domanda) viene definita con una granularità oraria.
Rappresentazione JSON |
---|
{ "hours": string } |
Campi | |
---|---|
hours |
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 |
Costo fisso per la chiamata di questa porta. |
hourlyCost |
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 ( |
Campi | |
---|---|
id |
ID univoco assegnato a questo candidato di una fase. |
departurePortId |
ID del porto di partenza. |
arrivalPortId |
ID della porta di arrivo. |
duration |
Durata della gamba. |
vesselClassCosts |
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 |
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 |
ID univoco assegnato a questa classe imbarcazione. |
containerCapacity |
Capacità della classe del recipiente (in container). |
vesselCount |
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 ( |
Campi | |
---|---|
id |
ID univoco assegnato a questa domanda di materie prime. |
originPortId |
ID della porta di origine. |
destinationPortId |
ID della porta di destinazione. |
containerCount |
Numero massimo di container da completare. |
freightRate |
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 |
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 ( |
Campi | |
---|---|
vesselClassId |
ID classe dell'imbarcazione che esegue il servizio. |
vesselServiceLegs[] |
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 ( |
Campi | |
---|---|
legCandidateId |
ID candidato alla fase assegnata. |
originDepartureTime |
Ora di partenza dal porto di origine nell'orario di partenza settimanale. |
destinationArrivalTime |
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 |
È una giornata specifica. Il giorno 0 è il primo giorno possibile. |
hourOfDay |
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 ( |
Campi | |
---|---|
commodityDemandId |
ID domanda delle materie prime soddisfatto. |
containerCount |
Numero di container che percorrono questo percorso. Per ogni domanda di materie prime, la quantità totale soddisfatta non può superare la domanda totale. |
vesselServiceLegIds[] |
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 |
Indice del servizio navale. |
vesselServiceLegIndex |
Indice del tratto del servizio dell'imbarcazione indicizzato da |