Problmedetransport

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 28

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/336371097

Problème de Transport

Article · October 2019

CITATIONS READS

0 12,015

1 author:

Abdelkader Benaissat
Hassania School of Public Works
3 PUBLICATIONS 0 CITATIONS

SEE PROFILE

All content following this page was uploaded by Abdelkader Benaissat on 09 October 2019.

The user has requested enhancement of the downloaded file.


Abdelkader BENAISSAT

Problème de Transport
Résumé
Beaucoup de sujets de recherche mathématique très actifs actuelle-
ment traitent les concepts d’optimisation et transport, surtout le problème de
transport et ses applications dans l’ingénierie et l’économie. Le problème de
transport est une notion située un peu dans la frontière entre la recherche opé-
rationnelle et la programmation algorithmique. Ces deux disciplines utilisent
beaucoup de définitions et théorèmes -plus ou moins avancés- de mathéma-
tiques. Progressivement, on ira du général au local, et on verra comment
modéliser et résoudre le problème de transport.

Mots clés : Transport, Programmation linéaire, optimisation, moindres


coûts, Algorithme du simplexe.

Abstract
Many mathematical and informatics research topics nowadays include
the concepts of optimization and transport, especially the transport problem
and its applications in engineering and economics. The transport problem is a
notion situated between operational research in mathematics and algorithmic
computer programming. They use many definitions and theorems - more or
less advanced - of general algebra, among which, we will go from the general
to the specific, and see how to model and solve the transportation problem
using each of those theorems and definitions.

Keywords : Transport, Linear programming, optimization, lower costs,


Simplex algorithm.
TABLE DES MATIÈRES Problème de transport

Table des matières


1 Introduction générale 4

2 Notions de base 4
2.1 Forme générale d’un programme linéaire . . . . . . . . . . . . 4
2.2 La méthode de simplexe . . . . . . . . . . . . . . . . . . . . . 6
2.2.1 Solution de base réalisable . . . . . . . . . . . . . . . . 7
2.2.2 La méthode du simplexe . . . . . . . . . . . . . . . . . 7

3 Problème de transport 10
3.1 Présentation et modélisation . . . . . . . . . . . . . . . . . . . 11
3.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

4 Résolution de problème de transport 13


4.1 Représentation générale de la méthode . . . . . . . . . . . . . 13
4.2 Résolution du problème de transport . . . . . . . . . . . . . . 14
4.2.1 Détermination su solution de base réalisable . . . . . . 14
4.2.2 Test d’optimalité et amélioration de solution . . . . . . 15
4.3 Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

5 Conclusion 19

6 Annexe 20
6.1 Code source du simplexe en Python . . . . . . . . . . . . . . 20
6.2 Résultat du script . . . . . . . . . . . . . . . . . . . . . . . . . 25

Bibliographie 27

3/27
Problème de transport

1 Introduction générale
Le problème de transport est l’un des sujets les plus importants de la
recherche opérationnelle, spécialement en terme de fréquence relative où il
apparaît dans les applications - la plupart concernant des domaines civils -
et aussi dans la simplicité de la procédure développée pour le résoudre.

Le problème de transport fait partie du cur de notre thème "transport",


c’est un sujet qui consiste à étudier les méthodes pour optimaliser le transport
des produits entre des sources et leurs destinations afin de maximiser les
bénéfices et minimiser les dommages.

2 Notions de base
2.1 Forme générale d’un programme linéaire
Définitions :

programme linéaire : Un programme linéaire est un problème d’op-


timisation qui consiste à maximiser ou minimiser une fonction objectif de
n variables de décision soumis à un ensemble de contraintes exprimées sous
forme d’équations ou d’inégalités linéaires.

programmation linéaire : La programmation linéaire est une tech-


nique mathématique permettant de résoudre des problèmes de gestion, à
savoir maximiser les bénéfices ou minimisation des couts. Son approche est
divisée en deux étapes :
1 - Modélisation des problèmes :
· Identification des variables du modèle : Variables de décision.
· Identification des contraintes à respecter : Variables de décision.
· Identification de la fonction objectif à optimiser.
2 - Résolution du problème à l’aide de technique propre à la program-
mation linéaire.

Exemple : Une usine fabrique deux produits P1 et P2 en utilisant un cer-


tain nombre de ressources, équipements, mains-d’uvre, matière première. Ces
besoins sont indiqués dans le tableau ci-dessous. Par ailleurs chaque ressource
est disponible en qualité limite :

4/27
2.1 Forme générale d’un programme linéaire Problème de transport

P1 P2 Disponibilité
Équipement 3 6 60
Mains-d’oeuvre 4 3 45
Matière première 3 1 30

Les deux produits P1 et P2 rapportent à la vente respectivement des


bénéfices de 50DH et 30DH par unité.
Quelles quantités de produit P1 et P2 doit produire l’usine afin de
maximiser le bénéfice total ?

Modélisation de problème :

les variables de décisions : x1 et x2 sont respectivement la quantité


de produits P1 et P2 fabriqués, (x1 , x3 ) ∈ R.

Contraintes : 

 3x1 + 6x2 6 60

4x1 + 3x2 6 45

 3x1 + x2 6 30

x1 , x 2 > 0

Fonction objectif à minimiser : maxZ = 50x1 + 30x2



 3x1 + 6x2 6 60

4x1 + 3x2 6 45
Sujet à

 3x1 + x2 6 30

x1 , x 2 > 0

Formes générales d’un programme linéaire :

1 - Forme canonique mixte : Un problème de programmation linéaire


s’écrit sous la forme :

n
maxZ = cj x j
j=1

Contraintes d’inégalité :

n
∀i ∈ I1 , aij xj 6 bi
j=1

5/27
2.2 La méthode de simplexe Problème de transport

Contraintes d’égalité :

n
∀i ∈ I2 , aij xj = bi
j=1

Contraintes de signe :

∀j ∈ J1 , xj > 0

Variables libres :

∀j ∈ J2 , xj ∈ R

Avec l’ensemble I = I1 ∪ I2 est l’ensemble des indices de contraintes avec


card(I) = m , autrement dit il y a m contraintes. Et l’ensemble J = J1 ∪ J2
est l’ensemble des variables avec card(J) = n, autrement dit il y a n variables.

2 - Forme canonique pure : un programme linéaire est sous forme


canonique lorsque toutes ces contraintes sont des inégalités et toutes ses
variables sont positives, sous cette forme il n’y a pas de contrainte d’égalité
I2 = ∅ ni de variables libres J2 = ∅. On note :

x = (x1 , ..., xn )t ∈ Rn , c = (c1 , ..., cn )t ∈ Rn , b = (b1 , ..., bn )t ∈ Rn .


 
a11 . a1n
 . . 
Et la matrice : A =   .
 de taille m × n
. 
am1 . amn
un programme linéaire est dit sous forme matricielle s’il s’écrit :
{
t Ax 6 b
maxZ = c x, sujet à
x>0

2.2 La méthode de simplexe


Définition : L’algorithme du simplexe a été introduit par George Dant-
zig à partir de 1946. C’est un algorithme de résolution des problèmes d’op-
timisation linéaire. Il comporte deux phases, d’abord trouver une solution
de base réalisable (ou bien détecter l’impossibilité), ensuite on passe d’un
sommet à un sommet voisin pour augmenter la fonction objectif.

6/27
2.2 La méthode de simplexe Problème de transport

2.2.1 Solution de base réalisable


On suppose que la matrice A est de taille m × n avec rg(A) = m 6 n.
L’hypothèse de plein rang n’est pas restrictive car si rg(A) 6 m, le système
Ax = b n’a pas de solution (ou une infinité de solution) en général. Si rg(A) <
m et b ∈ Im(A) , on aura des équations redondantes dans Ax = b, qu’on
pour exprimer pour obtenir un nouveau système de plein rang. Si m = n et
rg(A) = m alors la solution est unique.

Définition : Soit B ⊂ {1, ..., n} un ensemble d’indices avec Card(B) = m


tel que {Aj , j ∈ B} sont libres, autrement dit AB est une matrice carrée
formée par les colonnes {Aj , j ∈ B} est inversible. On dit que B est une
base.
- Les variables xB = (xj , j ∈ B) sont appelées variables de base.
- Les variables xH = (xj , j ̸= B) sont appelées variables hors base.

2.2.2 La méthode du simplexe


Étape 1 :
- Calcul des variables de base réalisable : Étant donné A = (AB , AH ),
on calcul xB = (AB )−1 b > 0 xB est une solution de base réalisable.
- Calcul des coûts réduits : πHt t
= CH − CBt (AB )−1 AH
- Si πH 6 0 alors xB est optimale (l’algorithme s’arrête).
- Sinon, aller à L’étape 2.

Étape 2 :
- Variable d’entrée : e = arg maxj {(πH )j , (πH )j > 0}
(xB )i
- Variable de sortie : s = arg min{ , zie > 0} et zie = (AB )−1 Ae
i zie

Étape 3 : On obtient une nouvelle base B ∗ et une nouvelle matrice


AB ∗ dans laquelle la colonne Ae remplace la colonne As . On calcule (AB ∗ )−1
et on retourne à l’étape 1.

7/27
2.2 La méthode de simplexe Problème de transport

Schéma graphique résumant la méthode du simplexe

Exemple : maxZ = 50x1 + 30x2




 3x1 + 6x2 6 60

4x1 + 3x2 6 45
Sujet à

 3x1 + x2 6 30

x1 , x 2 > 0

La fonction de transport : maxZ = 50x1 + 30x2




 3x1 + 6x2 + x3 = 60

4x1 + 3x2 + x4 = 45

 3x1 + x2 + x5 = 30

x1 , x 2 , x 3 , x 4 , x 5 > 0

Tableau initial T0 :

8/27
2.2 La méthode de simplexe Problème de transport

q VB x1 x2 x3 x4 x5 b
60/3 x3 3 6 1 0 0 60
45/4 x4 4 3 0 1 0 45
VS 30/3 x5 3 1 0 0 1 30
−Z 50 30 0 0 0 0
VE
On a :   
1 0 0 3 6
AB = 0 1 0 Donc (AB )−1 = AB ; AH = 4 3 ; VE : x1 , VS : x5 .
0 0 1 3 1

Tableau T1 :
q VB x1 x2 x3 x4 x5 b
6 x3 0 5 1 0 -1 30
3 x4 0 5/3 0 1 -4/3 5
30 x1 1 1/3 0 0 1/3 10
−Z 0 40/3 0 0 -50/3 -500

Donc B =(x3 , x4 , x1 ), H = (x2 , x5 ), VE : x2 ; VS : x4


30 ( )
0
Et xB =  5 , xH = , Z = 500
0
10    
5 6
On a : (AB )−1 A2 = 5/3, A2 = 3
1/3 1

Tableau T2 :
VB x1 x2 x3 x4 x5 b
x3 0 0 1 -3 3 15
x2 0 1 0 3/5 -4/5 3
x1 1 0 0 -1/5 9/15 9
−Z 0 0 0 -8 -6 -540
- La solution est optimale car tous les coûts sont négatifs ( (πH )j 6 0).
- La solution optimale est x∗ = (9, 5), Z ∗ = 540.
- La solution optimale de base réalisable est (9, 3, 15, 0, 0).
- La matrice de base optimale est donné par (base optimale dans le
tableau initial) :

9/27
Problème de transport

 
1 6 3
AB ∗ = 0 3 4
0 1 3
- L’inverse de la matrice de base optimale est donné par (base initiale
lue dans le tableau optimal).  
1 −3 3
(AB ∗ )−1 = 0 3/5 −4/5
0 −1/5 3/5

NB : L’algorithme simplexe est l’algorithme le plus utilisé pour la pro-


grammation linéaire, du coup les chercheurs en recherche opérationnelle et en
algorithmique ont modélisé cette méthode en différentes langues de program-
mation, on donne en Annexe un exemple de code source de cette méthode
écrite en python.

3 Problème de transport
Exemple introductif : Une entreprise fabrique un certain médicament
dans trois laboratoires L1 , L2 , L3 , ce médicament est ensuite expédié a des
centres de distribution C1 , C2 , C3 , C4 , C5 , chaque laboratoire Li dispose d’une
quantité ai , et chaque centre requiert une demande de quantité bj . Le coût
unitaire de transport de chaque laboratoire Li a chaque centre Cj est noté
cij . L’objectif est d’acheminer à coût minimal ce médicament des trois labo-
ratoires aux cinq centres.

Les tableaux ci-dessous donnent les quantités ai disponibles en chaque


laboratoire (Li ), i ∈ {1, 2, 3} de même que les demandes bj requises en chaque
centre cj avec j ∈ {1, 2, 3, 4, 5} :
Le tableau des quantités :

Laboratoire L1 L2 L3
Quantité ai 240 160 260

Le tableau des Demandes :

Centres C1 C2 C3 C4 C5
Demandes Ci 120 130 145 125 140

Le troisième tableau donne les coûts unitaires de transport cij de chaque


laboratoire Li à chaque centre Cj :

10/27
3.1 Présentation et modélisation Problème de transport

C1 C2 C3 C4 C5
L1 1 8 1 5 4
L2 5 5 3 6 7
L3 2 9 5 9 8

3.1 Présentation et modélisation


Représentation par réseau :

Définition : Ce sont les méthodes pour déterminer la quantité d’un produit


P qui doit être transportée de m sources vers n destinations.

Objectif : Déterminer les quantités xij envoyées de chaque source i ∈ I


avec I = {1, ..., m} à chaque destination j ∈ J avec J = {1, ..., n}, en
minimisant le cout total de transport.

Contraintes :
— offre limitée au niveau des coûts.
— obligation à satisfaire les demandes de destination.

11/27
3.2 Exemple Problème de transport

Modélisation : Le problème de transport se modélise comme suit :


∑∑
minZ = cij xij
i∈I j∈J

 n
 ∑

 xij 6 ai , ∀i ∈ I

 j=1
sous contraints : ∑m

 xij > bj , ∀j ∈ J


 i=1
xij > 0, ∀(i, j) ∈ I × J

Remarque : Le problème de transport n’a pas de solution que si la dispo-


nibilité totale est supérieure ou égale à la demande totale.

m ∑
n
ai > bj
i=1 j=1

S’il y a égalité entre l’offre et la demande on dit que le problème est


équilibré.

m ∑
n
ai = bj
i=1 j=1

Si le problème n’est pas équilibré, on doit créer une distribution fictive


avec comme demande l’excédant de l’offre par rapport à la demande. Les
coûts de transport pour cette distribution sont évidement nuls.

3.2 Exemple
On considère le même exemple de l’introduction, on a :


3 ∑
5
minZ = cij xij
i=1 j=1



 ∑5

 xij 6 ai , ∀i ∈ I = {1, 2, 3}

 j=1
sous contraints : ∑3

 xij > bj , ∀j ∈ J = {1, 2, 3, 4, 5}




i=1
xij > 0, ∀(i, j) ∈ I × J

12/27
Problème de transport

4 Résolution de problème de transport


4.1 Représentation générale de la méthode
N.B : On peut utiliser la méthode du simplexe pour résoudre le problème
de transport, pourtant on s’intéresse à d’autres méthodes, tout simplement
parce que l’application du simplexe pour résoudre un Problème de transport
est très pénible car on doit à chaque fois utiliser des tableaux (ou matrices)
plus ou moins grands ; dans notre exemple on doit utiliser un tableau de plus
que 15 colonnes et 8 lignes ce qui est un peu difficile à manipuler.
L’algorithme utilisé pour résoudre le problème de transport est basé sur
l’algorithme du simplexe en tenant compte de la structure du problème :
— Déterminer une SBR.
— Déterminer les variables d’entrée et de sortie
L’algorithme de transport cherche à construire itérativement le coût des SBRs
dont les coûts sont de plus en plus faible.
Après un certain nombre d’itérations, il atteint une solution optimale
SBRO. Chaque solution est construite à partir de la précédente en modifiant
la quantité affiché dans une case et en procédent aux ajustement requis pour
conserver la réalisabilité (admissibilité) de la solution d’où la nécessité d’avoir
une SBR initiale. Les coûts relatifs à la résolution du problème de transport
lorsqu’il est fait à la main, sont effectués dans des tableaux de transport
(regarder l’exemple).

Remarque : le coût total Z associé à une SBR s’obtient comme le produit


scalaire des coûts unitaires cij et des quantités expédiées xij
Le tableau de transport comporte :
— Une ligne pour chaque laboratoire.
— Une colonne pour chaque centre.
— Deux rangées marginales (offre et demandes)
— Le coût unitaire aij reporté au coin supérieur droit d la case (i,j).
Le tableau de transport :

C1 C2 C3 C4 C5 Offre
L1 ⟨1 ⟨8 ⟨1 ⟨5 ⟨4 240
L2 ⟨5 ⟨5 ⟨3 ⟨6 ⟨7 160
L3 ⟨2 ⟨9 ⟨5 ⟨9 ⟨8 260
Demande 120 130 145 125 140 660

13/27
4.2 Résolution du problème de transport Problème de transport

4.2 Résolution du problème de transport


4.2.1 Détermination su solution de base réalisable
Méthode du coin nord-ouest CNO : Considérer la cellule située dans
le coin le plus haut à gauche.

Étape 1 : Affecter à la cellule courante la quantité de produit maximale


possible. Puis on ajuste l’offre et la demande.

Étape 2 : Se déplacer d’une cellule vers la droit si l’offre n’est pas épui-
sée. Se déplacer d’une cellule vers le base si la demande n’est pas satisfaite.

Étape 3 : Rejeter jusqu’au moment toute l’offre est allouée.

Le tableau de transport :

C1 C2 C3 C4 C5 Offre
L1 120 ⟨1 120 ⟨8 — ⟨1 — ⟨5 — ⟨4 240
L2 — ⟨5 10 ⟨5 145 ⟨3 5 ⟨6 — ⟨7 160
L3 — ⟨2 — ⟨9 — ⟨5 120 ⟨9 140 ⟨8 260
Demande 120 130 145 125 140 660

Le coût total Z associé à cette SBR :

Zc = (1 × 120) + (8 × 120) + (3 × 145) + (6 × 5) + (9 × 120) + (8 × 140)

Donc Zc = 3795DH

Méthode des moindres coûts On se situe dans la cellule de coût mini-


mal.

Étape 1 : affecter à la cellule courante la quantité maximale possible


puis on ajoute l’offre et la demande.

Étape 2 : Sélectionner la cellule de coût minimale ayant une demande


et une offre non nulle.
Le tableau de transport :

14/27
4.2 Résolution du problème de transport Problème de transport

C1 C2 C3 C4 C5 Offre
L1 120 ⟨1 — ⟨8 120 ⟨1 — ⟨5 — ⟨4 240
L2 — ⟨5 130 ⟨5 25 ⟨3 5 ⟨6 — ⟨7 160
L3 — ⟨2 — ⟨9 — ⟨5 120 ⟨9 140 ⟨8 260
Demande 120 130 145 125 140 660

Le tableau donne une SBR initiale : x11 = 120, x13 = 120, x22 = 130,
x23 = 25, x24 = 5, x34 = 120, x35 = 140.
Le coût total
Zm = (1×120)+(1×120)+(5×130)+(3×25)+(6×5)+(9×120)+(8×140)
Donc Zm = 3195DH

4.2.2 Test d’optimalité et amélioration de solution


on associe à chaque ligne i et chaque colonne j des multiplicateurs Ui et
Vj .

Étape 1 : on détermine pour les variables de base, les multiplicateurs


Ui et Vj tels que
cij − Ui − Vj = 0
Pour résoudre ce système, il suffit de fixer la valeur d’une variable pour
déduire les autres.

Étape 2 : calculer pour les variables hors base, les coûts relatifs :
cij − Ui − Vj = Fij

Étape 3 : Test d’optimalité :


— La solution courante est optimale si et seulement si ∀(i, j)Fij > 0.
— S’il existe (i, j) tel que Fij < 0 alors la solution courante n’est pas
optimale, et on applique la quatrième étape.

Étape 4 : Amélioration de la solution :


— Variables d’entrée : on calcule la quantité Fsr = min{F j, Fij > 0} la
variable d’entrée est la variable hors base associées au coût relatif Fsr .
Si Fsr atteint en plusieurs variables, on prend celle du coût minimal.
Et on pose xsr = w puis ajuster les variables de base sans toucher aux
autres variable hors base.

15/27
4.3 Application Problème de transport

— Variable de sortie : on calcule w, après on affecte à xsr la plus grande


valeur de w puis on actualise le tableau. Le coût total associé à la
nouvelle SBR est augmenté de Fsr − w.

4.3 Application
On reste dans le même exemple et à partir de la SBR obtenue par la
méthode moindre coûts, déterminons une autre SBR :
C1 C2 C3 C4 C5 Offre
L1 120 ⟨1 — ⟨8 120 ⟨1 — ⟨5 — ⟨4 240
L2 — ⟨5 130 ⟨5 25 ⟨3 5 ⟨6 — ⟨7 160
L3 — ⟨2 — ⟨9 — ⟨5 120 ⟨9 140 ⟨8 260
Demande 120 130 145 125 140 660
On a la SBR initiale :
x11 = 120, x13 = 120, x22 = 130, x23 = 25, x24 = 5, x34 = 120, x35 = 140.

Étape 1 : On calcule les multiplicateurs Ui et Vj :



 0 = c11 − U1 − V1 = 1 − U1 − V1



 0 = c13 − U1 − V3 = 1 − U1 − V3



 0 = c22 − U2 − V2 = 5 − U2 − V2
0 = c23 − U2 − V3 = 3 − U2 − V3



 0 = c24 − U2 − V4 = 5 − U2 − V4



 0 = c34 − U3 − V4 = 9 − U3 − V4

0 = c35 − U3 − V5 = 8 − U3 − V5

On fixe U1 = 0, le vecteur à un indice plus petit que l’autre. On a :


U1 = 0 ⇒ V1 = 1 et V3 = 1 et ainsi de suite on détermine les valeurs de Ui
et Vi . On trouve finalement :
U1 = 0, U2 = 0, U3 = 0. Et V1 = 1, V2 = 3, V3 = 1, V4 = 4, V5 = 3.

Étape 1 : Les coûts relatifs :




 F12 = c12 − U1 − V2 =8−0−3=5



 F14 = c14 − U1 − V4 =5−0−4=1


 F15 = c15 − U1 − V5
 =4−0−3=1

F21 = c21 − U2 − V1 =5−2−1=2

 F25 = c25 − U2 − V5 =7−2−2=2



 F31 = c31 − U3 − V1 = 2 − 5 − 1 = −4 < 0



 F = c32 − U3 − V2 =9−5−3=1
 32
F33 = c33 − U3 − V3 = 5 − 5 − 1 = −1 < 0

16/27
4.3 Application Problème de transport

Donc s = 3 et r = 1, donc La variable d’entrée est x31 .


Le tableau de transport devient :

C1 C2 C3 C4 C5
L1 120 − w ⟨1 — ⟨8 120 + w ⟨1 — ⟨5 — ⟨4
L2 — ⟨5 130 ⟨5 25 − w ⟨3 5 + w ⟨6 — ⟨7
L3 +w ⟨2 — ⟨9 — ⟨5 20 − w⟨9 140 ⟨8

On déterminer la valeur de w : c’est la plus petite valeur xij du parcours


où l’on soustrait w :

w = min{120, 25, 125} = 25

Le tableau de transport devient :

C1 C2 C3 C4 C5
L1 95 ⟨1 — ⟨8 145 ⟨1 — ⟨5 — ⟨4
L2 — ⟨5 130 ⟨5 — ⟨3 30 ⟨6 — ⟨7
L3 25 ⟨2 — ⟨9 — ⟨5 95 ⟨9 140 ⟨8

Et Z = Z + F31 .w

Donc :

Z ′ = Z + (−4) × 25 = 3195 − 100 = 3095

Vérification de l’optimisation du tableau : cas des variables de


base :



 0 = c11 − U1 − V1 = 1 − 0 − V1



 0 = c13 − U1 − V3 = 1 − 0 − V3


 0 = c22 − U2 − V2 = 5 − U2 − V2
0 = c24 − U2 − V4 = 6 − U2 − V4



 0 = c31 − U2 − V3 = 2 − U2 − V3



 0 = c34 − U3 − V4 = 9 − U3 − V4

0 = c35 − U3 − V5 = 8 − U3 − V5

17/27
4.3 Application Problème de transport

On trouve :
U1 = 0, U2 = −2, U3 = 1. Et V1 = 1, V2 = 7, V3 = 1, V4 = 8, V5 = 7.
cas des variables de base :


 F12 = c12 − U1 − V2 =8−0−7=1



 F14 = c14 − U1 − V4 = 5 − 0 − 8 = −3 < 0



 F15 = c15 − U1 − V5 = 4 − 0 − 7 = −3 <

F21 = c21 − U2 − V1 =5+2−1=6

 F23 = c23 − U2 − V3 =3+2−1=4



 F31 = c31 − U3 − V1 =7+2−7=2



 F = c32 − U3 − V2 =9−1−7=1
 32
F33 = c33 − U3 − V3 =5−1−1=3
La variable d’entrer est x15 .
C1 C2 C3 C4 C5
L1 95 − w ⟨1 — ⟨8 145 ⟨1 — ⟨5 +w ⟨4
L2 — ⟨5 130 ⟨5 ⟨3 30 ⟨6 — ⟨7
L3 25 + w ⟨2 — ⟨9 — ⟨5 95 ⟨9 140 − w ⟨8

Donc
w = min{95, 140} = 95

On reprend encore :
C1 C2 C3 C4 C5
L1 — ⟨1 — ⟨8 145 ⟨1 — ⟨5 95 ⟨4
L2 — ⟨5 130 ⟨5 ⟨3 30 ⟨6 — ⟨7
L3 190 ⟨2 — ⟨9 — ⟨5 95 ⟨9 45 ⟨8
Et après calcule des multiplicateurs Ui et Vj on trouve :
U1 = 0, U2 = 1, U3 = 4. Et V1 = −2, V2 = 4, V3 = 1, V4 = 5, V5 = 4.
Puis on calcule les Fij on trouvera Fij > 0, ∀i, j, alors la solution courante
est optimale :
Z” = 3095 + (−3) × 95 = 2810
La solution optimal est :
x13 = 145, x15 = 95, x22 = 130, x24 = 30, x31 = 120, x34 = 95, x35 = 45
Les autres xij = 0, variables hors base.

18/27
Problème de transport

5 Conclusion
Dans ce travail on s’est intéressé davantage à la modélisation et la
résolution du problème de transport par de différentes méthodes qui nous
permettent d’obtenir une solution de base réalisable (Nord-Ouest, Coût mi-
nimum). Ensuite, nous avons essayé d’expliquer l’optimisation d’un telle so-
lution de base initiale par le test d’optimalité et d’amélioration de la solution
pour avoir une solution optimale.

A la fin on peut dire que ce travail constitue une base de départ pour
résoudre les problèmes généraux de transport.

19/27
Problème de transport

6 Annexe
6.1 Code source du simplexe en Python
import heapq

’’’
Return a rectangular identity matrix with the specified diagonal entiries, possibly
starting in the middle.
’’’
def identity(numRows, numCols, val=1, rowStart=0):
return [[(val if i == j else 0) for j in range(numCols)]
for i in range(rowStart, numRows)]

’’’
standardForm: [float], [[float]], [float], [[float]], [float], [[float]], [float]
-> [float], [[float]], [float]
Convert a linear program in general form to the standard form for the
simplex algorithm. The inputs are assumed to have the correct dimensions: cost
is a length n list, greaterThans is an n-by-m matrix, gtThreshold is a vector
of length m, with the same pattern holding for the remaining inputs. No
dimension errors are caught, and we assume there are no unrestricted variables.
’’’
def standardForm(cost, greaterThans=[], gtThreshold=[], lessThans=[], ltThreshold=[],
equalities=[], eqThreshold=[], maximization=True):
newVars = 0
numRows = 0
if gtThreshold != []:
newVars += len(gtThreshold)
numRows += len(gtThreshold)
if ltThreshold != []:
newVars += len(ltThreshold)
numRows += len(ltThreshold)
if eqThreshold != []:
numRows += len(eqThreshold)

if not maximization:
cost = [-x for x in cost]

20/27
6.1 Code source du simplexe en Python Problème de transport

if newVars == 0:
return cost, equalities, eqThreshold

newCost = list(cost) + [0] * newVars

constraints = []
threshold = []

oldConstraints = [(greaterThans, gtThreshold, -1), (lessThans, ltThreshold, 1),


(equalities, eqThreshold, 0)]

offset = 0
for constraintList, oldThreshold, coefficient in oldConstraints:
constraints += [c + r for c, r in zip(constraintList,
identity(numRows, newVars, coefficient, offset))]

threshold += oldThreshold
offset += len(oldThreshold)

return newCost, constraints, threshold

def dot(a,b):
return sum(x*y for x,y in zip(a,b))

def column(A, j):


return [row[j] for row in A]

def transpose(A):
return [column(A, j) for j in range(len(A[0]))]

def isPivotCol(col):
return (len([c for c in col if c == 0]) == len(col) - 1) and sum(col) == 1

def variableValueForPivotColumn(tableau, column):


pivotRow = [i for (i, x) in enumerate(column) if x == 1][0]
return tableau[pivotRow][-1]

# assume the last m columns of A are the slack variables; the initial basis is
# the set of slack variables
def initialTableau(c, A, b):

21/27
6.1 Code source du simplexe en Python Problème de transport

tableau = [row[:] + [x] for row, x in zip(A, b)]


tableau.append([ci for ci in c] + [0])
return tableau

def primalSolution(tableau):
# the pivot columns denote which variables are used
columns = transpose(tableau)
indices = [j for j, col in enumerate(columns[:-1]) if isPivotCol(col)]
return [(colIndex, variableValueForPivotColumn(tableau, columns[colIndex]))
for colIndex in indices]

def objectiveValue(tableau):
return -(tableau[-1][-1])

def canImprove(tableau):
lastRow = tableau[-1]
return any(x > 0 for x in lastRow[:-1])

# this can be slightly faster


def moreThanOneMin(L):
if len(L) <= 1:
return False

x,y = heapq.nsmallest(2, L, key=lambda x: x[1])


return x == y

def findPivotIndex(tableau):
# pick minimum positive index of the last row
column_choices = [(i,x) for (i,x) in enumerate(tableau[-1][:-1]) if x > 0]
column = min(column_choices, key=lambda a: a[1])[0]

# check if unbounded
if all(row[column] <= 0 for row in tableau):
raise Exception(’Linear program is unbounded.’)

# check for degeneracy: more than one minimizer of the quotient

22/27
6.1 Code source du simplexe en Python Problème de transport

quotients = [(i, r[-1] / r[column])


for i,r in enumerate(tableau[:-1]) if r[column] > 0]

if moreThanOneMin(quotients):
raise Exception(’Linear program is degenerate.’)

# pick row index minimizing the quotient


row = min(quotients, key=lambda x: x[1])[0]

return row, column

def pivotAbout(tableau, pivot):


i,j = pivot

pivotDenom = tableau[i][j]
tableau[i] = [x / pivotDenom for x in tableau[i]]

for k,row in enumerate(tableau):


if k != i:
pivotRowMultiple = [y * tableau[k][j] for y in tableau[i]]
tableau[k] = [x - y for x,y in zip(tableau[k], pivotRowMultiple)]

’’’
simplex: [float], [[float]], [float] -> [float], float
Solve the given standard-form linear program:

max <c,x>
s.t. Ax = b
x >= 0

providing the optimal solution x* and the value of the objective function
’’’
def simplex(c, A, b):
tableau = initialTableau(c, A, b)
print("Tableau Initial:")
for row in tableau:
print(row)
print()

23/27
6.1 Code source du simplexe en Python Problème de transport

while canImprove(tableau):
pivot = findPivotIndex(tableau)
print("L’index de next pivot est =%d,%d \n" % pivot)
pivotAbout(tableau, pivot)
print("Le tableau aprés le pivot:")
for row in tableau:
print(row)
print()

return tableau, primalSolution(tableau), objectiveValue(tableau)

if __name__ == "__main__":
c = [300, 250, 450]
A = [[15, 20, 25], [35, 60, 60], [20, 30, 25], [0, 250, 0]]
b = [1200, 3000, 1500, 500]

# add slack variables by hand


A[0] += [1,0,0,0]
A[1] += [0,1,0,0]
A[2] += [0,0,1,0]
A[3] += [0,0,0,-1]
c += [0,0,0,0]

t, s, v = simplex(c, A, b)
print(s)
print(v)

24/27
6.2 Résultat du script Problème de transport

6.2 Résultat du script

Tableau Initial :
[15, 20, 25, 1, 0, 0, 0, 1200]
[35, 60, 60, 0, 1, 0, 0, 3000]
[20, 30, 25, 0, 0, 1, 0, 1500]
[0, 250, 0, 0, 0, 0, -1, 500]
[300, 250, 450, 0, 0, 0, 0, 0]
L’index de next pivot est =3,1
Le tableau après le pivot :
[15.0, 0.0, 25.0, 1.0, 0.0, 0.0, 0.08, 1160.0]
[35.0, 0.0, 60.0, 0.0, 1.0, 0.0, 0.24, 2880.0]
[20.0, 0.0, 25.0, 0.0, 0.0, 1.0, 0.12, 1440.0]
[0.0, 1.0, 0.0, 0.0, 0.0, 0.0, -0.004, 2.0]
[300.0, 0.0, 450.0, 0.0, 0.0, 0.0, 1.0, -500.0]
L’index de next pivot est =1,6
Le tableau après le pivot :
[3.333333333333332, 0.0, 5.0, 1.0, -0.33333333333333337, 0.0, 0.0, 200.0]
[145.83333333333334, 0.0, 250.0, 0.0, 4.166666666666667, 0.0, 1.0, 12000.0]
[2.5, 0.0, -5.0, 0.0, -0.5, 1.0, 0.0, 0.0]
[0.5833333333333334, 1.0, 1.0, 0.0, 0.01666666666666667, 0.0, 0.0, 50.0]
[154.16666666666666, 0.0, 200.0, 0.0, -4.166666666666667, 0.0, 0.0, -12500.0]
L’index de next pivot est =2,0
Le tableau aprés le pivot :
[0.0, 0.0, 11.666666666666664, 1.0, 0.33333333333333315, -1.333333333333333, 0.0, 200.0]
[0.0, 0.0, 541.6666666666667, 0.0, 33.333333333333336, -58.33333333333334, 1.0, 12000.0]
[1.0, 0.0, -2.0, 0.0, -0.2, 0.4, 0.0, 0.0]
[0.0, 1.0, 2.166666666666667, 0.0, 0.13333333333333336, -0.23333333333333336, 0.0, 50.0]
[0.0, 0.0, 508.3333333333333, 0.0, 26.666666666666664, -61.666666666666664, 0.0, -12500.0]
L’index de next pivot est =1,4
Le tableau après le pivot :
[0.0, 0.0, 6.250000000000001, 1.0, 0.0, -0.75, -0.009999999999999993, 80.00000000000007]
[0.0, 0.0, 16.25, 0.0, 1.0, -1.7500000000000002, 0.03, 360.0]
[1.0, 0.0, 1.25, 0.0, 0.0, 0.04999999999999993, 0.006, 72.0]
[0.0, 1.0, 0.0, 0.0, 0.0, 5.551115123125783e-17, -0.004000000000000001, 1.999999999999993]
[0.0, 0.0, 75.0, 0.0, 0.0, -14.999999999999993, -0.7999999999999999, -22100.0]
L’index de next pivot est =0,2
Le tableau aprés le pivot :
[0.0, 0.0, 1.0, 0.15999999999999998, 0.0, -0.11999999999999998, -0.0015999999999999988, 12.80000000000001]
[0.0, 0.0, 0.0, -2.5999999999999996, 1.0, 0.1999999999999995, 0.05599999999999998, 151.99999999999986]

25/27
6.2 Résultat du script Problème de transport

[1.0, 0.0, 0.0, -0.19999999999999996, 0.0, 0.1999999999999999, 0.007999999999999998, 55.999999999999986]


[0.0, 1.0, 0.0, 0.0, 0.0, 5.551115123125783e-17, -0.004000000000000001, 1.999999999999993]
[0.0, 0.0, 0.0, -11.999999999999998, 0.0, -5.999999999999995, -0.68, -23060.0]

[(0, 55.999999999999986), (1, 1.999999999999993), (2, 12.80000000000001), (4, 151.99999999999986)]

23060.0

26/27
RÉFÉRENCES Problème de transport

Références
[1] Abderrazak GDHI, Professeur à la Faculté des Sciences Dhar El Meh-
raz de Fès, Cours et exercices de Programmation Mathématique année
2018/2019.
[2] Ahmed El Hilali Alaoui, Youssef Benadada ; Programmation Mathéma-
tique.
[3] Y. Hamam et H. Talbot ; Introduction à la Programmation Mathéma-
tique : Programmation Linéaire et Optimisation Combinatoire.
[4] Didier Smets ; Programmation linéaire et Optimisation.
[5] https://github.com/j2kun/simplex-algorithm

27/27

View publication stats

Vous aimerez peut-être aussi