Il problema del trasporto
•
Consideriamo il problema di trasportare una merce da m depositi (aventi disponibilità ai ) ad n
mercati (con richieste b j ) in presenza di costi unitari di spedizione cij dal deposito i al mercato j.
•
•
L’obiettivo che ci si pone è quello di minimizzare il costo complessivo del trasporto soddisfacendo
tutte le domande dei mercati e tenendo conto delle disponibilità dei vari depositi.
Questo problema è stato affrontato rigorosamente per la prima volta nel 1940 da Koopmans, un
economista olandese che successivamente ottenne il Nobel per questa ed altre ricerche.
Graficamente, il problema può essere illustrato come nel disegno che segue:
a1 1
1 b1
c21
a2 2
2 b2
.
.
.
.
.
.
n bn
am m
•
Per formulare il modello matematico di questo problema conviene introdurre le variabili:
xij
•
quantità di merce trasportata dal deposito i al mercato j
Il problema può essere formulato come:
m
n
∑∑ c x
min
ij ij
=i 1 =j 1
n
∑x
s.t.
j =1
ij
m
∑x
i =1
ij
≤ ai
i=
1,..., m
≥ bj
j=
1,..., n
xij ≥ 0
•
•
•
( P)
i = 1,..., m; j = 1,..., n
Nel primo vincolo, se xij è la quantità trasportata dal deposito i al mercato j, allora la sommatoria
indica, per il singolo deposito i, il totale della quantità di bene che da i giunge a tutti i mercati j =
1,2,…,m.
Il secondo vincolo è il vincolo di domanda ovvero il totale delle spedizioni che arrivano al singolo
mercato j deve soddisfare la richiesta del mercato j
E’ facile dimostrare che questo modello ammette soluzioni solo quando la disponibilità totale è
non minore della richiesta totale. Infatti, sommando i due gruppi di disuguaglianze si ottiene:
n
n
m
∑ b ≤∑∑
j =1
j
j =1 i =1
m
n
m
xij =∑∑ xij ≤∑ ai
i =1 j =1
i =1
•
•
Dunque con questo modello
o non si può trattare il caso in cui la domanda sia superiore alla disponibilità
o non si assegna alcun costo alla eventuale giacenza di merce nei vari depositi (o si suppone
che i costi siano uguali in tutti i depositi) nel caso in cui la disponibilità complessiva superi la
domanda totale.
Per tenere conto di questi costi e per estendere il modello al caso in cui non sia possibile soddisfare
tutta la domanda è sufficiente introdurre un deposito fittizio m+1 e/o un mercato fittizio n+1
interpretando i costi e le variabili decisionali nel modo seguente:
o
xi ,n +1 quantità di merce giacente nel deposito i
o
xm +1, j quantità di domanda non soddisfatta nel mercato j
o
ci ,n +1 costo unitario di giacenza nel deposito i
o
cm +1, j penalità unitaria per la carenza di merce nel mercato j
Esempio
a1 1
a2 2
c21
1 b1
2 b2
.
.
.
.
.
.
Per studiare cosa accade qualora vi sia eccesso di disponibilità ai depositi,
si aggiunge un nodo alle destinazioni e lo si collega a tutti i depositi; esso
avrà una domanda pari al totale dell’eccesso. Il costo, ci , n +1 , sarà pari al
costo unitario di giacenza nel deposito i.
n bn
am m
n+1
Ad esempio, trascurando il costo di giacenza ai depositi, esaminiamo il
seguente problema, tratto da Pezzella, Faggioli, Ricerca Operativa –
Problemi di gestione della Produzione, Pitagora Editrice.
Un’azienda deve trasportare i prodotti finiti dagli stabilimenti ai magazzini di distribuzione. Gli stabilimenti
sono situati a Houston, Casper e Titus e la loro produttività è tale da non poter inviare merce in quantità di
350, 250 e 300 unità rispettivamente. I magazzini sono situati a LA, Saint Louis, Indiana, Newark e Atlanta e
devono soddisfare rispettivamente una domanda di 200, 120, 230, 190, 150 unità. La rete di trasporto non
permette di collegare tutti gli stabilimenti a tutti i magazzini e i costi unitari di trasporto sono dati:
Da\A
Houston
LA
250
Saint Louis
180
Indiana
190
Casper
280
220
210
Titus
∞
∞
170
Q. richiesta
200
120
230
Determinare il piano di trasporti a costo minimo.
Il problema (P) è stato risolto con Lingo con il codice:
model:
sets:
depots/1..3/:availab;
markets/1..5/:demand;
dm(depots,markets):costs,x;
endsets
Newark
∞
∞
140
190
Atlanta
200
Q. disponibili
350
∞
250
160
150
300
data:
availab=350,250,300;
demand=200,120,230,190,150;
costs=200,180,190,30000,200,
280,220,210,30000,30000,
30000,30000,170,140,160; !gli infiniti sono mappati in 30000;
enddata
min=@sum(depots(i):@sum(markets(j):costs(i,j)*x(i,j)));
@for(depots(i):@sum(markets(j):x(i,j))<=availab(i));
@for(markets(j):@sum(depots(i):x(i,j))>=demand(j));
end
X( 1, 1)
200
X( 1, 2)
110
X( 1, 3)
0
X( 1, 4)
0
X( 1, 5)
40
X( 2, 1)
0
X( 2, 2)
10
X( 2, 3)
230
X( 2, 4)
0
X( 2, 5)
0
X( 3, 1)
0
X( 3, 2)
0
X( 3, 3)
0
X( 3, 4)
190
X( 3, 5)
110
250
200
150
da depot 3
da depot 2
100
da depot 1
50
0
1
2
3
4
5
La soluzione mostra come dal deposito 1 non si vada al mercato 4, dal 2 al 4 e al 5, dal 3 all’1 e al 2: 30000
è, in questo caso, una “buona approssimazione” di infinito.
Si osservi come la domanda totale sia di 890 unità contro una disponibilità di 900; il residuo di 10 resta non
spedito nel deposito 2. La prova di estensione del modello di trasporto consiste nel rendere piuttosto
costoso il deposito 2 per merce non spedita.
Il codice Lingo diviene:
model:
sets:
depots/1..3/:availab;
markets/1..6/:demand;
dm(depots,markets):costs,x;
endsets
data:
availab=350,250,300;
demand=200,120,230,190,150,10;
costs=200,180,190,30000,200,100,
280,220,210,30000,30000,500,
30000,30000,170,140,160,100; !gli infiniti sono mappati in 30000;
enddata
min=@sum(depots(i):@sum(markets(j):costs(i,j)*x(i,j)));
@for(depots(i):@sum(markets(j):x(i,j))<=availab(i));
@for(markets(j):@sum(depots(i):x(i,j))>=demand(j));
end
dove il mercato fittizio 6 ha una domanda di 10 e il deposito 2 ha un costo di stoccaggio di 500, a fronte di
un costo di stoccaggio di 100 degli altri 2 depositi. La soluzione cambia:
X( 1, 1)
200
X( 1, 2)
100
X( 1, 3)
0
X( 1, 4)
0
X( 1, 5)
40
X( 1, 6)
10
X( 2, 1)
0
X( 2, 2)
20
X( 2, 3)
230
X( 2, 4)
0
X( 2, 5)
0
X( 2, 6)
0
X( 3, 1)
0
X( 3, 2)
0
X( 3, 3)
0
X( 3, 4)
190
X( 3, 5)
110
X( 3, 6)
0
250
200
150
da 3
da 2
100
da 1
50
0
1
2
3
4
5
6
Nei fatti è solo il deposito 1 che mantiene il residuo (poiché è il solo a spedire al cliente fittizio 6).
Scarica

Il problema del trasporto