Résoudre le problème de conception et de planification du réseau de livraison par ligne (LSNDSP) à partir du DesignShippingNetworkRequest
donné.
Le LSNDSP est un problème d'optimisation complexe qui vise à optimiser la conception et la planification d'un réseau de livraison par ligne. L'objectif est de minimiser le coût total d'exploitation du réseau, tout en répondant au maximum de la demande de cargaisons entre les ports.
Le LSNDSP peut être décomposé en deux principaux sous-problèmes: la conception du réseau et la planification. Le sous-problème de conception d'un réseau détermine l'ensemble des ports devant être desservis par le réseau, le nombre de navires à déployer sur chaque route et les routes que les navires emprunteront. Le sous-problème de planification détermine les horaires de navigation des navires, en tenant compte du temps nécessaire pour naviguer entre les ports, du temps nécessaire pour charger et décharger les cargaisons, et de la demande de transport de marchandises entre les ports.
En d'autres termes, le LSNDSP consiste à décider quels ports desservir, combien de navires utiliser et comment planifier les navires pour réduire au maximum les coûts d'exploitation du réseau tout en maximisant les revenus liés à la demande de cargaisons. L'acheminement des marchandises est un sous-composant complexe du LSNDSP, qui détermine les demandes à satisfaire et les itinéraires à attribuer au fret afin de maximiser les revenus.
Requête HTTP
POST https://optimization.googleapis.com/v1/shipping:designShippingNetwork
L'URL utilise la syntaxe de transcodage gRPC.
Corps de la requête
Le corps de la requête contient des données présentant la structure suivante :
Représentation JSON |
---|
{ "requestId": string, "solverParameters": { object ( |
Champs | |
---|---|
requestId |
Problème ou identifiant de la demande. |
solverParameters |
Paramètres du résolveur. |
ports[] |
Liste des ports possibles à appeler dans les services de navire. La requête ne doit contenir que les ID de port figurant dans cette liste. |
legCandidates[] |
Liste des étapes potentielles à ajouter aux services des navires. La requête ne doit contenir que les ID des étapes candidates figurant dans cette liste. |
vesselClasses[] |
Liste des classes de navires pour effectuer des services de navires. Notez que tous les navires d'une même classe sont complètement interchangeables. La requête ne doit contenir que les ID de classe de navire figurant dans cette liste. |
commodityDemands[] |
Liste des demandes potentielles de produits (c'est-à-dire de conteneurs) que les services des navires doivent remplir. |
vesselServices[] |
Vous pouvez fournir un réseau de services de navires valides (généralement l'état actuel du réseau) pour commencer l'optimisation. |
Corps de la réponse
La réponse contient la solution à l'instance LSNDSP transmise dans la requête. Elle contient un réseau valide de services de navires et de chemins de la demande de marchandises. La demande totale de produits par tronçon ne peut pas dépasser la capacité de la classe des navires desservant cette section. Notez qu'aucun service de navire ne répondant à la demande est toujours une solution envisageable au problème de conception et de planification d'un réseau de livraison par ligne.
Si la requête aboutit, le corps de la réponse contient des données qui ont la structure suivante :
Représentation JSON |
---|
{ "requestId": string, "vesselServices": [ { object ( |
Champs | |
---|---|
requestId |
ID de la requête à laquelle cette réponse est associée. |
vesselServices[] |
Réseau de services de navires. Pour chaque classe de navire, le nombre total de navires utilisés ne peut pas dépasser le nombre de navires disponible pour cette classe. |
commodityDemandPaths[] |
Liste de tous les parcours par lesquels une demande positive de produits de base est acheminée. Notez que certains identifiants de demande de produits peuvent ne pas être inclus si aucune demande n'est expédiée. Par ailleurs, une demande de produits de base peut être partiellement satisfaite. Pour chaque demande de produits de base, la quantité totale satisfaite ne peut pas dépasser la demande totale. Enfin, commodityDemandPaths dépend de vesselServices (voir la définition de CommodityDemandPath). |
SolverParameters
Paramètres contrôlant une seule résolution du LSNDSP.
Représentation JSON |
---|
{ "timeLimit": string } |
Champs | |
---|---|
timeLimit |
Temps maximal que le résolveur doit consacrer au problème. Cette valeur n'est pas une limite stricte et ne tient pas compte des frais de communication. La latence attendue pour résoudre le problème peut dépasser légèrement cette valeur. Durée en secondes avec neuf chiffres au maximum après la virgule et se terminant par " |
Port
Port (ex. : un terminal ou tous les terminaux d'un port.
Représentation JSON |
---|
{ "id": string, "minimumPortStayDuration": { object ( |
Champs | |
---|---|
id |
ID unique attribué à ce port. |
minimumPortStayDuration |
Durée minimale du séjour pour un appel de port. La plupart des études supposent une constante, car les ports assignent généralement plus de grues aux grands navires avec un grand nombre de mouvements, car ils occupent plus d'espace. |
minimumTransshipmentDuration |
Durée minimale d'un transbordement sur un port donné, y compris la durée nécessaire pour décharger un conteneur et le recharger sur un autre navire. |
transshipmentCost |
Coût du transbordement d'un conteneur. Il est généralement inférieur à la somme des frais de chargement et de déchargement, car le transport ne nécessite pas de formalités douanières au port. |
vesselClassCosts |
Frais encourus lors de l'appel de ce port associé à l'identifiant de classe du navire. Une classe de navire ne peut appeler ce port que si elle possède une entrée sur cette carte. Objet contenant une liste de paires |
Durée
Une durée (séjour/transport, transit à la demande) est définie selon une précision horaire.
Représentation JSON |
---|
{ "hours": string } |
Champs | |
---|---|
hours |
Nombre d'heures définissant la durée. |
VesselCost
Le coût d'appel et de séjour à ce port est une fonction linéaire de la durée du séjour (fixedCost
+ hourlyCost
* heures).
Représentation JSON |
---|
{ "fixedCost": number, "hourlyCost": number } |
Champs | |
---|---|
fixedCost |
Frais fixes d'appel de ce port. |
hourlyCost |
Coût horaire du séjour dans ce port. |
LegCandidate
Candidat à une étape en service de navire. Il peut y avoir plusieurs étapes candidates entre les deux mêmes ports, par exemple représentant différentes routes océaniques et/ou vitesses des navires.
Représentation JSON |
---|
{
"id": string,
"departurePortId": string,
"arrivalPortId": string,
"duration": {
object ( |
Champs | |
---|---|
id |
ID unique attribué à ce candidat pour l'étape. |
departurePortId |
ID du port de départ. |
arrivalPortId |
Identifiant du port d'arrivée. |
duration |
Durée de la section. |
vesselClassCosts |
Coût lié à l'attribution de cette section candidate à une certaine classe de navire. Il peut s'agir du coût d'exploitation du navire, du coût des bunkers et du coût d'affrètement. Une classe de navire ne peut traverser cette section candidate que si elle possède une entrée sur cette carte. Objet contenant une liste de paires |
VesselClass
Classe de navire, c'est-à-dire un groupe de navires partageant les mêmes propriétés. Il n'existe aucun moyen de différencier deux navires d'une même classe.
Représentation JSON |
---|
{ "id": string, "containerCapacity": string, "vesselCount": string } |
Champs | |
---|---|
id |
Identifiant unique attribué à la classe de ce bateau. |
containerCapacity |
Capacité par classe de bateau (en conteneurs). |
vesselCount |
Nombre de navires dans cette classe. |
CommodityDemand
Demande de produits, c'est-à-dire une demande potentielle à satisfaire par un transporteur.
Représentation JSON |
---|
{
"id": string,
"originPortId": string,
"destinationPortId": string,
"containerCount": string,
"freightRate": number,
"maximumTransitDuration": {
object ( |
Champs | |
---|---|
id |
Identifiant unique attribué à cette demande de produits. |
originPortId |
ID du port d'origine. |
destinationPortId |
ID du port de destination. |
containerCount |
Nombre maximal de conteneurs à remplir. |
freightRate |
Taux de fret par conteneur (pouvant inclure une pénalité pour la demande non satisfaite). Cela devrait supprimer les coûts de chargement et de déchargement de chaque conteneur au niveau du point de départ et de la destination. |
maximumTransitDuration |
Durée maximale des transports en commun (si elle est définie, elle doit être strictement positive). Le délai d'acheminement est défini entre le moment où le premier navire desservant cette demande quitte le port d'origine et le moment où le dernier navire desservant cette demande arrive au port de destination. |
VesselService
Service de navire pouvant être utilisé pour répondre à la demande de produits de base. IMPORTANT: Actuellement, les services sont basés sur une fréquence hebdomadaire et la durée de séjour des ports ne peut pas dépasser une semaine. Prenons l'exemple de la séquence suivante de sections de service des navires: vesselServiceLegs { legCandidateId: "0->1" originDepartureTime {} destinationArrivalTime { day: 3 hourOfDay: 12 } } vesselServiceLegs { legCandidateId: "1->0" originDepartureTime { day: 4 } destinationArrivalTime { day: 7 hourOfDay: 12 } } Ces sections définissent une ligne de service d'une semaine passant par deux ports, chacun avec une durée de séjour de 12 heures.
Représentation JSON |
---|
{
"vesselClassId": string,
"vesselServiceLegs": [
{
object ( |
Champs | |
---|---|
vesselClassId |
ID de la classe du bateau effectuant le service. |
vesselServiceLegs[] |
Pour un service de navire valide, les propriétés suivantes sont réservées: 1. Ce champ est obligatoire. 2. jambes consécutives destinationPortId et originPortId doivent correspondre (y compris pour la dernière et la première section). |
VesselServiceLeg
Une seule section d'un service de navire.
Représentation JSON |
---|
{ "legCandidateId": string, "originDepartureTime": { object ( |
Champs | |
---|---|
legCandidateId |
ID du candidat pour la section attribuée. |
originDepartureTime |
Heure de départ au port d'origine selon les horaires hebdomadaires. |
destinationArrivalTime |
Heure d'arrivée au port de destination selon les horaires hebdomadaires. |
ScheduleTime
Les horaires (départ/arrivée à la demande du bateau) sont définis sur une fréquence hebdomadaire à une heure donnée.
Représentation JSON |
---|
{ "day": string, "hourOfDay": integer } |
Champs | |
---|---|
day |
Une journée au programme. Le jour 0 est le premier jour possible. |
hourOfDay |
L'heure de planification doit être un nombre entier compris entre 0 et 23 inclus. |
CommodityDemandPath
Les différents services et ports utilisés par une fraction d'une demande de marchandises donnée. Les indices utilisés ci-dessous sont basés sur l'ordre des services des navires dans la réponse et l'ordre des sections de service dans chaque service de navire.
Représentation JSON |
---|
{
"commodityDemandId": string,
"containerCount": string,
"vesselServiceLegIds": [
{
object ( |
Champs | |
---|---|
commodityDemandId |
L'identifiant de la demande de produits a été rempli. |
containerCount |
Nombre de conteneurs empruntant ce chemin. Pour chaque demande de produits de base, la quantité totale satisfaite ne peut pas dépasser la demande totale. |
vesselServiceLegIds[] |
Liste des ID de section du service de navire empruntés par ce chemin d'accès. Pour un chemin de demande de marchandises valide, les propriétés suivantes contiennent: 1. L'élément departurePortId de la première section doit correspondre à l'élément originPortId de la demande de produits et services. 2. L'identifiant destinationPortId de la dernière section doit correspondre à l'identifiant destinationPortId de la demande de produits. 3. jambes consécutives arrivalPortId et departurePortId doivent correspondre. 4. S'il est fourni pour cette demande de produits, le délai d'acheminement maximal doit être supérieur ou égal à la durée totale du chemin. |
VesselServiceLegId
Section de service de navire unique utilisée dans le parcours de demande de marchandises. Imaginons, par exemple, qu'il existe deux services de navires. La première est composée de trois parties (indexées 0, 1 et 2) et les deux autres (indexées 0 et 1). En outre, la première section du premier service arrive au port de départ de la seconde section du second service. Chemin d'accès standard composé des trois ID de tronçon de service des navires suivants : {vesselServiceIndex: 0, vesselServiceLegIndex: 2} {vesselServiceIndex: 0, vesselServiceLegIndex: 0} {vesselServiceLegIndex: 1, vesselServiceLegIndex: 1} signifie que les conteneurs prennent deux sections consécutives pour chaque vesselServiceLegIndex: 2, car il s'agit de deux sections consécutives de chaque vesselServiceLegIndex: 2
Représentation JSON |
---|
{ "vesselServiceIndex": integer, "vesselServiceLegIndex": integer } |
Champs | |
---|---|
vesselServiceIndex |
Index du service de navire. |
vesselServiceLegIndex |
Index de la section du service du navire indexée par |