Problmedetransport
Problmedetransport
Problmedetransport
net/publication/336371097
Problème de Transport
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.
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.
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.
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
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.
2 Notions de base
2.1 Forme générale d’un programme linéaire
Définitions :
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
Modélisation de problème :
Contraintes :
3x1 + 6x2 6 60
4x1 + 3x2 6 45
3x1 + x2 6 30
x1 , x 2 > 0
3x1 + 6x2 6 60
4x1 + 3x2 6 45
Sujet à
3x1 + x2 6 30
x1 , x 2 > 0
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
6/27
2.2 La méthode de simplexe Problème de transport
É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
7/27
2.2 La méthode de simplexe Problème de transport
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
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
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.
Laboratoire L1 L2 L3
Quantité ai 240 160 260
Centres C1 C2 C3 C4 C5
Demandes Ci 120 130 145 125 140
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
Contraintes :
— offre limitée au niveau des coûts.
— obligation à satisfaire les demandes de destination.
11/27
3.2 Exemple Problème de transport
n
∑
xij 6 ai , ∀i ∈ I
j=1
sous contraints : ∑m
xij > bj , ∀j ∈ J
i=1
xij > 0, ∀(i, j) ∈ I × J
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
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
É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.
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
Donc Zc = 3795DH
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
Étape 2 : calculer pour les variables hors base, les coûts relatifs :
cij − Ui − Vj = Fij
15/27
4.3 Application Problème de transport
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.
16/27
4.3 Application Problème de transport
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
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 :
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
constraints = []
threshold = []
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)
def dot(a,b):
return sum(x*y for x,y in zip(a,b))
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
# 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
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])
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.’)
22/27
6.1 Code source du simplexe en Python Problème de transport
if moreThanOneMin(quotients):
raise Exception(’Linear program is degenerate.’)
pivotDenom = tableau[i][j]
tableau[i] = [x / pivotDenom for x in tableau[i]]
’’’
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()
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]
t, s, v = simplex(c, A, b)
print(s)
print(v)
24/27
6.2 Résultat du script Problème de transport
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
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