Risolve il problema LSNDSP (Liner shipping Network Design andScheduleing) per DesignShippingNetworkRequest
specificato.
L'LSNDSP è un complesso problema di ottimizzazione che cerca di trovare la progettazione e la pianificazione ottimali per una rete di spedizioni di linea. L'obiettivo è ridurre al minimo il costo totale di gestione della rete, soddisfacendo al contempo il maggior numero possibile di carichi di lavoro tra i porti.
L'LSNDSP può essere suddivisa in due principali sottoproblemi: progettazione e pianificazione della rete. Il sottoproblema di progettazione della rete determina l'insieme di porte servite dalla rete, il numero di navi impiegate su ciascuna rotta e le rotte che le navi seguiranno. Il sottoproblema di pianificazione determina gli orari di navigazione delle navi, tenendo conto del tempo necessario per navigare tra i porti, il tempo necessario per caricare e scaricare le merci e la domanda di trasporto merci tra i porti.
In parole semplici, l'LSNDSP si occupa di decidere quali porte servire, quante navi utilizzare e come pianificare le navi in modo che il costo di gestione della rete sia ridotto al minimo, massimizzando al contempo le entrate per soddisfare la domanda di merci. Un sottocomponente impegnativo dell'LSNDSP è il percorso delle merci, che determina quali richieste soddisfare e quali rotte 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 |
Problema o ID richiesta. |
solverParameters |
Parametri per il risolutore. |
ports[] |
Elenco di possibili porte da chiamare nei servizi navi. La richiesta deve contenere solo gli ID porta presenti in questo elenco. |
legCandidates[] |
Elenco di potenziali candidati gambe da aggiungere ai servizi imbarcazioni. La richiesta deve contenere solo gli ID candidati gamba presenti in questo elenco. |
vesselClasses[] |
Elenco di classi di imbarcazioni per fornire servizi di imbarcazioni. Tieni presente che tutte le navi della stessa classe sono completamente intercambiabili. La richiesta deve contenere solo gli ID classe nave presenti in questo elenco. |
commodityDemands[] |
Elenco delle richieste di potenziali materie prime (ad es. container) che i servizi navi devono soddisfare. |
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 all'istanza LSNDSP passata nella richiesta. Contiene una rete valida di servizi navali e percorsi di domanda delle materie prime. La domanda totale di materie prime per ogni tratto non può superare la capacità della classe di imbarcazioni che serve questo tratto. Tieni presente che non avere servizi navali 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 navali. Per ciascuna classe di imbarcazioni, il numero totale di imbarcazioni utilizzate non può superare il numero disponibile di imbarcazioni per questa classe. |
commodityDemandPaths[] |
Elenco di tutti i percorsi di domanda di materie prime attraverso cui viene distribuita la domanda di materie prime positiva. Tieni presente che alcuni ID domanda delle materie prime potrebbero non essere inclusi se non viene spedita alcuna domanda. In alternativa, la domanda di prodotti può essere parzialmente soddisfatta. Per ogni domanda di merci, la quantità totale soddisfatta non può superare la domanda totale. Infine, commodityDemandPaths dipende 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 deve dedicare al problema. Questo valore non è un limite fisso e non tiene conto del sovraccarico di comunicazione. La latenza prevista per risolvere il problema potrebbe superare leggermente questo valore. Una durata in secondi con un massimo di nove cifre frazionarie, che termina con " |
Porta
Porta, ad esempio 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 presuppone che sia costante, poiché i porti assegnano in genere più gru alle imbarcazioni più grandi con un numero di movimentazione elevato, poiché occupano più spazio. |
minimumTransshipmentDuration |
Durata minima di un trasbordo in un determinato porto, compresa la durata dello scarico di un container e del ricaricamento su un'altra nave. |
transshipmentCost |
Costo della transcodifica di un container. Di solito è inferiore alla somma delle operazioni di carico e scarico poiché la spedizione non richiede le pratiche doganali in porto. |
vesselClassCosts |
Costi sostenuti per le chiamate a questa porta mappati dall'ID classe nave. Una classe imbarcazione può chiamare questa porta solo se dispone di una voce in questa mappa. Un oggetto contenente un elenco di |
Durata
Una durata (soggiorno/trasporto, domanda di transito) è definita con granularità oraria.
Rappresentazione JSON |
---|
{ "hours": string } |
Campi | |
---|---|
hours |
Numero di ore che definiscono la durata. |
VesselCost
Il costo della nave per fare chiamate 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 delle chiamate a questa porta. |
hourlyCost |
Costo orario per soggiornare in questo porto. |
LegCandidate
Candidato tratto di servizio nave. Possono esserci diversi tratti di percorso tra le stesse due porte, ad esempio per rappresentare diverse rotte oceaniche e/o velocità delle imbarcazioni.
Rappresentazione JSON |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Campi | |
---|---|
id |
ID univoco assegnato a questo candidato della gamba. |
departurePortId |
ID della porta di partenza. |
arrivalPortId |
ID della porta di arrivo. |
duration |
Durata della gamba. |
vesselClassCosts |
Costo per l'assegnazione di questo candidato della gamba a una determinata classe di imbarcazioni. Possono essere inclusi i costi di gestione delle imbarcazioni, i costi del bunker e il costo del noleggio. Una classe di imbarcazioni può salpare per questo candidato della tratta solo se dispone di una voce in questa mappa. Un oggetto contenente un elenco di |
VesselClass
Classe dei imbarcazioni, ovvero un gruppo di imbarcazioni che condividono le stesse proprietà. Non è possibile distinguere due imbarcazioni dalla stessa classe.
Rappresentazione JSON |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
Campi | |
---|---|
id |
ID univoco assegnato a questa classe imbarcazione. |
containerCapacity |
Capacità della classe della nave (in container). |
vesselCount |
Numero di imbarcazioni in questa classe. |
CommodityDemand
Domanda di materie prime, ovvero una potenziale domanda che un 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 dei prodotti. |
originPortId |
ID della porta di origine. |
destinationPortId |
ID della porta di destinazione. |
containerCount |
Numero massimo di container da soddisfare. |
freightRate |
Tariffa di trasporto per container (che potrebbe includere una penalità per la domanda non soddisfatta). Deve rimuovere il costo di caricamento e scarico per container all'origine e a destinazione. |
maximumTransitDuration |
Durata di transito massima (se impostata, deve essere strettamente positiva). Il tempo di transito è definito dal momento in cui la prima nave che soddisfa questa domanda lascia il porto di origine al momento in cui l'ultima nave che serve questa domanda arriva al porto di destinazione. |
VesselService
Servizio navale che può essere utilizzato per soddisfare la domanda delle materie prime. IMPORTANTE: attualmente si presume che i servizi abbiano una frequenza settimanale e che i tempi di soggiorno non possano superare una settimana. Prendi in considerazione la seguente sequenza di tratti di servizio delle imbarcazioni: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" originDepartureTime { day: 4 }destinationlTimeOf { day: ArrivalTimeOf andando a port.
Rappresentazione JSON |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Campi | |
---|---|
vesselClassId |
ID classe nave che esegue il servizio. |
vesselServiceLegs[] |
Per un servizio navale valido, valgono le seguenti proprietà: 1. Non può essere vuoto. 2. Il valore destinationPortId e originPortId di tratti consecutivi devono corrispondere (compresi l'ultimo e il primo elemento). |
VesselServiceLeg
Un'unica tratta di un servizio navale.
Rappresentazione JSON |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Campi | |
---|---|
legCandidateId |
ID candidato gamba assegnata. |
originDepartureTime |
L'orario di partenza al porto di origine secondo l'orario settimanale. |
destinationArrivalTime |
Ora di arrivo al porto di destinazione nell'orario settimanale. |
ScheduleTime
Un orario di arrivo (natante/partenza/arrivi della domanda) viene definito con una frequenza settimanale di una determinata ora.
Rappresentazione JSON |
---|
{ "day": string, "hourOfDay": integer } |
Campi | |
---|---|
day |
Il giorno in programma. Il giorno 0 è il primo giorno possibile. |
hourOfDay |
L'ora del giorno dell'ora pianificata deve essere un numero intero compreso tra 0 e 23 inclusi. |
CommodityDemandPath
I diversi servizi e porte utilizzati da una frazione di una determinata domanda di merci. Gli indici utilizzati di seguito si basano sull'ordine dei servizi imbarcazioni nella risposta e su quello dei rami di servizio nei singoli servizi imbarcazioni.
Rappresentazione JSON |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Campi | |
---|---|
commodityDemandId |
ID domanda delle merci soddisfatto. |
containerCount |
Numero di container che attraversano questo percorso. Per ogni domanda di merci, la quantità totale soddisfatta non può superare la domanda totale. |
vesselServiceLegIds[] |
Elenco degli ID parte del servizio navale seguiti da questo percorso. Per un percorso di domanda delle merci valido, valgono le seguenti proprietà: 1. Il valore destinationPortId della prima tappa deve corrispondere a originPortId della domanda delle merci. 2. Il valore destinationPortId dell'ultimo tratto deve corrispondere a destinationPortId della domanda delle merci. 3. revenuePortId e holidayPortId di tratti consecutivi devono corrispondere. 4. Se previsto per questa domanda di merci, il tempo di transito massimo deve essere maggiore o uguale alla durata totale del percorso. |
VesselServiceLegId
Tratto di servizio con imbarcazione singola utilizzato in un percorso di domanda delle merci. Ad esempio, considera che ci sono due servizi imbarcazioni. La prima è composta da tre zampe (valore indicizzato con 0, 1 e 2) e la seconda da due gambe (valore indicizzato 0 e 1). Inoltre, la prima tratta del primo servizio arriva al porto di partenza della seconda tratta del secondo servizio. Un percorso delle merci composto dai tre seguenti ID tratto di servizio navale: {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceIndex: 1, vesselServiceLegIndex: 1} indica che i container prendono un servizio di prima linea consecutiva
Rappresentazione JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
Campi | |
---|---|
vesselServiceIndex |
Indice del servizio navale. |
vesselServiceLegIndex |
Indice del tratto del servizio navale indicizzato da |