La tâche de la livraison des marchandises

image

Dans cet article, nous verrons comment Flexport utilise les mathématiques et la science des données pour résoudre les problèmes de livraison et livrer les marchandises à temps au coût le plus bas possible.

Prenons un scénario spéculatif: le transitaire a dix départs et un vol de destination pour tout envoi. La seule décision à prendre est de savoir si chaque envoi doit être affecté à ce vol unique. Si nous n'affectons pas de charge spécifique au vol, supposons qu'il soit possible de la déplacer d'une autre manière.

Chaque envoi a un volume et un coût, et le vol est limité en volume. Vous pouvez le considérer comme un problème de sac à dos simplifié. Donc, il y a 1024-1 = 1023 solutions possibles (nous n'enverrions pas l'avion complètement vide).

Nous pourrions créer une feuille de calcul pour répertorier la solution entière et choisir la plus rentable. Mais que se passe-t-il si vous avez les mêmes dix départs, mais deux vols? Il s'agit de 59 049 solutions en seulement 10 expéditions.

Un grand transitaire a plus de dix départs et, bien sûr, plus de deux vols au choix, ce qui conduit à des milliards à des milliards de solutions possibles. Parmi eux, seuls des millions sont réalisables, ce qui signifie que la méthode traditionnelle du tableur peut trouver au moins une solution réalisable. Mais nous n'avons pas seulement besoin de solutions réalisables. Nous avons besoin des meilleures solutions optimales. Comment les trouver parmi d'innombrables possibilités? Une réponse consiste à utiliser la programmation entière.

La programmation entière est une sous-section de l'optimisation discrète, un domaine d'étude des opérations liées à la minimisation de certaines fonctions objectives soumises à des contraintes. Nous voulons minimiser les coûts totaux, à condition que les marchandises soient livrées à temps aux bons endroits, empilées dans ULD (Unit Load Device - un moyen d'emballage des marchandises). Nous nous efforçons de trouver une solution optimale, mais en pratique, nous ne pouvons parfois pas y parvenir. Dans ce cas, nous sommes satisfaits d'une bonne ou proche solution. Ici, nous nous limitons à un modèle simple dans lequel la solution optimale est réalisable.

La première étape pour résoudre ce problème consiste à se tourner vers la littérature. La communauté scientifique s'occupe du transit de fret depuis de nombreuses années. Nous avons trouvé plusieurs œuvres qui rappellent très bien notre problème. Nous avons repris bon nombre des concepts et de la notation suivants de ces travaux et remercions les auteurs pour leur contribution à ce domaine.

Nous commençons par définir la fonction objectif. Pour minimiser les coûts, nous devons comprendre le concept de poids standard. En bref, le poids standard est le poids minimum avec lequel le transitaire accepte de travailler, quel que soit le poids réellement offert. Nous avons le poids total, le poids standard et les probabilités de surcharge et, inversement, de poids insuffisant. Le poids standard multiplié par le facteur de sous-pondération est une sous-estimation, nous pouvons donc ignorer la sous-pondération et nous concentrer sur le coefficient de surcharge multiplié par la surcharge elle-même.

La fonction objective est de minimiser le coût total, défini comme le poids total de tous les biens attribués par ULD, multiplié par le facteur de charge. Par exemple, si ULD1 a 100 kilogrammes de congestion et que le taux de congestion pour ULD1 est de 4 $ par kilogramme, alors le coût total de ULD 1 sera de 400 $. Donc, nous avons besoin d'une notation pour être en surpoids et pour sa valeur.

Laisser êtreyjE  est le poids de ULD j supérieur à la norme etcjE  - facteur de coût pour le même ULD. Nous devons calculeryjEcjE pour tousj . Sij1,2,3 , alors la fonction objectif seray1Ec1E+y2Ec2E+y3Ec3E . Il s'effondre pouryjEcjE . Nous voulons minimiser la valeur, donc notre objectif final:

minjyjEcjE


La valeur pour cjEpas une valeur calculée. Ce paramètre est obtenu à partir d'une feuille de calcul ou d'une base de données. MaisyjE nous avons défini comme le poids total de surcharge pour ULDj , que nous pouvons calculer comme le poids total de toutes les fournitures attribuées par ULD (notons-leyj ), moins le poids standard de cet ULD. Le poids standard est spécifique au type ULD et est également un paramètre. Laisser êtreUjP  est le poids standard pour ULDj en kilogrammes. Ensuite, le poids supplémentaire pour ULDj défini commeyjE=yjUjP .
Le poids total de l'ULD, bien sûr, dépend des poids attribués à l'ULD et de leur poids. Par conséquent, nous avons besoin d'une expression pour le calculer, y compris les détails mentionnés ci-dessus.

Il s'agit simplement de la somme des poids attribués par ULD. Comment indiquer qu'un lot de marchandises a été affecté à un ULD spécifique? Pour ce faire, nous n'avons pas besoin d'un paramètre, mais d'une variable de solution. Une variable de décision est quelque chose que le solveur peut contrôler tout en minimisant la fonction objectif.

Laissez le paramètregi représente le poids brut de la chargei en kilogrammes.
Par exemple,g4=500 signifie que la cargaison 4 pèse 500 kilogrammes.

Laisser êtrexi,j  est une variable de décision prenant la valeur 1, si expéditioni attribué ULDj et0 sinon. Ainsi, lorsque nous voulons compter toutes les expéditions attribuées par ULD 3, nous pouvons parcourir toutes les variablesxi,j , oùj=3 . Si nous avions 4 envois et que les numéros d'envoi 1 et 3 étaient attribués à ULD 3, cela ressemblerait à ceci:

x1,3+x2,3+x3,3+x4,3=1+0+1+0=2

Mais nous avons besoin du poids total, pas de la quantité. Pour l'obtenir, vous pouvez simplement multiplier chaque variable de solution par un paramètre de poids. Puisque la variable de décision prend la valeur 0, si aucun poids ne lui est attribué, ce poids est réinitialisé et n'est pas inclus dans le total. Supposons que les poids des cargaisons de un à quatre soient 10, 50, 25 et 5. Le poids total dans ULD 3 sera alors:

g1x1,3+g2x2,3+g3x3,3+g4x4,3=(10)(1)+(50)(0)+(25)(1)+(5)(0)=10+25=35


Écrivons ce calcul du poids total en général. Déterminer le poids total de l'ULDj comme yj. alorsy1=g1x1,1+g2x2,1++gixi,1, et y2=g1x1,2+g2x2,2++gixi,2. Nous pouvons réduire cela en utilisant la notation de sommationy1=gixi,1 et y2=gixi,2. Puisque nous voulons que cela soit vrai pour tous les possiblesj, nous utilisons le signe "pour tous": . Cela nous donne la forme finale de notre limite de poids total:

yj=iIgixi,jjJ



Poids supplémentaire


Maintenant que nous avons le poids total, nous pouvons appliquer notre formule pour la charge supplémentaire:

yjE=yjUjPjJ



Par exemple, si y1=1500et et U1P=1000puis poids supplémentaire y1E=15001000=500kilogrammes. Multipliez cela par le facteur de coût pour obtenir le résultat en dollars. À première vue, cela peut sembler suffisant, mais qu'en est-il du cas où le poids total de la cargaison entière pour ULD ne dépasse pas le poids standard? Dans ce cas, si nous utilisions la formule «en l'état», le poids de surcharge serait un nombre négatif. Par exemple, si le poids standard est de 1650 kilogrammes et que le poids total attribué est de 1000 kilogrammes, alors surcharge = 1000–1650 = -650. La fonction objectif multiplie ce nombre par un facteur de surcharge et nous obtenons un nombre négatif. Comme si le transporteur nous payait des frais de port inférieurs au coût d'un poids standard.

Voici ce que nous voulons vraiment:max(yjE,0).
C'est la même chose que de simplement mettre 0 pour une variable, ce qui est aussi simple que de créer une contrainteyjE>=0.

yjE>=yjUjPjJ, yjE>=0jJ

Nous avons donc implémenté la fonction max () dans la programmation mathématique: a = max (b, c), c'est-à-dire a> = b && a> = c. Regardons nos définitions.
Fonction objective:minjyjEcjE
cjE: Rapport de surcharge ULD j
yjE: Surcharge ULD j;

Source: https://habr.com/ru/post/undefined/


All Articles