Sei sulla pagina 1di 80

Programmazione Lineare

Introduzione
La programmazione lineare si occupa di distribuire in modo ottimale risorse limitate tra attivita'
competitive.

I campi in cui la Programmazione Lineare trova applicazione sono tra i piu' molteplici e svariati;
spaziano dalla soluzione di giochi di societa' alla creazione di modelli di trasporto, dalla
assegnazione dei mezzi di produzione alla selezione di portafoglio e così via. Ad ogni modo,
l'elemento che accomuna ciascuna situazione e' il bisogno di assegnare determinate risorse a certe
attivita'.

La Programmazione Lineare utilizza un modello matematico per descrivere il problema che di volta
in volta viene analizzato: l'aggettivo "lineare" sta ad indicare che tutte le funzioni matematiche del
modello sono lineari, mentre la parola "programmazione" puo' essere interpretata come sinonomo di
pianificazione. Percio' con Programmazione Lineare si intende la pianificazione di attivita' in modo
da ottenere un risultato "ottimale": il modello matematico fissa l'obiettivo da raggiungere ed il
risultato deve soddisfarlo nel migliore dei modi scegliendo tra le possibili alternative.

Modelli ed Applicazioni
Quello che segue e' Il modello matematico di un generico problema di programmazione lineare:

Trovare x1, x2, ..., xn tale che sia massima la funzione

Z = c1x1 + c2x2 + ... + cnxn

che e' soggetta ai vincoli

a11x1 + a12x2 + ... + a1nxn ≤ b1

a21x1 + a22x2 + ... + a2nxn ≤ b2

...

am1x1 + am2x2 + ... + amnxn ≤ bm

posto

x1, x2, ..., xn ≥ 0

dove aij, bi, cj sono costanti date.

La funzione da massimizzare e' detta funzione obiettivo, le x1, x2, ..., xn da determinare sono dette
variabili decisionali, mentre le disugualianze sono i vincoli posti dal problema; si scelgono i valori
delle xj in modo da rendere massimo il valore della funzione obiettivo e rispettando, allo stesso

1
tempo, i limiti posti dai vincoli: in questo modo, la funzione obiettivo puo' crescere ma solo fino a
raggiungere dei valori prestabiliti.

Per interpretare il modello, basti pensare che:

date n attivita' in competizione, le variabili decisionali x1, x2, ..., xn rappresentano i livelli delle n
attivita' (Es.: ho n attivita' per produrre n prodotti: xj sara' il numero di unita' del prodotto j da
produrre in un dato periodo di tempo);
Z e' la misura generale dell' efficacia scelta (Es.: il profitto che si vuole ottenere in un dato
periodo di tempo);
cj indica di quanto aumenta Z all'aumentare di xj di una unita';

m e' il numero delle risorse indispensabili ma limitate e per ognuna di esse compare una
disugualianza che ne vincola la disponibilita', m disugualianze in tutto;
bi indica la quantita' totale della risorsa i che bisognera' ripartire poi tra le n attivita';
aij e' la quantita' di risorsa i consumata da una unita' di attivita' j;

Il primo membro di ciascuna ugualianza indica percio' in che modo le risorse vengono distribuite e
completamente consumate dalle n attivita'. I vincoli x1, x2, ..., xn ≥ 0 escludono la possibilita' di
livelli di attivta' negativi (non ha senso una produzione di -xj unita' di prodotto j).

Esempio

Due macchinari, A e B, fabbricano i prodotti I e II; per il prodotto I servono 5 ore della macchina A
e 4 ore della macchina B, mentre per II sono necessarie 10 ore macchina A e 4 ore macchina B;
sono disponibili 60 ore macchina A e 40 ore macchina B; i guadagni previsti sono 6 per il prodotto I
e 8 per il prodotto II. Bisogna decidere come pianificare la produzione.

A B £

I 5 4 6 x1 quantita' di I da produrre
II 10 4 8 x2 quantita' di II da produrre
60 40

Il modello matematico che si ottiene sara':

max 6x1 + 8x2 funzione obiettivo

5x1 + 10x2 ≤ 60 vincolo sulla macchina A

4x1 + 4x2 ≤ 40 vincolo sulla macchina B

x1 , x2 ≥ 0

2
Proprieta'
Facendo riferimento all'esempio visto precedentemente, si ha:

Proporzionalita'
si suppone che, se una unita' del prodotto I necessita di n ore di lavoro
sulla macchina A, allora x1 unita' di I richiederanno nx1 ore di lavoro
su A.
Additivita'
si sono sommate le ore di lavoro del prodotto I sulla macchina A con
le ore di lavoro del prodotto II sulla stessa macchina: questo significa
che le ore di lavoro della macchina A sul prodotto I sono
indistinguibili da quelle sul prodotto II e percio’ possono essere
sommate tra di loro. Lo stesso discorso vale per la macchina B
Divisibilita':
si accetta che le variabili x1 e x2 possano assumere qualsiasi valore
reale; si e’ disposti ad accettare soluzioni del tipo x1 = ∏ , sempre che
nel contesto abbia senso un valore di questo tipo. Se i valori delle
variabili devono essere interi, allora non si parla piu’ di
Programmazione Lineare, ma di Programmazione Intera
Certezza:
tutti i coefficienti del modello di programmazione lineare sono, per
ipotesi, costanti note a priori, senza incertezze; nella realta’ si ricorre
spesso all’uso di criteri specifici quando alcuni dei coefficienti non
sono costanti conosciute

Il Metodo del Simplesso


Il metodo del simplesso è stato inventato verso la fine degli anni '40 da G.B. Dantzig, principale
ideatore della programmazione lineare; si tratta di un processo algebrico che porta, in modo
graduale, alla soluzione ottima del problema (amemsso che esista) in un numero finito di passi.

L'avvento delle tecnologie informatiche ha reso possibile l'implementazione di questo metodo,


offrendo grandi vantaggi (uno per tutti la velocità di calcolo) anche se problemi particolarmente
complessi, con un elevato numero di variabili, risultano ancora oggi improponibili, dati gli enormi
tempi di elaborazione richiesti.

Il simplesso non è il solo metodo di risoluzione per i problemi di programmazione lineare, ma è


sicuramente il più diffuso .

Equazioni
Termini Noti
Variabili
Forma Standard
Forma Canonica

3
Forma Standard e Forma Canonica

Il Metodo del Simplesso parte da un problema in forma standard, che soddisfa le seguenti
condizioni:

FORMA STANDARD
tutti i vincoli sono sempre e solo (cioe’ … =
1
equazioni …)
2 i termini noti sono non negativi ( bi ≥ 0 )
3 le variabili sono non negative ( xj ≥ 0 )

Consideriamo l’esempio:

max 6x1 + 8x2 funzione obiettivo

5x1 + 10x2 ≤ 60 vincolo sulla macchina A

4x1 + 4x2 ≤ 40 vincolo sulla macchina B

x1 , x2 ≥ 0

Equazioni

Appare il ≤ al posto dell' = (caso dell'esempio):


5x1 + 10x2 ≤ 60 diventa
5x1 + 10x2 + x3 = 60 con x3 ≥ 0
per eliminare la disuguaglianza, e’ stata inserita la variabile x3, detta variabile di
slack, tale che:
0 ≤ x3 = 60 - 5x1 + 10x2
la variabile di slack rappresenta percio' la differenza tra i due membri della
disuguaglianza
Per il secondo vincolo si avra’:
4x1 + 4x2 ≤ 40 diventa
4x1 + 4x2 + x4 = 40 con x4 ≥ 0
NB: ogni vincolo ha la propria variabile di slack: x4 ≠ x3
Appare il ≥ al posto dell' =
il procedimento e' simile a quello utilizzato per inserire la variabile di slack,
solamente, in questo caso, si trattera' di togliere qualcosa alla disequazione, la così
detta variabile di surplus: dovra' essere un termine ³ 0 ed apparira' nell'equazione con
coefficiente negativo
5x1 + 10x2 ≥ 60 diventa
5x1 + 10x2 - x5 = 60 con x5 ≥ 60

4
Termini noti

Se appaiono dei termini noti negativi, bisognera' moltiplicare per -1 le rispettive


disequazioni ed invertire il segno di disugualianza; se appare un ≥ , ci si comportera'
come nel caso visto sopra
5x1 + 10x2 ≥ - 60 diventa
- 5x1 - 10x2 ≤ 60

Variabili

E' possibile che alcune variabili siano indifferentemente >, =, < a 0: in questo caso si dice
che ' la variabile non vincolata; se xj è non vincolata allora verra' espressa come
differenza di due nuove variabili vincolate:
xj variabile non vincolata diventa
xj = xj' - xj" dove xj' ≥ 0 , xj" ≥ 0

Forma Standard

La forma standard dell'esempio visto sara' quindi:

max 6x1 + 8x2 funzione obiettivo


5x1 + 10x2 + x3 = 60 vincolo sulla macchina A
4x1 + 4x2 + x4 = 40 vincolo sulla macchina B
x1 , x2 , x3 , x4 ≥ 0

Forma Canonica

Analizziamo ora la matrice dei vincoli relativa ai coefficienti delle variabili del sistema; la matrice
sara':

x1 x2 x3 x4 b
5 10 1 0 60
4 4 0 1 40

Nella matrice e' presente una sottomatrice identica (evidenziata in giallo) in corrispondenza dei
coefficienti delle variabili di slack: avendo n variabili, si otterra' una matrice identica n x n; questa
e' una quarta proprieta' di cui gode il nostro sistema.

La forma standard , che gode delle tre proprieta' analizzate all'inizio, piu' la quarta proprieta' appena
vista genera la così detta forma canonica del problema.

5
FORMA CANONICA
tutti i vincoli sono sempre e solo (cioe’ … =
1
equazioni …)
2 i termini noti sono non negativi ( bi ≥ 0 )
3 le variabili sono non negative ( xj ≥ 0 )
la matrice dei vincoli del sistema
4 contiene una sottomatrice
dentica

Ricerca della Soluzione Ottima

Una volta ottenuta la forma canonica del problema, osservandola e' possibile individuare una delle
soluzioni ammissibili, una soluzione, cioe' che soddisfa tutti i vincoli del problema: basta porre
pari a zero i coefficienti delle variabili x1 e x2; questo particolare tipo di soluzione e' detta
soluzione di base.

Facendo sempre riferimento all'esempio precedente, si ha:

SOLUZIONE DI BASE
Variabile
x1 0
FUORI BASE
Variabile
x2 0
FUORI BASE
Variabile IN
x3 60
BASE
Variabile IN
x4 40
BASE
Funzione
Z 0
obiettivo

Le variabili poste pari a 0 sono dette variabili fuori base, mentre quelle poste ordinatamente uguali
ai termini noti, vengono dette variabili in base; osservando sempre la forma canonica, si vede che
sono variabili in base quelle relative alla matrice identica, fuori base le rimanenti; inoltre, le
variabili in base sono ordinate secondo le colonne della matrice identica.

x1 x2 x3 x4 b
5 10 1 0 60
4 4 0 1 40

La soluzione di base trovata e' ottima per il nostro problema oppure esistono soluzioni migliori?

Le variabili x1 e x2 sono entrambe pari a 0, ma facendone aumentare il valore, anche il valore della
funzione obiettivo aumenta ed e' proprio quello che si vuole: massimizzare la Z; questo spiega
anche il motivo per cui i segni dei coefficienti delle variabili, nella funzione obiettivo, sono
strettamente positivi: se x1 > 0 e x2 > 0, allora il valore della funzione obiettivo aumenta.

6
Detto questo, si deduce che la soluzione di base trovata non e' la soluzione ottima

A questo punto, il metodo del simplesso produce una nuova forma canonica, equivalente alla prima,
ma che fornisce soluzioni migliori; bisogna ricordare che: un sistema di equazioni lineari e'
equivalente al sistema dato se produce le stesse soluzioni, inoltre il nuovo sistema si ottiene
attraverso oportune combinazioni lineari delle righe oppure delle colonne del sistema di
partenza

Innanzitutto, si trasforma la funzione obiettivo in una equazione e la si inserisce nel sistema come
fosse un vincolo

max 6x1 + 8x2 diventa 6x1 + 8x2 = Z da cui

6x1 + 8x2 − Z = 0

Il sistema diventa:

x1 x2 x3 x4 -Z b
5 4 1 0 0 60
4 4 0 1 0 40
6 8 0 0 1 0

L'obiettivi ora e' quello di fare entrare in base le variabili x1 e x2; iniziamo facendo entrare in base
x2 (e' indifferente iniziare con l'una o con l'altra variabile): si procede nel modo seguente:

x1 x2 x3 x4 -Z b
5 10 1 0 0 60 b1 / x21 = 60/10 = 6
4 4 0 1 0 40 b2 / x22 = 40/4 = 10
6 8 0 0 1 0

Viene introdotto il concetto di pivot; il pivot e' l'elemento che appartiene alla colonna della variabile
che deve entrare in base ed alla riga per la quale il rapporto bj / xij assume il valore minore: la prima
componente di x2 e' l'elemento pivot.

Per il momento x1 rimane nulla, mentre x2 inizia a crescere in modo compatibile con i vincoli:

I) 10x2 + x3 = 60 se x2 aumenta, x3 diminuisce di conseguenza

II) 4x2 + x4 = 40

7
x2 potra' aumentare fino ad un determinato valore, in corrispondenza del quale x3 si annulla: non
puo' aumentare ulteriormente perche' x3 ≥ 0 per l'ipotesi iniziale; il valore di x2, in corrispondenza
al quale x3 si annulla, e' il massimo valore che x2 puo' assumere ed e' quello che bisogna andare a
considerare:

Sia x3 = 0 ⇒ 10x2 = 60 ⇒ x2 = 60/10 = 6 ⇒ x2 = 6 e' il limite massimo


ammissibile dal vincolo I)
Sia x4 = 0 ⇒ 4x2 = 40 ⇒ x2 = 40/4 = 10 ⇒ x2 = 10 e' il limite massimo
ammissibile dal vincolo II)

Non e' comunque possibile ammettere x2 > 6, perche' in tal caso dal primo vincolo si otterrebbe x3
< 0, andando contro le ipotesi iniziali che vogliono tutte le variabili positive ⇒ x2 = 6 e' il valore
massimo per x2.

Posto x2 = 6, si ha x3 = 0, quindi x2 e' entrato in base mentre x3 e' uscito fuori base; la nuova forma
canonica, equivalente alla precedente, sarà:

x1 x2 x3 x4 -Z b
1/2 1 1/10 0 0 6 b1 / x21 = 12
2 0 -2/5 1 0 16 b2 / x22 = 8
⇐ COSTI
2 0 -4/5 0 1 -48
RIDOTTI

NB: Lo scopo e' fare entrare in base x1 e x2 e farne uscire x3 e x4 ; in questo modo si potra' porre x3
= x4 = 0 e trovare i valori di x1 e x2 che massimizzano il valore della funzione obiettivo.

La colonna relativa ad x2 e' una colonna della matrice identica proprio perche' x2 e' entrato in base;
il nuovo pivot sarà x12; si ottiene una nuova soluzione di base, migliore della precedente in quanto e'
aumentato il valore di Z:

8
NUOVA SOLUZIONE DI
BASE
Variabile
x1 0
FUORI BASE
Variabile IN
x2 6
BASE
Variabile
x3 0
FUORI BASE
Variabile IN
x4 16
BASE
Funzione
Z 48
obiettivo

Per decidere se la nuova soluzione trovata e' la soluzione ottima, bisogna valutare i coefficienti
della soluzione obiettivo, cioe' i costi ridotti; il costo ridotto relativo a x1, e' maggiore di 0: posso
farlo diminuire ulteriormente trovando soluzioni migliori; quindi la soluzione trovata non e' ancora
l'ottima e, anche se il profitto Z = 48 e' migliore del precedente, puo' ancora aumentare.

Si noti che:
5x1 + 10x2 ≤ 60 Primo vincolo
5x1 + 10x2 + x3 =
60 Variabile di slack sul
x3 = 60 - 5x1 + primo vincolo
10x2
2x1 - 4/5x3 - Z = -
Nuova funzione
48
obiettivo: x2 entra in
Z = 48 + 2x1 - base e x3 esce di base
4/5x3
Z = 48+2x1-
4/5(60-5x1+10x2) Sostituisco x3 con il
valore ottenuto dal
Z = 48 + 2x1 - 48 primo vincolo
+ 4x1 + 8x2 esplicitando x3
Z = 6x1 + 8x2
Ottengo Z = 48 Pongo x1 = 0 e x2 = 6

Faccio entrare in base la variabile x1:

x1 x2 x3 x4 -Z b
0 1 1/5 -1/4 0 2
1 0 -1/5 1/2 0 8
⇐ COSTI
0 0 -2/5 -1 1 -64
RIDOTTI

9
La nuova soluzione di base e':

NUOVA SOLUZIONE DI
BASE
Variabile IN
x1 0
BASE
Variabile IN
x2 0
BASE
Variabile
x3 -2/5
FUORI BASE
Variabile
x4 -1
FUORI BASE
Funzione
Z 64
obiettivo

Questa e' la soluzione ottima in quanto i coefficienti delle variabili della funzione obiettivo sono
nulli (se diminuiscono ulteriormente diventano negativi e fanno diminuire la funzione obiettivo),
mentre quelli relativi alle variabili di slack sono negativi (anche in questo caso non mi conviene
farli entrare in base perchè fanno diminuire la funzione obiettivo).

Programmazione Lineare
Il Metodo del Simplesso
Primo Caso Soluzione Ottima Unica
Secondo
Infinite Soluzioni Ottime
Caso
Terzo Caso Funzione Obiettivo Non Limitata
Quarto Caso Area Amissibile Vuota

Considerazioni sulla Soluzione Ottima

Una volta trovata la soluzione ottima con il metodo del simplesso, bisogna essere sicuri che non ve
ne siano di migliori; a tale scopo viene utilizzato lo spazio delle decisioni.

10
primo vincolo secondo vincolo funzione obiettivo
5x1 + 10x2 ≤ 60 4x1 + 4x2 ≤ 40 6x1 + 8x2 = Z
Posto x1 = 4 e x2 = 3 ⇒ Z
Posto x1 = 0 ⇒ x2 = 6 Posto x1 = 0 ⇒ x2 = 40
= 24
e' uno dei possibili valori
Posto x2 = 0 ⇒ x1 = 12 Posto x2 = 0 ⇒ x1 = 10
di Z

La parte buona per il primo vincolo e' quella che si trova sotto la retta blu; la parte buona per il
secondo vincolo e' quella che si trova sotto la retta viola: l'intersezione delle due aree da' origine
all'area ammissibile, cioe' a quella zona del grafico che contiene tutte le possibili soluzioni del
problema (area tratteggiata in verde).

Spostando la retta Z all'interno della soluzione ammissibile, si fa variare l'intersezione tra la retta e
l'area; le coordinate dei punti risultanti dall'intersezione, sono tutte le possibili coppie di valori (x1,
x2), tali da ottenere lo stesso valore di Z (tutti i punti sulla retta Z hanno lo stesso valore); quindi,
per avere una soluzione ottima unica, basta fare scorrere la funzione obiettivo lungo l'area
ammissibile, finche' l'intersezione tra le due non e' ridotta ad un unico punto; questo e'
quanto accade in (x1, x2) = (8, 2), che sono proprio i valori trovati per x1 e x2 con il metodo del
simplesso.

Da quanto detto si puo' osservare che:

si lavora nello spazio a due dimensioni ⇒ due variabili ai1x1 + ai2x2 = bi


si hanno due vincoli: i vincoli sono dei semipiani e la soluzione ottima deve appartenere
alla loro intersezione Þ la regione ammissibile e' un poligono
si hanno m vincoli: il poligono che determina la regione ammissibile non avra' piu' di m + 2
lati, m vincoli piu' i due assi
si lavora nello spazio a tre dimensioni ⇒ tre variabili ai1x1 + ai2x2 + ai3x3 = bi identifica
un piano
si ha un unico vincolo: la regione ammissibile e' uno dei due semipiani in cui il piano
viene suddiviso
si hanno piu' vincoli: la regione ammissibile e' un poliedro non regolare, cioe' un solido
limitato e finito
si lavora nello spazio a n dimensioni ⇒ n variabili ai1x1 + ai2x2 + ... + ainxn ≤ bi identifica
un iperpiano
si ha un unico vincolo: la regione ammissibile e' un iperpiano
si hanno piu' vincoli: la regione ammissibile e' piu' un poliedro non regolare, questo perche'
puo' accadere che non sia limitata; in questo caso si parla di politopi, cioe' di intersezioni di
iperspazi che non e' detto siano limitate e finite

Si possono fare le seguenti considerazioni (si consideri di lavorare in due dimensioni):

1. Primo caso: soluzione ottima unica

la retta relativa alla funzione obiettivo va a cadere su un vertice della regione ammissibile Þ
si ha un'unica soluzione che massimizza la funzione obiettivo; e' il caso che e' stato trattato
in Ricerca della Soluzione Ottima.

11
2. Secondo caso: infinite soluzioni ottime

la retta relativa alla funzione obiettivo si posa su due vertici della regione ammissibile Þ si
hanno infinite soluzioni che massimizzano la Z: oltre ai due vertici, bisogna considerare
anche tutte le soluzioni che si trovano sulla retta che li collega.

3. Terzo caso: funzione obiettivo non limitata

il piano individuato dai vincoli non e' limitato e la funzione obiettivo si muove nella
direzione della regione ammissibile non limitata ⇒ non esiste soluzione ottima che
massimizzi la Z proprio perche' la funzione obiettivo non e' limitata.

4. Quarto caso: area ammissibile vuota

i vincoli non creano nessuna intersezione, hanno cioe' intersezione vuota ⇒ la regione
ammissibile e' vuota, quindi non possono esserci soluzioni ottime.

Il Metodo del Simplesso


Infinite Soluzioni Ottime

Consideriamo l'esempio

max x1 + x2 funzione obiettivo


5x1 + 10x2 ≤ 60 primo vincolo

4x1 + 4x2 ≤ 40 secondo vincolo

x1 , x2 ≥ 0

Dopo aver semplificato i vincoli, si ha:

x1 x2 x3 x4 -Z b
1 2 1 0 0 12 12/1 = 12
1 1 0 1 0 10 10/1 = 10
⇐ COSTI
1 1 0 0 1 0
RIDOTTI

x1 x2 x3 x4 -Z b
0 1 1 -1 0 2 2/1 = 1
1 1 0 1 0 10 10/1 = 10
⇐ COSTI
0 0 0 -1 1 -10
RIDOTTI

12
SOLUZIONE DI BASE
Variabile IN
x1 10
BASE
Variabile
x2 0
FUORI BASE
Variabile IN
x3 2
BASE
Variabile
x4 0
FUORI BASE
Funzione
Z 10
obiettivo

Quella trovata e' una soluzione ottima, in quanto tutti i costi ridotti sono nulli oppure negativi; lo 0
segnato in verde e' il costo ridotto nullo di una variabile fuori base: viene detto zero inatteso,
poiche', in genere, per le variabili fuori base, si trovano dei costi ridotti che sono diversi da 0; va
benissimo che ci sia uno 0, solamente che in una situazione normale ci si sarebbe aspettato un
valore negativo.

Per il metodo del simplesso, gli zeri inattesi indicano la presenza di soluzioni ottime multiple.

Vediamo cosa succede facendo entrare in base x2

x1 x2 x3 x4 -Z b
0 1 1 -1 0 2
1 0 -1 2 0 8
⇐ COSTI
0 0 0 -1 1 -10
RIDOTTI

SOLUZIONE DI BASE
Variabile IN
x1 8
BASE
Variabile IN
x2 2
BASE
Variabile
x3 0
FUORI BASE
Variabile
x4 0
FUORI BASE
Funzione
Z 10
obiettivo

Anche questa e' una soluzione ottima, infatti i costi ridotti sono nulli oppure negativi, ma, anche se
e' diversa dalla precedente, da' lo stesso valore per la funzione obiettivo.

13
Sono state trovate due soluzioni diverse, con lo stesso valore di Z: tutti i punti che si trovano sulla
retta che congiunge i vertici relativi alla due soluzioni, sono soluzioni ottime; si ricavano come
combinazione lineare delle due soluzioni trovate

SOLUZIONE
CONVESSA
x1 = α8 + (1 - α) 10
x2 = α2 + (1 - α) 0
0≤α≤1

Questo accade perche' la retta della funzione obiettivo e' parallela al secondo vincolo

Graficamente si ha:

Come si puo' notare, la funzione obiettivo coincide con uno dei due vincoli: tutti i valori compresi
tra il vertice B ed il vertice C saranno soluzioni ottime.

Funzione Obiettivo Non Limitata

Consideriamo l'esempio:

max x1 + x2 funzione obiettivo


-x1 + x2 ≤ 1 primo vincolo
x2 ≤ 5 secondo vincolo
x1 , x2 ≥ 0

14
Procedendo con il simplesso, si ottiene:

x1 x2 x3 x4 -Z b
-1 1 1 0 0 1 1/1 = 1
0 1 0 1 0 5 5/1 = 5
⇐ COSTI
1 1 0 0 1 0
RIDOTTI

x1 x2 x3 x4 -Z b
-1 1 1 0 0 1 -1/1 = -1
1 0 -1 1 0 4 4/1 = 4
⇐ COSTI
2 0 -1 0 1 -1
RIDOTTI

Ora deve entrare in base x1: e' un caso particolare, visto che uno dei suoi coefficienti ha valore
negativo

-x1 + x2 = 1 primo vincolo

x1 + x4 = 4 secondo vincolo

Se x1 aumenta nel primo vincolo, deve aumentare anche x2 per rispettare l'uguaglianza; x2 e' solo
inferiormente limitata dallo 0, ma non ha limitazioni superiori, quindi x1 puo' aumentare quanto
vuole, di conseguenza il primo vincolo non pone limiti alla crescita della funzione obiettivo e non
entra in qioco nella scelta del pivot: e' come se il primo vincolo non ci fosse

L'elemento pivot deve avere sempre coefficienti strettamente positivi, che siano quindi relativi
a vincoli limitati superiormente; se così non fosse, si verificherebbero soluzioni di base
negative e cio' non e' ammissibile.

x1 x2 x3 x4 -Z b
0 1 0 1 0 1
1 0 -1 1 0 4
⇐ COSTI
0 0 1 -2 1 -1
RIDOTTI

La soluzione ottenuta non e' ancora ottima, infatti c'e' qncora ujn costo ridotto non nullo: si fa
rientrare in base x3 (puo' accadere che una variabile, che precedentemente era uscita di base, vi
rientri); il fatto strano e' che nella colonna di x3 non ci sono termini da candidare al ruolo di pivot

Da quanto visto, si ricava che:

15
Z = 9 + x3 funzione obiettivo
x1 - x3 = 4 primo vincolo

x2 = 5 secondo vincolo

x1 , x2 ≥ 0

Z aumrnta all'aumentare di x3, ed x3 a sua volta puo' aumentare a piacere, in quanto per soddisfare
il primo vincolo basta che sia minore di x1, mentre il secondo non gli crea alcun problema;
graficamente si avra':

L'area ammissibile e' infinita e, di conseguenza, la funzione obiettivo non e' limitata: esistono
infinite soluzioni di base ma nessuna soluzione ottima.

Si puo' individuare una situazione di questo tipo direttamente dalle colonne della marice: una di
esse avra' costi ridotti positivi ed i rimenenti valori nulli oppure negativi; basta una colonna di
questo tipo per sapere che non esistono soluzioni ottime al problema.

Area Ammissibile Vuota

Consideriamo l'esempio:

max x1 + x2 funzione obiettivo


x1 - x2 ≤ 2 primo vincolo
x1 - x2 ≥ 3 secondo vincolo
x1 , x2 ≥ 0

Cerchiamo la forma canonica del problema:

16
x1 x2 x3 x4 -Z b
1 -1 1 0 0 2
1 -1 0 -1 0 3
⇐ COSTI
1 1 0 0 1 0
RIDOTTI

Anche standardizzando il problema, non si ottiene la forma canonica (per avere la matrice identica,
non dovrebbe esserci il -1 nella colonna relativa a x4); non si risolve nulla neanche moltiplicando la
seconda riga per -1 perche', così facendo, il termine noto diventa negativo e cio' non e' accettabile.

In una situazione di questo tipo non si sa se il sistema avra' soluzioni, infatti non avendo la forma
canonica, non si ha una soluzione ammissibile e non si sa neppure se esiste.

Vengono introdotte due nuove variabili x5 e x6, dette variabili artificiali, in modo che:

x1 - x2 + x3 + x5 = 2 con x1, x2, x3, x4 ≥ 0 e x5, x6 ≥ 0

x1 - x2 - x4 + x6 = 3

Il problema così ottenuto non e' piu' uguale a quello di partenza: solamente nel caso in cui x5, x6 =
0, i due problemi coincideranno.

Bisogna capire se esiste una soluzione ammissibile per il nuovo problema, con x1, x2, x3, x4 ≥ 0 e
x5, x6 = 0 : se la soluzione non esiste allora il problema di partenza non ha soluzione ammissibile.

E' necessario trovare una nuova funzione obiettivo al nuovo problema in modo da scporire se e'
possibile annullare contemporaneamente sia x5 che x6; la nuova funzione obiettivo artificiale
sara': min x5 + x6.

Una volta risolto il nuovo problema con la funzione obiettivo artificiale, se il minimo trovato e' pari
a zero, allora la soluzione trovata e' tale anche per il problema di partenza; se il minimo e' maggiore
di zero, per il problema di partenza non esiste soluzione;

x1 x2 x3 x4 x5 x6 -Z -W b
1 -1 1 0 1 0 0 0 2
1 -1 0 -1 0 1 0 0 3
⇐ COSTI
1 1 0 0 0 0 1 0 0
RIDOTTI Z
⇐ COSTI
0 0 0 0 1 1 0 1 0
RIDOTTI W

Non c'e' ancora la forma canonica; per ottenere la matrice identica, si sottrae all'ultima riga la
somma delle prime due:

17
x1 x2 x3 x4 x5 x6 -Z -W b
1 -1 1 0 1 0 0 0 2
1 -1 0 -1 0 1 0 0 3
⇐ COSTI
1 1 0 0 0 0 1 0 0
RIDOTTI Z
⇐ COSTI
-2 2 -1 1 0 0 0 1 0
RIDOTTI W

NB: questa e' la ricerca di un minimo, percio' bisogna fare entrare in base le variabili che
hanno costi ridotti negativi.

x1 x2 x3 x4 x5 x6 -Z -W b
1 -1 1 0 1 0 0 0 2
0 0 -1 -1 -1 1 0 0 1
⇐ COSTI
0 -2 -1 0 0 0 1 0 -2
RIDOTTI Z
⇐ COSTI
0 0 1 1 2 0 0 1 1
RIDOTTI W

Ora tutti i costi ridotti relativi a W sono nulli o maggiori di zero: non conviene farli entrare in base
perche' andrebbero ad aumentare il valore trovato per W, mentre quello che si sta cercando e' il suo
valore minimo; dal simplesso si ottiene:

W = 1 perciò min x5 + x6 = 1

Non e' possibile far andare x5 e x6 contemporaneamente a zero, percio' non esiste soluzione per il
problema di partenza: l'area ammissibile per il problema di partenza e' vuota.

Convergenza del Simplesso: Casi Degeneri

Consideriamo l'esempio:

max 6x1 + 8x2 funzione obiettivo


5x1 + 10x2 ≥ 60 primo vincolo
4x1 + 4x2 ≤ 40 secondo vincolo
x1 ≤ 10 terzo vincolo
x1 , x2 ≥ 0

Semplificando si ha:

18
max 6x1 + 8x2 funzione obiettivo

5x1 + 2x2 ≥ 12 primo vincolo

x1 + x2 ≤ 10 secondo vincolo

x1 ≤ 10 terzo vincolo

x1 , x2 ≥ 0

Il terzo vincolo e' ridondante, infatti, ponendo x2 = 0, il secondo vincolo e' identico al terzo;
vediamo cosa succede se si continua con il metodo del simplesso:

x1 x2 x3 x4 x5 -Z b
1 2 1 0 0 0 12 12/1 = 12
1 1 0 1 0 0 10 10/1 = 10
1 1 0 0 1 0 10 10/1 = 10
⇐ COSTI
6 8 0 0 0 1 0
RIDOTTI

Per il pivot, si puo' sciegliere indifferentemente la seconda o la terza riga; consideriamo la terza:

x1 x2 x3 x4 x5 -Z b
0 2 1 0 -1 0 2 2/2 = 1
0 1 0 1 -1 0 0 0/1 = 0
1 0 0 0 1 0 10 10/1 = 10
⇐ COSTI
0 8 0 0 -6 1 -60
RIDOTTI

La soluzione di base relativa alla matrice trovata sara':

SOLUZIONE DI BASE
Variabile IN
x1 10
BASE
Variabile IN
x2 0
BASE
Variabile IN
x3 2
BASE
Variabile
x4 0
FUORI BASE
Variabile
x5 0
FUORI BASE
Z 60 Funzione

19
obiettivo

La variabile x2 ha per termine noto uno zero, pur essendo in base: e' uno zero inatteso; siamo di
frone ad un caso degenere.

x1 x2 x3 x4 x5 -Z b
0 0 1 -2 1 0 2 2/2 = 1
0 1 0 1 -1 0 0 0/-1 = 0
1 0 0 0 1 0 10 10/1 = 10
⇐ COSTI
0 0 0 -8 2 1 -60
RIDOTTI

La soluzione di base e' identica alla precedente, a causa dello zero inatteso: x2 entra in base e prende
come termine noto proprio lo zero inatteso; lo zero inatteso fa sì che venga scelta sempre la riga
dove e' comparso come riga del pivot, in questo modo lo zero riappare dopo ogni iterazione

L'apparizione di uno zero inatteso tra i termini noti mette in discussione la convergenza del metodo
del simplesso:

in casi normali, quando cioe' non si e' in presenza di zeri inattesi, il simplesso e' tale da fer
migliorare il valore della funzione obiettivo dopo ogni iterazione: si esplorano tutte le soluzioni
di base possibili (che possono essere moltepoici ma in numero finito) e non si ripresenta mai
una soluzione trovata in precedenza ⇒ il simplesso converge
in casi degeneri, quando cioe' si hanno zeri inattesi, una forma canonica trovata
precedentemente si ripresenta dopo varie iterazioni e, quando cio' avviene, l'algoritmo inizia a
ciclare attormo ad essa proponendo sempre il medesimo valore per la funzione obiettivo; in
questo modo la funzione obiettivo mantiene costante il suo valore e non e' piu' possibile
arrivare alla soluzione ottima in un numero finito di passi ⇒ il simplesso non converge

Il presupposto per il verificarsi del caso degenere e' la comparsa di due valori uguali, nella colonna
dei termini noti, per la scelta del pivot; questa situazione si verifica frequentemente quando si lavora
con problemi che hanno dimensione elevata. Graficamente si ha:

20
Le soluzioni di base coincidono con i vertici dell'area ammissibile, che sono il risultato
dell'intersezione dei vincoli; nel vertice C, convergono ben te vincoli ed e' proprio questa
particolarita' a rendere il simplesso ciclico: C puo' essere espresso attraverso una qualunque coppia
dei tre vincoli, percio' puo capitare che il simplesso rimanga a ciclare sullo stesso punto, descritto in
tre modi diversi

Quando si inizia a ciclare, il caso e' sicuramente degenere, ma si possono verificare dei casi in cui,
anche se degeneri, il ciclo non si manifesta; ritornando all'esempio, si ha:

x1 x2 x3 x4 x5 -Z b
0 0 1 -2 1 0 2 2/2 = 1
0 1 0 1 -1 0 0 0/-1 = 0
1 0 0 0 1 0 10 10/1 = 10
⇐ COSTI
0 0 0 -8 2 1 -60
RIDOTTI

Si fa entrare x5 in base e si sceglie come pivot la prima riga (la seconda avrebbe pivot negativo e
non e' ammissibile); si ottiene:

x1 x2 x3 x4 x5 -Z b
0 0 1 -2 1 0 2
0 1 1 -1 0 0 2
1 0 1 2 0 0 8
Ü COSTI
0 0 -2 -4 0 1 -64
RIDOTTI

Ora la soluzione di base e' diversa dalla precedente e non si e' manifestato lo zero inatteso; inoltre
quella trovata e' la soluzione ottima (tutti costi ridotti nulli o negativi):

SOLUZIONE OTTIMA
Variabile IN
x1 8
BASE
Variabile IN
x2 2
BASE
Variabile
x3 2
FUORI BASE
Variabile
x4 0
FUORI BASE
Variabile IN
x5 2
BASE
Funzione
Z -64
obiettivo

In questo caso il caso degenere si e' risolto da solo ed e' cio' che accade nella maggior parte dei casi;
i problemi di programmazione lineare che ciclano non si verificano praticamente mai.
21
Esistono due metodi per evitare che il sistema inizi a ciclare attorno ad una forma canonica:

Primo metodo:

Si perturbano lievemente tutti i termini noti con valori diversi tra loro: in questo miodo la tripla
intersezione non e' piu' tale e si trasforma in tre combinazioni diverse di due vincoli ciascuna;
non si aggiunge la stessa quantita' ai vincoli per evitare che l'intersezione tripla si verifichi in un
altro punto del piano; il problema diventa:

PROBLEMA PERTURBATO

max 6x1 + 8x2 funzione obiettivo

5x1 + 10x2 ≤ 60 + ε primo vincolo

4x1 + 4x2 £ 40 + ε² secondo vincolo

x1 £ 10 + ε³ terzo vincolo

x1 , x2 ≥ 0 , ε > 0

Secondo metodo: Regola di Blade

Quando ci si trova di fronte ad una incertezza, non si sa cioe' quale riga (due termini noti sono
uguali) o quale colonna (due costi ridotti sono uguali) scegliere per il pivot, basta scegliere la
riga o la colonna con l'indice piu' basso; si puo' dimostrare che questo e' sufficiente ad evitare il
ciclo

Programmazione Lineare
Dualita'
Problema Primale e Problema Duale

Dato un problema di programmazione lineare, si ricavano due tablot fondamentali: il tablot di


partenza, relativo alla forma canonica iniziale, ed il tablot ottimo, relativo alla soluzione ottima

max 6x1 + 8x2 funzione obiettivo


5x1 + 10x2 ≤ 60 primo vincolo
4x1 + 4x2 ≤ 40 secondo vincolo
x1 , x2 ≥ 0

22
TABLOT DI PARTENZA
x1 x1 x3 x4 -Z b
5 0 1 0 0 60 k1
4 4 0 1 0 40 k2
6 8 0 0 1 0 k3

TABLOT OTTIMO
x1 x1 x3 x4 -Z b
0 1 1/5 -1/4 0 2
1 0 -1/5 1/2 0 8
⇐ COSTI
0 0 -2/5 -1 1 -64
RIDOTTI

Il tablot ottimo si ottiene applicando alle righe del tablot di partenza solamente delle combinazioni
lineari; le righe del tablot ottimo sono combinazioni lineari delle righe del tablot di partenza

L'ultima riga del tablot ottimo e' interessante perche'indica le variabili in base, quelle fuori base ed
il valore ottimo della funzione obiettivo; inoltre, e' data dalla combinazione lineare delle righe del
tablot di partenza con coefficienti k1, k2, k3

Se si riuscissero a determinare i valori dei coefficienti k1, k2, k3, si otterrebbe subito la matrice
ottima, saltando così tutti i passaggi; vediamo se e' possibile utilizzare le informazioni ricavate dalla
riga dei costi ridotti del tablot ottimo:

1. i costi ridotti sono nulli oppure negativi, quindi avremo disequazioni ≤ 0;


2. tutti i coefficienti sono positivi, percio' necessariamente avremo k1, k2 ≤ 0, mentre k3 = 1 in
quanto sulla riga dei costi ridotti, in corrispondenza della colonna della -Z, deve sempre
esserci un 1.
3. basta considerare le prime tre colonne.

Le disequazioni saranno:

DISEQUAZIONI
5 k1 + 4k2 + 6k3 ≤ 0 I colonna tab partenza
10 k1 + 4k2 + 8k3 ≤ 0 II colonna tab partenza
1 k1 + 0k2 + 0k3 ≤ 0 III colonna tab partenza
k1, k2 ≤ 0, k3 = 1

Ponendo y1 = - k1 ≥ 0, y2 = - k2 ≥ 0 e sostituendo nelle equazioni, si ottiene un nuovo


problema:

23
NUOVO PROBLEMA

min 60y1 + 40y2 funzione obiettivo

5y1 + 4y2 ≥ 6 primo vincolo

10y1 + 4y2 ≥ 8 secondo vincolo

y1 ,y2 ≥ 0

La matrice dei coefficienti e' la trasposta della matrice dei coefficienti del problema iniziale; i
termini noti sono i coefficienti della funzione obiettivo e, per la nuova funzione obiettivo, sono stati
presi gli unici coefficienti che mancavano, cioe' quelli relativi ai termini noti del sistema iniziale.

problema di partenza ⇒ problema primale: e' un problema di massimo, che ha per vincoli
disequazioni di ≤.

nuovo problema ⇒ problema duale: e' un problema di minimo, che ha per vincoli disequazioni di
≥; inoltre la matrice dei coefficienti e' la trasposta della matrice dei coefficienti del problema
primale.

PROBLEMA PRIMALE PROBLEMA


DUALE
funzione funzione
max 6x1 + 8x2 obiettivo
min 60y1 + 40y2 obiettivo
5x1 + 10x2 ≤ 60 primo vincolo 5y1 + 4y2 ≥ 6 primo vincolo
secondo secondo
4x1 + 4x2 ≤ 40 10y1 + 4y2 ≥ 8
vincolo vincolo
x1 , x2 ≥ 0 y1 , y2 ≥ 0

Ogni problema di programmazione lineare ha il proprio problema duale.

Consideriamo il problema duale: moltiplicando vincoli e funzione di minimo per -1, si ottiene un
problema primale con vincoli di £ e una funzione obiettivo di massimo:

DUALE e NUOVO PRIMALE


funzione -max (-60y1 - funzione
min 60y1 + 40y2 obiettivo obiettivo
40y2)
5y1 + 4y2 ≥ 6 primo vincolo -5y1 - 4y2 ≤ -6 primo vincolo
secondo secondo
10y1 + 4y2 ≥ 8
vincolo -10y1 - 4ψ2≤ -8 vincolo
y1 , y2 ≥ 0 y1 , y2 ≥ 0

24
E' possibile determinare il duale del primale appena trovato, ponendo z1 = - y1 ≥ 0, z2 = - y2 ≥
0 ; si ottiene un problema che e' il duale del duale e che coincide esattamente con il problema di
partenza: il duale del duale e' il problema di partenza:

DUALE del DUALE e PRIMALE di PARTENZA


funzione funzione
min (-6z1 - 8z2) obiettivo
max 6x1 + 8x2
obiettivo
-5z1 - 10z2 ≥ -60 primo vincolo 5x1 + 10x2 ≤ 60 primo vincolo
secondo secondo
-4z1 - 4z2 ≥ -40 4x1 + 4x2 ≤ 40
vincolo vincolo
z1 , z2 ≥ 0 x1 , x2 ≥ 0

Una volta trovato il tablot ottimo del primale, si determinano facilmente i valori di y1 e y2 ottimi
del duale: basta prendere, dalla soluzione ottima primale, i costi ridotti che corrispondono alle
variabili che si trovavano in base nel tablot di partenza.

Tab primale partenza Duale ottimo


k1 = -2/5 y1 = - k1 = 2/5
k2 = -1 y2 = - k2 = 1

Sostituendo nella funzione obiettivo duale, si ottiene:

-max (-60y1 - 40y2) ⇒ 60y1 + 40y2 = 2/5 * 60 + 1 * 40 = 64

dove 64 e' il valore dell'ottimo della funzione duale.

In base a quanto visto, esiste una completa simmetria tra primale e duale: basta invertire tutto quello
che vale per un problema e si hanno i dati necessari per l'altro; sotto questo punto di vista, risulta
quindi indifferente quale e' il primale e quale il duale, basta sapere che uno e' l'inverso dell'altro.

Teorema di Dualità Deole


Teorema di Dualità Forte
Teorema di Complementarietà
Condizione Necessaria e Sufficiente

Teorema di Dualita' Debole

In generale si ha:

Primale Duale
funzione min ( by ) =
max ( cx ) = Z obiettivo W
Ax ≤ b vincoli yA ≥ c
x ≥0 variabili y≥0

25
con x soluzione ammissibile del primale e y soluzione ammissibile del duale.

Moltiplicando i vincoli del primale e del duale rispettivamente per y e x, si ottiene:

Primale Duale
Ax ≤ b yA ≥ c
y moltiplico per x
yAx ≤ by si ottiene yAx ≥ cx

si consideri
max ( cx ) = Z ⇒ cx = Z
min ( by ) =
⇒ by = W
W
quindi
Z = cx cx ≤ yAx
yAx ≤ by by = W

Prese una soluzione ammissibile x per il primale ed una soluzione ammissibile y per il duale, il
valore ammissibile per il primale (in particolare il suo valore ottimo) non sara' mai superiore a
qualsiasi valore ammissibile del duale:

Z = cx ≤ yAx≤ by = W

Il valore ottimo del primale funge quindi da limitazione inferiore ai valori ammissibili del duale,
mentre il valore ottimo del duale rappresenta un limitazione superiore ai valori ammissibili del
primale.

Teorema di Dualita' Forte

Se il primale ed il duale hanno entrambi soluzioni ammissibili limitate, allora entrambi ammettono
soluzione ottime ed i valori delle funzioni ottime coincidono:

Z =W

Se entrambi i problemi hanno soluzione ottima, allora Z ≤ W per il teorema di dualita' debole ⇒ la
funzione obiettivo del duale ha soluzione ottima ⇒ la funzione obiettivo e' finita ⇒
necessariamente la funzione obiettivo del primale e' limitata ⇒ esistono una o piu' soluzioni
amissibili per il primale ⇒ si hanno una o piu' soluzioni ammissibili per entrambi i problemi

Si dimostra che le soluzioni ottime sono uniche e che i valori ottimi delle funzioni obiettivo
coincidono.

26
Teorema di Complementarieta'

Parte dal problema di dualita' forte:

se x* e' soluzione ottima del primale e y* e' soluzione ottima del duale, allora x = y per il teorema
della dualita' forte, da cui

Z = cx* = y*Ax* = by* = W

percio' la disequazione si trasforma in un'equazione, dalla quale si esplicitano le sequenti equazioni:

(c -
cx* = y*Ax* ⇒ ( c - y*A ) x* = 0 ⇒ y*A)=0,
x*=0
y*=0,
y*Ax* = by* ⇒ y* ( Ax* - b) = 0 ⇒ (Ax* -
b)=0

Vengono dette condizioni di complementarita' e sono entrambe prodotti scalari; analizzimo la


seconda: esplicitando il prodotto scalare, si ha:

con i=1,.. , m e j=1,..


∑i yi* (∑j aij xj* - bi) = 0 ,n
con si* = åj aij xj* -
yi* · si* = 0 per ogni i
bi
se si* ≠ 0 ⇒ yi* = 0
se yi* ≠ 0 ⇒ si* = 0

Discorso analogo si puo' fare per la prima equazione.

Condizione Necessaria e Sufficiente

Le condizioni di complementarita' sono condizioni necessarie e sufficienti per le soluzioni ottime


del primale e del duale:
se x e y sono condizioni ammissibili per primale e duale e se soddisfano le condizioni di
complementarieta', allora x e y sono soluzioni ottime per primale e duale ed inoltre x=y
se x e y sono soluzioni ottime per primale e duale e x = y, allora x e y sono condizioni
ammissibili per primale e duale ed inoltre soddisfano le condizioni di complementarieta'

Si possono avere nove combinazioni diverse tra le tipologie di soluzioni del primale e del duale, ma
solamente quattro di queste sono casi che si possono realmente verificare:

Ottima: il primale (duale) ammette soluzione ottima


Non Limitata: la funzione obiettivo del primale (duale) non e' limitata Z = ∞ (W = ∞)
Non Ammissibile: il primale (duale) non ha soluzioni ammissibili

27
Primale / Non
Ottima Non Limitata
Duale ammissibile
Ottima Z =W NO NO
Non Limitata NO NO SI
Non
NO SI SI
ammissibile

Casella Ottima/Ottima: vale in base alla condizione necessaria e sufficiente vista per le condizioni
di complementarieta'

Casella Non Limitata/Ottima: se la funzione obiettivo del primale non e' limitata (Z = ∞), cade il
teorema di dualita' debole (Z ≤ W per ogni soluzione ammissibile), di conseguenza il problema
duale non e' ammissibile e non piuo' avere, quindi, soluzione ottima

Casella Non Limitata/Non Limitata: se la funzione obiettivo del primale non e' limitata (Z = ∞),
cade il teorema di dualita' debole (Z ≤ W per ogni soluzione ammissibile), di conseguenza il
problema duale non e' ammissibile

Il Metodo del Simplesso Duale

Quando si e' di fronte ad un problema di programmazione lineare, e' indifferente risolvere il


problema oppure il suo duale applicando il metodo del simplesso; ad esempio

Primale Duale
funzione max ( by ) =
min ( cx ) = Z obiettivo W
Ax ≥ b vincoli yA ≤ c
x≥0 variabili y≤0

La matrice A primale e' una matrice nxm; di conseguenza, la matrice relativa alla forma canonica
del primale sara' A|-I|I di dimensione nx(m+n+n) dove I e' la matrice identica nxn mentre -I e' la
matrice identica con tutti -1 sulla diagonale principale in modo che le disuguaglianze nei vincoli
cambino da ≥ a ≤.

La matrice A duale e' una matrice mxn; di conseguenza, la matrice relativa alla forma canonica del
primale sara' A|I di dimensione mx(n+m) dove I e' la matrice identica mxm; ora non serve piu' la
matrice -I in quanto si hanno gia' vincoli di ≤.

Lavorando con il problema duale si ha a che fare con matrici di dimensioni minori.

Esiste un metodo del simplesso specifico per i problemi duali; questo metodo si differenzia da
quello visto fino ad ora solamente per le regole della scelta del pivot, che sono il "duale" delle
regole viste nel caso primale.

28
Vediamo un esempio:

Primale Duale
max 6y1 + 8y2 funzione min 60x1 +
obiettivo 40x2
5y1 + 10y2 ≤ 60 primo vincolo 5x1 + 4x2 ≥ 6
4y1 + 4y2 ≤ 40 secondo vincolo 10x1 + 4x2 ≥ 8
y1 , y2 ≥ 0 x1 , x2 ≥ 0

Cambiando i segni alle equazioni dei vincoli in modo da ottenere dei £, i termini noti diventano
negativi:

x1 x2 x3 x4 -Z b
-5 -4 1 0 0 -6
-10 -4 0 1 0 -8
⇐ COSTI
60 40 0 0 1 0
RIDOTTI

I costi ridotti sono tutti positivi o nulli, e questo va bene perche' si tratta di un problema di minimo,
quindi la condizione di ottimalita' viene soddisfatta; i termini noti sono tutti negativi percio' viene a
cadere la condizione di ammissibilita'.

Le condizioni duali saranno:

costi ridotti ≥ 0 ⇒ viene soddisfatta l'ottimalita'


termini noti ≤ 0 ⇒ non viene soddisfatta l'ammissibilita'

Per quanto riguarda la scelta del pivot, si determina prima la riga e poi la colonna: la riga sara'
quella con il termine noto minore (in valore assoluto tra i termini negativi), mentre per la colonna, si
dividera' il valore della riga per il rispettivo valore del costo ridotto e si scegliera' la colonna che
avra' il risultato minore (i rapporti vengono considerati in valore assoluto); inoltre, il pivot deve
essere strettamente negativo: in questo modo, dividendo la riga del pivot per il pivot stesso, il
termine noto diventa positivo, proprio cio' che si voleva.

x1 x2 x3 x4 -Z b
-5 -4 1 0 0 -6 riga del pivot
-10 -4 0 1 0 -8
⇐ COSTI
60 40 0 0 1 0
RIDOTTI
60/5=12 40/4=10

Si ha : x1 = x2 = 0 e Z = 0 il costo quindi e' nullo; proseguendo nei calcoli:

29
x1 x2 x3 x4 -Z b
5/4 1 -1/4 0 0 3/2
-5 0 -1 1 0 -2 riga del pivot
10 0 10 0 1 -60 ⇐ COSTI RIDOTTI
10/5=2 10/1=10

Il costo e' aumentato perche' Z e' passato da 0 a 60: e' necessario "pagare" per guadagnare
l'ammissibilita'; si prosegue con una nuova iterazione in quanto appare ancora un termine noto
negativo:

x1 x2 x3 x4 -Z b
0 1 -1/2 1/4 0 1
1 0 1/5 -1/5 0 2/5
0 0 8 2 1 -64 ⇐ COSTI RIDOTTI

Questa e' la soluzione ottima, in quanto i termini noti sono tutti positivi (a parte ovviamente quello
relativo al valore della funzione obiettivo) ed i costi ridotti sono tutti positivi o nulli.

SOLUZIONE OTTIMA
DUALE
Variabile IN
x1 2/5
BASE
Variabile IN
x2 1
BASE
Variabile
x3 0
FUORI BASE
Variabile
x4 0
FUORI BASE
Funzione
Z 60
obiettivo

Graficamente si ha:

30
Il punto di partenza e' l'origine O che pero' viole entrambi i vincoli; con la prima iterazione, ci si
sposta nel punto A, dove viene soddisfatto il secondo vincolo ed il costo aumenta (Z = 60); con la
terza iterazione si arriva in B: la soluzione e' quella ottima in quanto entrambi i vincoli sono
soddisfatti, ma i costi sono ulteriormente aumentati.

punto di nessun vincolo


O partenza
x1 = x2 = 0 e Z = 0 soddisfatto
x1 = 0 , x2 = 2/5 e Z = soddisfatto primo
A prima iterazione
vincolo
0
seconda x1 = 2/5 , x2 = 1 e Z = soddisfatti entrambi
B iterazione 64

NB Il simplesso duale considera i vertici impropri, quelli ottenuti cioe' dalle intersezioni dei
prolungamenti delle rette relative ai vincoli.

Postottimalita'
Primo Caso: Variazione delle Risorse
Secondo
Introduzione di un Nuovo Prodotto
Caso:
Terzo Caso: Variazione di un Coefficiente della Funzione Obiettivo
Quarto
Aggiunta di un Vincolo
Caso:

Raramente, il lavoro di risoluzione di un problema di programmazione lineare, termina con la


determinazione della soluzione ottima; spesso i valori a disposizione non sono noti con cetrezza,
sono solo approssimativi, di conseguenza risulta opportuno valutare cosa accade alla soluzione
ottima se alcuni dei valori utilizzati per determinarla subiscono delle variazioni.

Si tratta di valutare la sensibilita' del valore ottimo della funzione obiettivo, in base alla variazione
di alcuni parametri del modello, ai quali si dovra' prestare particolare attenzione nel caso in cui le
variazioni dell'ottimo risultassero estremamente significative; bisognera' quindi scegliere una
soluzione per la funzione obiettivo in modo tale che sia stabile, per il maggior range possibile di
valori verosimili dei parametri.

Per effettuare queste valutazioni, non e' necessario ripetere dall'inizio tutti i passi risolutivi; si parte
direttamente dalla soluzione ottima trovata e, insieme al sistema di eqazioni che l'ha generata, si
riesce solitamente a stabilire se l'ottimo e' ancora tale dopo le variazioni; in caso negativo fungera'
da punto di partenza per determinare la nuova soluzione ottima. Consideriamo l'esempio:

max 6x1 + 8x2 funzione obiettivo

5x1 + 10x2 ≤ 60 primo vincolo

4x1 + 4x2 ≤ 40 secondo vincolo

31
x1 , x2 ≥ 0

TABLOT DI PARTENZA
x1 x2 x3 x4 -Z b
5 10 1 0 0 60
4 4 0 1 0 40
⇐ COSTI
6 8 0 0 1 0
RIDOTTI

TABLOT OTTIMO
x1 x2 x3 x4 -Z b
0 1 1/5 -1/4 0 2
1 0 -1/5 1/2 0 8
⇐ COSTI
0 0 -2/5 -1 1 -64
RIDOTTI

Primo caso: variazione delle risorse

Si vuole determinare cosa accade alla soluzione ottima, nel caso in cui ci sia una variazione nelle
ore macchima del primo macchinario (60 + δ); ricordando che, i costi ridotti delle variabili fuori
base del primale coincidono con i valori della soluzione ottima del duale, cambiati di segno, si ha:

VARIAZIONE SUI COSTI


−Z
-2/5 x 60 - 1 x 40 + 1 x 0 = -
64
-2/5 x ( 60 + δ ) - 1 x 40 + 1 x 0
= - 64 - 2/5 δ
⇒ −Z = - 64 - 0.4 δ

quindi l'effetto del fattore δ, e' quello di aggiungere all' ottimo una quantita' pari a 0.4 δ; i costi
variano di una quantita' pari al 40% della variazione della prima risorsa.

La perturbazione si propaga anche agli altri termini:

32
VARIAZIONE SUL MIX DI PRODUZIONE
x1 x2
- 1/5 x 60 + 1/2 x 40 = 8 1/5 x 60 - 1/4 x 40 = 2
- 1/5 x ( 60 + δ ) + 1/2 x 40 = 8 1/5 x ( 60 + δ ) - 1/4 x 40 = 2 +
- 0.2 δ 0.2 δ
⇒ x1 = 8 - 0.2 δ ⇒ x2 = 2 + 0.2 δ

E' solo un caso che le variazioni nelle variabili siano uguali e di segno opposto; x1 e' il prodotto con
il profitto migliore, di conseguenza e' ragionevole che, in presenza di una variazione di costi, venga
intaccata la produzione di x2 a favore di quella di x1; - 0.2 δ rappresenta una variazione di costo che,
essendo negativa, influisce positivamente su x1; per + 0.2 δ, il discorso e' lo stesso, solo che in
questo caso la variazione di costo e' positiva e va ad incidere negativamente su x2

I problemi sorgono quando la variazione fa cambiare il segno di uno o piu' termini noti:

se -10 ≤ δ ≤ 40, le variabili rimangono positive

se, ad esempio, δ = -20 (il numero di ore di lavoro sulla macchina a scende da 60 a 40) si ha:

x1 = 8 - 0.2 δ =
12
x2 = 2 + 0.2 d = -
2
−Z = - 64 - 0.4 δ
= - 56

L'ammissibilita' non e' soddisfatta in quanto appare un termine noto negativo, mentre l'ottimalita'
rimane soddisfatta visto che tutti i costi ridotti sono nulli o negativi; vediamo la situazione della
matrice:

x1 x2 x3 x4 -Z b
0 1 1/5 -1/4 0 -2
1 0 -1/5 1/2 0 12
⇐ COSTI
0 0 -2/5 -1 1 -56
RIDOTTI

x1 x2 x3 x4 -Z b
0 -4 -4/5 1 0 8
1 2 1/5 0 0 8
⇐ COSTI
0 -4 -6/5 0 1 -48
RIDOTTI

33
Facendo entrare un base x4, si soddisfa sia l'ammissibilita' che l'ottimalita': i termini noti sono tutti
positivi ed i costi ridotti sono tutti nulli o negativi.

Le 40 ore di lavoro sulla macchina A vengono utilizzate completamente, mentre sulla macchina B
vengono utilizzate solamente 32 ore di lavoro: le 8 rimanenti rimangono inutilizzate per poter
garantire l'ammissibilità; l'ammissibilità "costa" 8 ore di lavoro sulla macchina B.

Consideriamo nuovamente la situazione generica con una variazione pari a δ:

x1 x2 x3 x4 -Z b
0 1 1/5 -1/4 0 2 + 0.2 δ
1 0 -1/5 1/2 0 8 - 0.2 δ
- 64 - 0.4 ⇐ COSTI
0 0 -2/5 -1 1
δ RIDOTTI

Poste pari a y1* e y2* le variabili duali relative alla soluzione ottima, si ha:

y1* = 2/5 = 0.4 rapperesenta il valore che si attribuisce ad una unita' in piu' della prima risorsa: e'
l'aumento di profitto per 1 ora di lavoro in piu' sulla macchina A; si e' disposti a pagare non piu' di
40 centesimi per 1 ora di lavoro in piu' sulla macchina A.

y2* = 1 rappresenta il valore che si attribuisce ad una unita' in piu' della seconda risorsa: e'
l'aumento di profitto per 1 ora di lavoro in piu' sulla macchina B; il valore e' maggiore rispetto a
quello relativo alla macchina A, quindi e' piu' conveniente lavorare sulla macchina A che non sulla
B.

Secondo caso: introduzione di un nuovo prodotto

Riferendoci sempre all'esempio precedente, valutiamo se e' o meno conveniente far entrare in
produzione un terzo prodotto, per cui:

TABLOT DI PARTENZA
xnew x1 x2 x3 x4 -Z b
6 5 10 1 0 0 60
8 4 4 0 1 0 40
⇐ COSTI
10 6 8 0 0 1 0
RIDOTTI

Scegliendo gli stessi pivot ed effettuando le stesse operazioni fatte in precedenza, si ha:

xnew x1 x2 x3 x4 -Z b
? 0 1 1/5 -1/4 0 2
? 0 0 -1/5 1/2 0 8
⇐ COSTI
? 1 0 -2/5 -1 1 -64
RIDOTTI

34
Si definiscono moltiplicatori quei valori della riga dei costi ridotti corrispondenti alle varibili che
erano in base nel tablot di partenza; una volta determinati i moltiplicatori, si ricavano i valori ?
incogniti:

- 2/5 x 6 - 1 x 8 + 1 x 10 = - 0.4 questo e' il costo ridotto relativo a xnew: e' fuori base, pertanto
non conviene produrlo perche' consuma troppe risorse rispetto al profitto che può dare (consuma
ben 6 ore sulla macchina A e 8 ore sullla B).

Valutiamo di quanto deve variare il coefficiente di costo 10, in modo che sia conveniente iniziare a
produrre il nuovo prodotto xnew:

TABLOT DI PARTENZA
xnew x1 x2 x3 x4 -Z b
6 5 10 1 0 0 60
8 4 4 0 1 0 40
⇐ COSTI
10+δ 6 8 0 0 1 0
RIDOTTI

- 2/5 x 6 - 1 x 8 + 1 x (10 + δ) = - 0.4 + δ

se δ = 0.4 si ottiene uno zero inatteso come costo ridotto per xnew: cio' significa che non ci sono
costi aggiuntivi per fare entrare in base (e quindi in produzione) il nuovo prodotto.

se δ = 0.4 si ottiene un costo ridotto positivo per xnew: risulta addirittura conveniente iniziare a
produrre xnew, che entra in base facendo uscire uno dei due vecchi prodotti, meno conveniente.

Terzo caso: variazione di un coefficiente della funzione obiettivo (costo ridotto)

Modifichiamo il tablot dell'esempio precedente, andando a variare il costo ridotto del prodotto:

TABLOT DI PARTENZA
x1 x2 x3 x4 -Z b
5 10 1 0 0 60
4 4 0 1 0 40
⇐ COSTI
6+δ 8 0 0 1 0
RIDOTTI

x1
-2/5 x 5 - 1 x 4 + 1 x 6 = 0
-2/5 x 5 - 1 x 4 + 1 x ( 6 + δ ) =
0+δ
⇒ x1 = 0 + δ

35
x1 x2 x3 x4 -Z b
0 1 1/5 -1/2 0 2
1 0 -1/5 1/2 0 8
⇐ COSTI
0+δ 0 -2/5 -1 1 -64
RIDOTTI

Effettiando nuovamente tutti i passaggi, la colonna relativa a x1 non fa piu' parte della matrice
identica, a causa della presenza di δ nel costo ridotto; bisogna necessariamente normalizzare (alla
terza riga sottraggo la seconda moltiplicata per δ), ottenendo:

x1 x2 x3 x4 -Z b
0 1 1/5 -1/2 0 2
1 0 -1/5 1/2 0 8
1/5(δ- -1- -64- ⇐ COSTI
0 0 1
2) δ/2 8δ RIDOTTI

Per ottenere la matrice canonica, si e' dovuto propagare l'effetto della variazione ai costi ridotti delle
altre colonne; e' stato influenzato anche il valore della funzione obiettivo:

−Z
-2/5 x 60 - 1 x 40 + 1 x 0 = -
64
1/5(δ-2) x 60 + (-1-δ/2) x 40 +
1 x 0 = - 64 - 8δ
⇒ −Z = - 64 - 8δ

Ora i costi ridotti continuano ad essere negativi solamente per valori di δ tali che:

costi ridotti negativi se


δ-2≤0 ⇒δ≤2
-1 - δ/2 ≤ 0 ⇒ δ ≥ - 2
⇒ -2 ≤ δ ≤ 2

36
Graficamente si ha:

Iterando con il simplesso,


fuori dall'intervallo [ -2, 2 ]
i valori della funzione
obiettivo saranno maggiori
di quelli ottenuti prima
della variazione; inoltre,
uno dei costi ridotti sara'
positivo, quindi si avra'
convenienza a far entrare in
base la rispettiva variabile e
a far uscire di base, e
percio' di produzione, una
delle due che vi si
trovavano); il grafico della
funzione obiettivo,
espresso in funzione di δ, e'
una funzione convessa: la
curva si trova sempre sopra la tangente in qualsiasi punto della curva stessa

Quarto caso: aggiunta di un vincolo Aggiungiamo un nuovo vincolo all'esempio; il nuovo


vincolo sarà: 8x1 + 4x2 ≤ 40

TABLOT DI PARTENZA
x1 x2 x3 x4 x5 -Z b
5 10 1 0 0 0 60
4 4 0 1 0 0 40
8 4 0 0 1 0 40
⇐ COSTI
6 8 0 0 0 1 0
RIDOTTI
TABLOT OTTIMO
x1 x2 x3 x4 x5 -Z b
0 0 4/5 -2 1 0 -32
0 1 1/5 -1/2 0 0 2
1 0 -1/5 1/2 0 0 8
⇐ COSTI
0 0 -2/5 -1 0 1 -64
RIDOTTI

Servono altre 32 unita' (oltre alle 40 previste) per continuare a produrre; x5 esce di base perche'
sono state sfruttate tutte le 40 unita' mentre x4 entra in base a causa di un eccesso di risorse: questi
due fattori fanno sì che il profitto cali.

37
Problemi di Trasporto ed Assegnazione
Introduzione
Il problema del trasporto prende questo nome dal contesto nel quale è stato sviluppato ovvero la
determinazione di modelli ottimali per la destinazione delle risorse. Il modello matematico che se
ne ricava, grazie alla sua semplicità ed efficienza, viene adattato, inoltre, a molti problemi che poco
hanno a che vedere con il problema del trasporto stesso. In particolare vedremo l'applicazione di
quanto detto al problema di assegnazione.

Nelle pagine che seguiranno vedremo il modello generale per la soluzione del problema del
trasporto e una breve valutazione sulla ammissibilita` delle soluzioni di base. Segue una descrizione
dei metodi risolutivi; per concludere una applicazione particolare, il problema di assegnazione.

Modelli
Il problema del trasporto consiste nello stabilire la distribuzione ottimale, tra i vari punti vendita,
del materiale richiesto, disponibile in quantità limitata nei centri di produzione; sono note le
previsioni di produzione per l'anno successivo di ciascun centro, le previsioni di vendita per l'anno
in corso di ciascun punto vendita ed i costi di trasporto.

L'ottimo dovrà essere stabilito tenendo presente che:

non bisogna andare sotto le previsioni di vendita di ciascun punto


vendita
non si possono superare le disponibilità dei centri di produzione

Siano: ai le disponibilità dei centri di produzione


bj le richieste dei punti vendita

Si possono verificare tre casi:

∑ ai = ∑
il problema è equilibrato.
bj
∑ ai < ∑
le richieste non possono essere soddisfatte e il problema non ha soluzione.
bj
∑ ai > ∑ si introduce una destinazione fittizia, che richiede (å ai - å bj), in cui si trasporterà la
bj merce in eccesso gratuitamente.

Studiando la situazione di equilibrio, non si perde in generalità.

Supponiamo di avere m fabbriche che riforniscono n magazzini. La fabbrica i (i-esima) produce ai


unita` mentre il magazzino j (j-esimo) richiede bj unita`. Supponiamo inoltre che il costo di
spedizione dalla fabbrica i al magazzino j sia direttamente proporzionale alle quantita` trasportate

38
ed il costo unitario sia cij. Scegliamo come variabili decisionali xij, la quantita` totale trasportata
dalla fabbrica i al magazzino j.

Il modello matematico per risolvere il problema è il seguente:

FUNZIONE min ∑ cij ·


OBBIETTIVO xij
la quantità prodotta non deve essere
VINCOLI ∑ xji ≤ ai con i = 1,2, ...,m
superiore a quella inviata
la quantità inviata non deve essere
∑ xij ≥ bj con j = 1,2, ...,n
inferiore a quella richiesta
xij ≥ 0, per
ogni i e j

E' ancora un problema di programmazione lineare e lo si può risolvere con il metodo del simplesso;
la matrice di transizione che si ottiene rappresenta il grafo dei possibili flussi tra le origini e le
destinazioni, ma risulta troppo ampia e poco maneggevole. Per questo motivo si usano metodi
risolutivi che, pur mantenendo la struttura del metodo del simplesso, risultano più rapidi e semplici.

Con lo scopo di rappresentare il modello per il problema del trasporto nella maniera piu` chiara e
sintetica possibile si usa, solitamente, la seguente forma tabulare.

Destinazioni
1 2 ... n Disponibilita`
1 c11 c12 ... c1n a1
2 c21 c22 ... c2n a2
Sorgenti ... ... ... ... ... ...
... ... ... ... ... ...
m cm1 cm2 ... cmn am
Richiesta b1 b2 ... bn

Questa tabella come si puo` vedere riassume i costi unitari, le disponibilita` e le richieste ed e`
pertanto sufficiente a descrivere completamente un problema di trasporto. Per i calcoli si puo`
utilizzare una variazione, sotto riportata, della tabella appena vista, la "matrice dei trasporti", che
permette di cercare le soluzioni per tentativi successivi.

Destinazioni
1 2 ... n Disponibilita`
1 x11 x12 ... x1n a1
2 x21 x22 ... x2n a2
Sorgenti ... ... ... ... ... ...
... ... ... ... ... ...
m xm1 xm2 ... xmn am
Richiesta b1 b2 ... bn

Per comodita` si usa spesso inserire in un angolo di ogni riquadro della stessa matrice anche i costi
unitari relativi.
39
Prima di vedere alcuni metodi risolutivi e` opportuno chiarire quali soluzioni di base sono
ammissibili. Essendo il problema del trasporto un caso particolare del piu` generale problema di
programmazione lineare, le soluzioni di base ammissibili sono definite allo stesso modo.
Considerando altresi` che per la ricerca della soluzione non procederemo con l'analisi delle equzioni
originarie, ma faremo uso di un metodo risolutivo basato direttamente sulla matrice di trasporto, e`
opportuno essere in grado di determinare le soluzioni di base ammissibili direttamente sulla matrice
di trasporto stessa. Essendo presenti m sorgenti ed n destinazioni nel modello matematico generale,
vi devono essere (m+n) equazioni; si puo` quindi essere portati a concludere che una soluzione di
base ammissibile (non degenere) deve avere (m+n) elementi della matrice di trasporto diversi da
zero. In realta`, a causa dei particolari vincoli ai quali e` soggetto il problema, si osserva che ogni
equazione puo` essere ottenuta dalla combinazione di tutte le altre. Da questo si deduce che le
equazioni linearmente indipendenti sono in numero di (m+n-1); quindi una soluzione di base
ammissibile deve avere esattamente (m+n-1) assegnazioni strettamente positive. Infine, perche` vi
sia soluzione, non vi devono essere cicli chiusi.

Vediamo un esempio:

Destinazioni
1 2 3 4 5 Disponibilita`
1 _ _ _ 20 10 30
Sorgenti 2 _ _ _ 10 25 35
3 _ 10 20 _ _ 30
4 20 5 _ _ _ 25
Richiesta 20 15 20 30 35

La presenza del ciclo chiuso (1,4;1,5;2,5;2,4) indica che l'attuale soluzione e` una media ponderata
di due soluzioni di base ammissibili e pertanto non e` soluzione accettabile. Per ridurre una
soluzione non di base accettabile ad una soluzione di base accettabile si deve procedere ad una
eliminazione di tutti i cicli chiusi. Un insieme di assegnazioni e` detto "indipendente" se non vi
sono cicli chiusi. Per eliminare i cicli chiusi si puo` procedere con i metodi risolutivi classici
oppure, come per il caso visto sopra, riducendo ed incrementando le assegnazioni in diagonale
compatibilmente con i vincoli.

Riassumendo, una soluzione di base e` ammissibile se:

e` accettabile (se soddisfa i vincoli e se le assegnazioni sono


strettamente positive);
il numero di assegnazioni e` esattamente (m+n-1);
le assegnazioni sono indipendenti.

In conclusione osserviamo che la ricerca di una soluzione ottima si puo` riassumere algebricamente,
come visto in precedenza, nella ricerca del minimo della seguente funzione:

40
il problema cosi` formulato puo` essere denominato primale in contrapposizione al relativo
problema duale che consiste nella ricerca del massimo della funzione:

con: vj - ui ≤ cij

dove vj e ui sono le variabili duali associate rispettivamente ai vincoli del problema primale bj e ai.
Tenendo conto delle condizioni di complementarieta`: se xij ≥ 0 allora vj - ui = cij; considerando il
"teorema di complementarieta`" che illustra il seguente risultato: date due soluzioni ammissibili,
una per il problema primale ed una per il problema duale, che soddisfino le condizioni di
complementarieta`, allora tali soluzioni sono soluzioni ottime; si ottiene un metodo alternativo per
la ricerca della soluzione ottima del problema di trasporto.

Proprietà del Problema del Trasporto

La distribuzione ed il valore ottimo dei flussi del problema del


trasporto non cambiano se ai valori di una stessa riga o colonna
aggiungiamo lo stesso valore; in questo modo cambierà la funzione
obbiettivo ottima ma non la distribuzione
Se i termini noti del problema (ai;bj) sono tutti quanti interi, allora
anche la soluzione ottima è intera. Questa proprietà di interezza si
mantiene anche nei cambiamenti di base (questo perché si usa la
somma, la sottrazione e operazioni di minimo).

Problemi di assegnazione
Il problema dell'assegnazione è un caso particolare del problema del trasporto ma, per la semplicità
della sua struttura, viene risolto con un metodo proprio. Dal punto di vista matematico si parla di
problema dell'assegnazione quando in un problema di trasporto m = n, cioè il numero delle
fabbriche è uguale al numero dei magazzini. Le quantità disponibili ai e le quantità richieste bj sono
tutte uguali a 1 e le quantità inviate xij possono assumere il valore 0 o 1 cioè:

xij = 1 se si invia da i a j
xij = 0 altrimenti

Non è possibile distribuire una stessa risorsa a più attività; la risorsa i o è attribuita all'attività j
oppure non lo è. Il problema rimane quello di minimizzare il costo totale:

FUNZIONE
min ∑ c ij · xij
OBIETTIVO:
una singola risorsa deve essere assegnata ad un unica
VINCOLI: ∑i xij = 1
attività
∑j xij = 1 ciascuna attività deve ricevere solo una risorsa

41
Questo non è un problema di programmazione lineare in quanto le xij, le ai e le bj prendono dei
valori particolari; inoltre non si possono dividere le risorse fra più attività come sarebbe giusto
aspettarsi in un problema di programmazione lineare.

Per presentare il modello risolutivo riportiamo di seguito una tabella che descrive un ipotetico
problema di assegnazione di 4 origini (o risorse) a 4 destinazioni (o attività); nelle caselle sono
riportati i costi relativi ad ogni assegnazione possibile.

Sappiamo risolvere il rilassamento continuo di questo problema; lo si trova sostituendo

xij = 1 se si invia da i a j
xij = 0 altrimenti

con la condizione

1 ≥ x ij ≥
0
NB 1 ≥ è una condizione
xij ridondante

Otteniamo un problema di trasporto con i termini noti uguali ad 1.

Attivita`
1 2 3 4
1 10 7 8 12
Risorse 2 9 13 12 10
3 8 11 6 13
4 11 12 14 9

La forma tabulare appena scritta puo` essere trasformata, senza modificare il senso del problema, in
una matrice a costo equivalente. Per fare cio` togliamo a ciascuna riga il minimo valore contenuto
nella riga stessa. Il risultato e` quello di identificare per ogni sorgente la destinazione a minor costo
(casella contrassegnata con uno "0"), senza tener conto delle altre sorgenti. Otteniamo quindi la
seguente tabella:

Attivita`
1 2 3 4
1 3 0 1 5
Risorse 2 0 4 3 1
3 2 5 0 7
4 2 3 5 0

Nel caso specifico otteniamo immediatamente il risultato sperato perché le caselle a costo minore
occupano ognuna una riga ed una colonna diversa coprendo tutte le assegnazioni. Non sono presenti
inoltre, costi negativi che indicherebbero un costo potenzialmente minore per una assegnazione
diversa. Le assegnazioni cercate sono naturalmente quelle in corrispondenza degli zeri. Si noti che i
valori '0' si trovano in posizioni le cui relative righe e colonne non presentano atri zeri.

42
La soluzione ottima è data dalle seguenti assegnazioni:

con
costo
Risorsa assegnata a
pari
a
costo
I risorsa II attività
9
costo
II risorsa I attività
7
costo
III risorsa III attività
6
costo
IV risorsa IV attività
9

ESEMPIO: sia data la seguente tabella dei costi.

Attivita`
1 2 3 4 5
1 7 5 9 8 11
2 9 12 7 11 10
Risorse 3 8 6 4 6 9
4 7 3 6 9 5
5 4 6 7 5 11

Togliamo a ciascuna riga il minimo valore contenuto nella riga stessa ottenendo:

Attivita`
1 2 3 4 5
1 2 0 4 3 6
2 2 5 0 4 3
Risorse 3 4 2 0 2 5
4 4 0 3 6 2
5 0 2 3 1 7

In questo caso nelle colonne 2 e 3 ci sono due zeri, mentre nelle colonne 4 e 5 non vi sono zeri;
questa sarebbe una soluzione ottima ma non ammissibile. Procediamo quindi come fatto in
precedenza per le righe, togliendo a ciascuna colonna il minimo valore minimo contenuto nella
colonna stessa.

43
Attivita`
1 2 3 4 5
1 2 0 4 2 4
2 2 5 0 3 1
Risorse 3 4 2 0 1 3
4 4 0 3 5 0
5 0 2 3 0 5

Pur avendo nella colonna 3 e nelle righe 4 e 5 due zeri, non si riesce a coprire tutta la matrice in
modo da ottenere una distribuzione di zeri tale da occupare con uno zero una riga ed una colonna
soltanto coprendo tutte le assegnazioni. Possiamo pertanto provare ad aumentare il numero di zeri
facendo attenzione a non eliminare quelli gia` esistenti. Si osservi che sottraendo una certa quantita`
a tutti i termini di una colonna contenente zeri, per mantenere gli zeri tali, e` possibile sommare
detta quantita` a tutti i termini della riga corrispondente allo zero da conservare. Un discorso
analogo vale per le righe. Al fine di facilitare i calcoli, segnamo con un colore diverso le righe e le
colonne necessarie a coprire tutti gli zeri, con l'accorgimento di non far cadere alcuno zero sugli
incroci tra righe e colonne segnate.

Attivita`
1 2 3 4 5
1 2 0 4 2 4
2 2 5 0 3 1
Risorse 3 4 2 0 1 3
4 4 0 3 5 0
5 0 2 3 0 5

Abbiamo trovato il minore numero di righe e colonne che contengono tutti gli zeri che stanno nella
tabella. Siccome si stanno cercando cinque zeri ben disposti ma si riesce a coprire la matrice anche
con quattro, si può concludere che questa non è la soluzione ottima. Si toglie infine il minimo nei
punti scoperti ottenendo così una soluzione ammissibile che è anche ottima.

Eseguendo i calcoli secondo la copertura effettuata si ottiene la seguente tabella:

Attivita`
1 2 3 4 5
1 1 0 4 1 4
2 1 5 0 2 0
Risorse 3 3 2 0 0 2
4 3 0 3 4 0
5 0 2 3 0 5

Vediamo ora se gli zeri trovati sono sufficienti alla copertura della matrice. Le assegnazioni (5,1) e
(1,2) sono indispensabili per coprire rispettivamente la colonna 1 e la riga 1, con il risultato di
rendere inutilizzabili gli zeri di posizione (5,4) e (4,2). Per coprire la riga 4 prendiamo lo zero (4,5)
che elimina (2,5); per la riga 2 resta lo zero (2,3) che elimina (3,3); per ultimo resta lo zero (3,4) che
completa la copertura della matrice. La soluzione trovata e` ottima.

44
Osservazioni: nel caso in cui una o piu` assegnazioni siano vietate dal problema, basta porre in ogni
casella corrispondente un valore M grande a piacere. Nel caso in cui le risorse e le attivita` non
siano in numero uguale bisogna aggiungere una risorsa o attivita` fittizia; cio` si traduce, a seconda
dei casi, nell'aggiunta di una riga o una colonna di zeri.

Schematizzando si ha:

Si sottrae dagli elementi di ogni riga e, successivamente dagli elementi di ogni colonna,
1. l'elemento minore, in modo che ci sia almeno uno zero per ogni riga e per ogni
colonna.
2. Si cerca fra gli zeri la soluzione ottima:
si contrassegna con un cerchietto uno zero per ogni riga (o per ogni colonna) a
partire da quella con minor numero di zeri;
si sbarrano gli altri zeri che appartengono sia alla stessa riga che alla stessa colonna
dello zero contrassegnato.
quella trovata è la soluzione ottima se gli zeri contrassegnati sono uno per riga e uno
per colonna

Se non si è raggiunto l'ottimo:

Si traccia il minor numero di linee in modo da ricoprire tutti gli zeri (le linee devono
3.
essere minori di n se l'assegnazione non è ottima):
si marcano con una crocetta le righe senza zeri contrassegnati
si segnano, successivamente, le colonne che nelle righe segnate hanno uno o più zeri
sbarrati
si marcano con una crocetta le righe che hanno, nelle colonne marcate,degli zeri
contrassegnati, e così di seguito
si traccia una linea su tutte le righe non segnate e su tutte le colonne segnate.
Dagli elementi della matrice non coperti da linee si sottrae il minore di essi e lo si
4.
aggiunge ai termini che si trovano nell'incrocio fra le due linee.
Nella matrice trasformata, si cerca una soluzioni ottima fra gli zeri (in caso negativo si
5.
riparte dal punto 3).

Ottimizzazione su Grafi e Reti


Introduzione
Un grafo consiste di un insieme di punti, detti nodi, e di linee dette rami (o archi) che connettono
coppie di nodi. Quello che segue è un esempio di grafo: i circoli sono i nodi, le linee che li
congiungono sono i rami.

45
Una carta geografica può ben rappresentare un grafo: le città sono i nodi, mentre le strade che le
collegano rappresentano i rami.

Un cammino tra i nodi i e j è una sequenza di rami e nodi che porta dal nodo i al nodo j; se i nodi i
e j coincidono, il cammino pernde il nome di ciclo o cammino chiuso.

Un grafo si dice connessose esiste un cammino che unisce ogni possibile coppia di nodi.

Un albero è un grafo connesso che non contiene alcun cammino chiuso.

Un ramo di un grafo si dice orientato se gli è attribuito un verso tale che, dei due nodi alle sue
estremità, uno è considerato punto d’origine, l'altro punto di destinazione.

Un grafo è detto orientato quando tutti i suoi rami sono orientati.

La capacità di flusso di un ramo è la quantità massima che può percorrere il ramo nella direzione
indicata; può variare a seconda della dirazione percorsa. La capacità di flusso può assumere
qualunque valore non negativo, infinito incluso. Un ramo è orientato se in una delle direzioni la sua
capacità di flusso è zero.

Qualche volta ci si riferisce ad un nodo come ad una sorgente se ognuno dei suoi rami ha un verso
tale che il flusso esce da quel nodo. Allo stesso modo qualche volta è chiamato pozzo se ognuno dei
suoi rami è orientato verso quel nodo. Quindi le sorgenti possono essere considerate come
generatrici di flussi e i pozzi come assorbenti di quei flussi.

Cammino più breve su un grafo


Consideriamo un grafo generico: fissiamo un nodo P come nodo di origine, un nodo A come nodo
di destinazione e, ad ogni arco, associamo un costo di percorrenza. Il problema del percorso
minimo consiste nel trovare il cammino piu’ breve per andare da P ad A, minimo proprio perchè la
somma dei costi presenti sugli archi che lo compongono è la minima possibile.

Questo è un problema di programmazione lineare con variabili intere (come nel caso dell'
assegnazione); la variabile decisionale xij assumerà quindi i seguenti valori:

46
xij = 1 se il ramo tra i e j appartiene al percorso minimo

xij = 0 se il ramo tra i e j non appartiene al percorso minimo

cij costo di percorrenza

Vediamo ora il modello matematico relativo al problema del percorso minimo:

min ∑ cij xij funzione obiettivo


deve esserci un unico arco del percorso ottimo che esce
∑ j xPj = 1 dal nodo di partenza P
deve esserci un unico arco del percorso ottimo che
∑i xiA = 1 giunge al nodo di arrivo A
∑i xij = ∑k
per i nodi intermedi, il numero di archi entranti è pari al
xjk per ogni numero di archi uscenti
j ≠ P, A

Per rendere lineare il problema, si assume xij ≥ 0; in questo caso si parla di rilassamento
continuo

Metodo di Dijkstra (1959)

E' un metodo, più adatto rispetto al simplesso, per la risoluzione dei problemi di percorso minimo;
si può applicare solamente nel caso in cui tutti i costi cij risultano non negativi: cij ≥ 0 per ogni i, j.

Questo metodo attribuisce a ciascun nodo della rete, delle variabili (dette potenziali), che indicano
la distanza minima del nodo considerato da quello P di partenza.

All'inizio si assume che il nodo P disti 0 da se stesso ed ∞ dagli altri nodi; questo è il motivo per cui
si impongono costi di percorrenza non negativi: infatti con cij < 0 può accadere che la distanza di P
da se stesso risulti negativa; inoltre, costi negativi possono creare circuiti con costi complessivi
negativi ed, in questo caso, non esisterebbe soluzione ottima (ad ogni ciclo, il valore della soluzione
ammissibile diminuirebbe).

Si parte esaminando il nodo P e proseguendo via via con tutti gli altri; una volta determinato il
potenziale, questo viene propagato ai nodi attigui sommandolo al costo del ramo percorso,
ottenendo così dei potenziali provvisori; il prossimo nodo da esaminare sarà quello con potenziale
minore (il potenziale minore diventa definitivo per quel nodo). Man mano che si percorre il grafo, i
possibili potenziali vengono aggiornati (scegliendo sempre quello minore).

Quando tutti i nodi sono stati presi in esame, si ottiene un albero formato dai cammini minimi dal
nodo P a tutti gli altri nodi; il percorso minimo cercato si avrà scegliendo i rami dell'albero, che
vanno da P ad A, con costo minimo.

47
Determinando il percorso minimo per il grafo visto all'inizio:

Per semplicità considero i rami in senso orario; iniziando da P, si ottengono i potenziali 5, 4, 3; il 3


è il minimo e lo propago ottenendo (il primo addendo e' il potenziale del nodo in esame, il secondo
e' il costo di percorrenza del ramo):

3 + 3 = 6 in P perciò mantengo lo 0

3 + 2 = 5 ma avevo già un 4 e lo mantengo

3 + 4 = 7 e lo scrivo

3 + 3 = 6 e lo scrivo

3 + 5 = 8 e lo scrivo

Ora prendo in esame il nodo con potenziale 4:

4 + 0 = 4 quindi in P rimane lo 0

4 + 1 = 5 ma ho già un 5 per cui la cosa è indifferente

4 + 5 = 9 ma avevo già un 7 e lo mantengo

4 + 2 = 6 ma avevo già un 3 e lo mantengo

Proseguo così finchè non ottengo la situazione seguente; i numeri nei nodi sono i potenziali
definitivi:

48
La soluzione ottima e' il cammino evidenziato in azzurro: il percorso minimo da P ad A ha un costo
pari a 7 ( 3 + 3 + 1 ); considerando anche gli archi rossi si ha l'albero con il percorso piu' breve da P
a ciascun nodo del grafo.

Problema Duale

VARIABILI PROBLEMA PROBLEMA DUALE


DUALI PRIMALE
min ∑ cij xij funzione obiettivo max uA - uP

uP ∑j xPj = 1 primo vincolo uj - ui ≤ cij

uA ∑i xiA = 1 secondo vincolo uP,uA, uj non sono


primale vincolate nel segno
uj ∑i xij = ∑k xjk per terzo vincolo
ogni j ≠ P, A primale

Le variabili duali assumono il significato di potenziali; tali potenziali possono essere interpretati
come distanze, misurate rispetto ad un certo riferimento, che si trova nel nodo di partenza (uP = 0).

uP e' il potenziale relativo al nodo P di partenza


uA e' il potenziale relativo al nodo A di arrivo
uj al variare di j, e' il potenziale di ogni singolo nodo (esclusi P e A)

Per i rami del cammino minimo, si avrà: uj - ui = cij.

L'obiettivo duale e' rendere massima la differanza di potenziale tra i nodi di partenza e di arrivo.

Per dare un'interpretazione fisica al problema duale, si possono immaginare i nodi rappresentati da
palline unite attraverso cordicelle, cordicelle che sostituiscono gli archi: cij sarà la lunghezza della
cordicella che unisce i nodi i e j, mentre uj - ui è la loro distanza;considerando un nodo come
riferimento (P ad esempio), si vuole allontanare A il più possibile da P senza che la distanza di due
nodi superi la lunghezza della cordicella che li unisce (vogliamo evitare che la cordicella si spezzi):
quando le cordicelle sono tese al massimo, si è raggiunta la massima differenza di potenziale tra le
due palline considerate.

Minimo Albero Ricoprente


Consideriamo un grafo dove siano indicate le lunghezze di ogni singolo arco; si vuole trovare un
albero che connetta tutti i nodi del grafo assegnato, ma la cui estensione sia la minima possibile
(esempio tipico e' il cablaggio di un'area: si vogliono collegare tutte le centraline posando il minor
numero di cavi possibile).

49
Si differenzia dal problema del percorso minimo, in quanto ora tutti i nodi devono essere collegati
tra loro, non esistono nodi di riferimento (partenza e arrivo) e non serve effettuare il calcolo dei
potenziali.

Il problema è trovare " l’arborescenza complessiva " con una lunghezza totale minima di rami.

Esempio

Consideriamo il seguente grafo:

I rami vengono ordinati in ordine di lunghezza crescente, in modo da creare una lista:

1 2 3 4 5 6 7 8 9 10 11 12 13 15 16 17 18 19

Per creare l'albero minimo, si considera il primo ramo, lo si segna come appartenente all'albero e lo
si elimina dalla lista; si procede in questo modo con tutti gli altri rami, che verranno inseriti
solamente nel caso in cui non creino circuiti chiusi (nell'esempio, i rami dall'1 al 5 fanno parte
dell'albero, il 6 no, perchè crea un circuito chiuso con i rami 4 e 5); una volta testati tutti gli archi
della lista, si ottiene l’albero di lunghezza minima (indicato in azzurro nel disegno)

La dimostrazione che l’albero trovato è effettivamente quello di lunghezza minima, viene effettuata
procedendo per assurdo.

Supponiamo che l'albero trovato non si quello di lunghezza minima; esiste allora un altro albero
minimo a cui appartiene un ramo che il nostro albero non ha; aggiungiamo il nuovo ramo al nostro
albero (ad esempio il ramo 11): si crea un circuito da cui bisogna togliere l'arco di lunghezza
maggiore, per avere una copertura minima, e l'arco da togliere è proprio quello appena aggiunto
(inserendo 11 si crea un circuito con i nodi 3, 2 e 10: il più lungo è l'11 perciò lo tolgo). L'albero
trovato non può essere migliorato, perciò il nostro albero è il minimo albero ricoprente.

50
Flusso massimo
Procedimento Risolutivo
Esempio
Teorema del massimo flusso - minimo taglio

Si consideri un grafo connesso, avente una sola sorgente ed un solo pozzo; sia valido il principio
della conservazione del flusso (⇒ il flusso entrante in un nodo è uguale a quello uscente) in ogni
altro nodo che non sia la sorgente o il pozzo.

Si supponga che il tasso di flusso lungo il ramo che va dal nodo i al nodo j (lo indicheremo come
ramo (i,j) ), possa assumere qualunque valore non negativo, che non ecceda una determinata
capacità di flusso.

Il problema del flusso ottimale consiste nel determinare un modello accettabile di flusso attraverso
la rete, che massimizzi il flusso totale dalla sorgente al pozzo.

Si tratta di determinare, in ciascun ramo, il flusso accettabile che massimizzerà il flusso totale F,
entrante nel nodo iniziale; per l’ipotesi della conservazione del flusso, F è pure il flusso totale nel
pozzo.

La capacità di flusso cij è indicata da un numero riportato sul ramo (i,j), in prossimità del nodo i.

Il problema della ricerca del flusso ottimale può essere formulato come problema di
programmazione lineare: supponiamo che vi siano N nodi e indichiamo rispettivamente con 1 ed N
la sorgente P ed il pozzo A; sia xij il tasso di flusso dal nodo i al nodo j per ogni ramo (i,j).

Il modello sara':

max ∑k x1k = max funzione obiettivo


∑k xkN
0 ≤ xij ≤ cij vincoli alla capacita' di flusso (uno per ciascun ramo (i, j) )

∑i xij = ∑k xjk con k vincolo della conservazione del flusso per i rami intermedi
= 2, ..., N-1

La funzione obiettivo si ottiene ricordando che, per la conservazione del flusso, si ha: F = ∑k x1k =
∑k xkN.

Procedimento risolutivo

Per la soluzione del problema, vengono assegnati dei flussi fittizi, con verso opposto a quello
regolare del ramo; l’effetto reale di tali flussi è quello di eliminare, del tutto o in parte, un flusso

51
precedentemente assegnato in direzione "corretta"; ogni volta che una quantità passa attraverso un
ramo, viene aumentata della medesima quantità anche la capacita' del flusso fittizio.

Si seguono i seguenti passi:

1. trovare un cammino, da una sorgente ad un pozzo, con capacità di flusso positiva; se non ne
esiste alcuno, i flussi netti già assegnati costituiranno un modello di flusso ottimale.
2. determinare la quantità massima che può passare attraverso il cammino: è pari al minimo
flusso assegnato ai rami del cammino stesso.
3. aggiornare le capacità dei rami attraversati ed i flussi fittizi: alle capacità viene sottratto il
flusso minimo che viene aggiunto al flusso fittizio dello stesso ramo; ritornare al punto 1.

Per ogni cammino trovato, almeno un suo ramo viene saturato, cioè va a zero la sua capacità.

Esempio

Esaminiamo il seguente grafo:

Consideriamo il percorso 1→ 2→ 4→ 7: la capacità minima dei rami in questione è pari a 4, che


sarà il flusso assegnato al percorso; di conseguenza F = 4 e la rete risultante sara':

In base alle stesse considerazioni, si assegna un flusso di 3 ai percorsi 1→ 3→ 6→ 7


1→ 2→ 4→ 5→ 7 1→ 3→ 5→ 7; in questo caso F sara' dato da:

52
F = 4 + (3*3) = 13

Si aggiunga ancora un flusso di 2 al cammino 1→ 3→ 4→ 2→ 5→ 6→ 7; ora si ha F = 13 + 2


= 15 e la rete sara' data da:

Non resta alcun cammino con capacità positiva, percio' il modello di flusso trovato è quello
ottimale.

Teorema del massimo flusso–minimo taglio

Una volta ottenuto il modello di flusso ottimale, viene lecito chiedersi se, con scelte diverse dei
percorsi, si sarebbe potuto ottenere un flusso migliore.

La risposta a tale quesito è data dal problema duale del problema di flusso massimo: le variabili
duali vengono considerate come potenziali di ogni singolo nodo; i potenziali sono tutti positivi o
nulli.

Per la formulazione del problema duale, introduciamo un arco di ritorno che va dal pozzo alla
sorgente.

53
PROBLEMA
VARIABILI PROBLEMA DUALE (di
PRIMALE (di flusso
DUALI minimo taglio)
massimo)
max ∑k x1k = funzione
min ∑ wij cij
max ∑k xkN obiettivo
∑i xij = ∑k xjk con k primo uj - ui + wij ≥ 0 per ogni i,
uj
= 2, ..., N-1 vincolo j ≠ P, A
secondo uP - uA ≥ 1 (wij non esiste per
wij 0 ≤ xij ≤ cij
vincolo il ramo di ritorno)

Teorema di dualità: se wij > 0 allora xij = cij

Per minimizzare la funzione obiettivo duale, bisogna fare in modo che il valore dei wij sia il più
basso possibile; il caso ideale si avrebbe con wij = 0 , ma questo implicherebbe anche potenziali
tutti nulli, il che non è possibile perchè deve essere uP - uA ≥ 1.

Poniamo uP = 1 potenziale del nodo sorgente


uA = 0 potenziale del nodo pozzo

Bisogna transitare da uP =1 a uA =0 utilizzando rami a bassa capacità e tenendo il valore di wij il


più basso possibile; questo perchè

se uP =1 e uA =0
e deve valere il
vincolo
uj - ui + wij ≥ 0
allora
necessariamente
wij = 1

ma questo fa sì che nella funzione obiettivo duale compaia cij ⇒ per rendere minimo l'obiettivo, è
necessario passare da 1 a 0 utilizzando gli archi con flusso minimo, in modo che wij cij sia il più
basso possibile.

Introduciamo i tagli: un taglio è un insieme di rami che, se vengono eliminati dal grafo, separano il
nodo sorgente dal nodo pozzo; un taglio puó essere definito come ogni insieme di rami orientati
che contiene almeno un ramo di ogni cammino dalla sorgente al pozzo; vado a cercare i tagli tra
gli archi con capacità minima.

Il valore di taglio è la somma delle capacità di flusso dei rami del taglio stesso (nella direzione del
taglio).

Il teorema del massimo flusso – minimo taglio afferma che, per ogni rete con una sola sorgente ed
un solo pozzo, il flusso massimo ottenibile dalla sorgente al pozzo è pari al valore minimo tra quelli
di tutti i possibili tagli della rete; in questo modo, il valore di ogni taglio fornisce un limite superiore
ad F, inoltre il più piccolo dei valori di taglio è uguale al valore massimo di F.

54
Se si nota un taglio nella rete di partenza, il cui valore sia uguale al valore di F raggiunto per
mezzo della procedura risolutiva, il modello di flusso individuato è quello ottimale; inoltre,
nella rete ottimizzata, tutti i rami che compongono il taglio sono saturi.

Riprendendo l'esempio visto prima, si ha:

Il valore di taglio è dato da 7 + 0 + 2 + 3 + 3 = 15 che è stato individuato come valore massimo di


F: questo e' il taglio minimo.

Nella rete ottimizzata, con F=15, il taglio corrispondente a quello appena determinato ha un valore
pari a zero (tutti i suoi rami sono saturi): si è raggiunto l'ottimo e non è necessario, quindi, cercare
altri cammini con capacità di flusso positiva.

Flusso a costo minimo


Metodo Out of Kilter
Lemma di Minty
Interpretazione
Osservazioni
Circuito
Taglio

Si consideri un reticolo connesso avente una sola sorgente P ed un solo pozzo A; ciascun ramo sia
del tipo:

dove cij e' il costo di percorrenza del ramo (i, j) dal nodo i al nodo j; lij e uij sono rispettivamente il
minimo ed il massimo flusso che il ramo riesce a sostenere, con lij ≤ uij , mentre xij e' il tasso di
flusso dal nodo i al nodo j, per ogni ramo (i, j) con lij ≤ xij ≤ uij.

55
VARIABILI PROBLEMA PROBLEMA DUALE
DUALI PRIMALE
min ∑ xij cij funzione obiettivo max ( ∑ lij αij − ∑ uij βij )
αij ≥ 0 xij ≥ lij primo vincolo vj - vi + αij − βij = cij
βij ≥ 0 - xij ≥ - uij secondo vincolo
vj ∑i xij - ∑k xjk = 0 per vincolo della conservazione di
ogni j ≠ P, A flusso per rami intermedi

NB Non ha senso porre xij ≥ 0 perchè è già compreso tra due valori positivi, lij e uij.

Applicando le condizioni di complementarietà, si possono verificare tre casi diversi; per illustrarli si
usera' lo spazio flussi-tensioni: il tasso di flusso xij viene riportanto in ascissa mentre la differenza
di tensione vj - vi in ordinata, questo per ogni ramo del reticolo; i punti che soddisfano la
condizione data, si trovano su di una semiretta detta semiretta delle soluzioni.

In ciascuno dei casi seguenti, le condizioni di complementarietà sono soddisfatte se le xij si trovano
sulla spezzata.

Primo caso

Se xij = lij xij < vij ⇒ βij = 0


quindi vj - vi + αij= cij ⇒ vj - vi ≤ cij
αij viene considerata come variabile di slack

56
Secondo caso

Se xij = uij xij > lij ⇒ αij = 0


quindi vj - vi - βij = cij ⇒ vj - vi ≥ cij
βij (negativa) viene considerata come variabile di surplus

Terzo caso

Se lij < xij <


xij > lij ⇒ aij = bij
uij
quindi vj - vi = cij

57
Metodo Out of Kilter

Questo metodo si utilizza con un qualunque insieme di flussi, basta che siano equilibrati, cioè ∑i xij
= ∑k xjk.

Data una certa distribuzione di potenziali sui nodi del reticolo (si possono considerare, ad esempio,
potenziali tutti nulli), è possibile rappresentare sullo spazio flussi-tensioni tutti i vari archi
dell'albero (ogni arco ha un diagramma diverso, ma per comodità si rappresentano tutti sullo stesso
grafico); le capacità di flusso ed i costi di percorrenza saranno diversi per ogni ramo; ogni arco sarà
rappresentato sullo spazio flussi–tensioni da un singolo punto.

Gli archi del grafo verranno colorati in modo diverso a seconda del colore presente nella zona dove
si trova il punto che rappresenta l'arco in questione

Lemma di Minty

Consideriamo il caso di un diagramma che presenti tutti e tre i colori (rosso, verde, giallo);
supponiamo che il grafo abbia un ramo giallo, γ (ramo di riferimento); allora, si potrà verificare
solamente uno dei seguenti casi:

Nel grafo esiste un circuito C che contiene il ramo giallo γ ; gli altri rami
Primo caso del circuito sono gialli o verdi (non contiene rami rossi); inoltre, tutti i rami
gialli hanno lo stesso verso del ramo γ di riferimento
Nel grafo esiste un taglio T che contiene il ramo giallo γ ; gli altri rami del
Secondo
circuito sono rossi o gialli (non contiene rami verdi); inoltre, tutti i rami
caso
gialli hanno lo stesso verso del ramo giallo γ di riferimento

Interpretazione

Bisogna pensare al grafo come ad una rete idraulica, dove ogni ramo è un tubo in cui
circola del fluido: nei rami verdi scorre in entrambe le direzioni; nei rami gialli scorre
solo nella direzione indicata dal ramo; nei rami rossi il liquido non scorre affatto; infine,
il ramo di riferimento viene collegato ad una pompa.

58
il fluido inizia a circolare ⇒ il fluido ha trovato una via dove non ci sono
Primo
caso rami rossi che impediscono il passaggio ⇒ nella rete ci sono o rami verdi
oppure rami gialli con io stesso verso del ramo di riferimento
Secondo il fluido non circola ⇒ nella rete ci sono rami gialli e rami rossi, quest'ultimi
caso impediscono al liquido di circolare

Da quanto visto, emergono due possibilità: dato un ramo giallo, o si crea un circuito
(primo caso), oppure un taglio (secondo caso).

Osservazioni

Se tutti i rami del grafo appartengono al kilter, si ottiene la soluzione ottima, sia per
il problema primale che per il duale
Se i rami del grafo non appartengono tutti al kilter, allora ci dovrà essere almeno un
ramo giallo nel grafo: questo implica che nel grafo è presente un taglio oppure un
circuito
La distanza dei punti dal kilter indica la quantità di flusso xij sugli archi
corrispondenti

Circuito (primo caso)

Consideriamo il caso in cui vi siano dei punti a sinistra del kilter:

Si determina, per i punti esterni, la variazione di flusso minima per farli appartenere al kilter,
mentre per quelli che già vi si trovano, si calcola di quanto può aumentare il flusso senza farli uscire
dal kilter: la minima tre le due distanze (aumento di flusso) viene sommata ai flussi, facendo quandi
spostare verso destra tutti i punti del grafico; si valuta se ci sono dei circuiti nel grafo e si procede
applicando il lemma di Mindy.

Nel caso i punti si trovassero a destra del kilter, basterebbe invertire il segno dei rami corrispondenti
e procedere come visto.

59
Taglio (secondo caso)

Anche in questo caso, si valutano le distanze dal kilter, questa volta però il calcolo viene fatto in
verticale:

Il procedimento è analogo al precedente, ora però tutti i punti vengono spostati verso il basso di una
quantità pari alla distanza minima; un punto (ramo) finisce nel kilter, cambiando in questo modo
colore.

In entrambi i casi, si ha:

Nessun punto (ramo) che era già nel kilter cade fuori dal kilter
Può succedere che qualche punto che era fuori dal kilter cada sul kilter
Qualche punto diminuisce la sua distanza dal kilter

Si può dimostrare che, se le capacità xij dei rami ed i costi cij sono valori interi o razionali, ad ogni
iterazione dell’ algoritmo, l'avvicinamento al kilter è di una quantità finita e, dopo un numero finito
di iterazioni, ogni ramo del grafo sarà rappresentato da un punto sul kilter.

Pianificazione di progetti
CPM
Procedimento risolutivo
Esempio
PERT
Ipotesi assunte dal PERT

CPM (Critical Path Method)

Un progetto si può definire come un insieme di attività collegate fra loro tramite relazioni di
precedenza.

60
Un'attività è costituita da un inizio (evento iniziale) e da una fine (evento finale); ogni attività
richiede il consumo di certe risorse per essere portata a termine.

Le varie relazioni di precedenza fra le attività di un progetto, sono definite da un grafo di


precedenza; un grafo di precedenza non può avere circuiti.

In un grafo di precedenza, ciascun arco corrisponde ad una attività e ciascun nodo ne rappresenta
l’inizio o la fine; tutte le attività (archi) del grafo hanno una propria durata minima; esiste un solo
nodo di partenza P, con archi tutti uscenti, ed un solo nodo di arrivo A, con archi tutti entranti.

Le variabili del problema sono i potenziali attribuiti ad ogni nodo del grafo, potenziali che
corrispondono al tempo minimo di durata di ogni evento.

L’obiettivo da raggiungere è minimizzare la differenza di potenziale tra il nodo finale ed il nodo


iniziale (minimizzo il tempo che intercorre tra l'inizio della prima attivita' e la fine dell'ultima
attivita').

tj - ti durata dell’attività (i,j)


dij durata minima dell'attivita' (i,j)
la durata dell’attività (i,j) è maggiore o, al limite , uguale
tj - ti ≥ dij alla durata minima
min ( tj - ti
obiettivo: minimizzare la durata dell'attivita'
)

Nel caso in cui tj - ti ≥ dij , cioe' quando la durata dell'attività (i,j) e' uguale alla durata minima dij
dell’attività stessa, allora l’attività prende il nome di attività critica; le attività critiche non hanno
alcuna variabile di surplus nei vincoli di durata minima.

Se una attività critica dura più del previsto, si genera un ritardo, che si propaga sul tempo
complessivo di compimento del progetto; questo non vale per le attività non critiche.

Sul grafo si può individuare un percorso critico, che va dal nodo di partenza al nodo di arrivo e che
comprende tutte le attività critiche; le attività non facenti parte del percorso critico possono essere
rallentate, così come possono essere ritardati gli eventi relativi ai nodi al di fuori di esso; vediamo
di quanto possono essere ritardati tali eventi.

I tempi al più tardi si ottengono procedendo a ritroso, dal nodo di arrivo fino al nodo di partenza.

Il tempo minimo (data minima) di un singolo evento (nodo), si può definire come quel tempo nel
quale l’evento si verificherà nel caso in cui le attività precedenti vengano iniziate il più presto
possibile.

Il tempo massimo (data massima) di un evento è il tempo massimo entro il quale l’evento può
realizzarsi, senza dilazionare il completamento di tutto il progetto oltre il tempo complessivo
stabilito; i tempi massimi vengono anche chiamati float, in quanto corrispondono al margine di
fluttuazione dell’inizio di una attività non critica; questi tempi si calcolano solo per gli eventi non
appartenenti al percorso critico, in quanto per le attività critiche i margini di fluttuazione sono
necessariamente nulli.

61
Lo scorrimento, per un evento, è la differenza tra la sua data massima e quella minima; indica
quanto ritardo sia possibile tollerare nel raggiungere l’evento, senza dilazionare il completamento
del progetto.

Il cammino (o percorso) critico, è il percorso sul reticolo attraverso eventi con scorrimento uguale
a zero (eventi critici).

Abbiamo già osservato che, per le attività non critiche, si ha tj - ti ≥ dij ; c’è quindi una variabile di
surplus che indica il tempo di ritardo per il quale si può prolungare l’attività, senza che tale ritardo
influisca negativamente sul tempo complessivo di durata del progetto.

Procedimento risolutivo

Si pone a zero il potenziale del nodo di partenza


Si propaga tale potenziale lungo i rami che partono dal nodo di partenza; il potenziale si propaga
da un nodo i cui nodi predecessori sono già stati valutati, in termini di potenziale; non essendoci
circuiti nel grafo, c’è sempre un nodo che si può valutare
Il potenziale si propaga e si aggiorna in aumento (differenza tra il metodo di propagazione del
potenziale e il metodo di Dijkstra, analizzato riguardo al problema del percorso minimo)
Dopo aver propagato i potenziali su tutti i nodi del grafo, si ottiene la durata minima
complessiva del progetto, che corrisponde al potenziale del nodo di arrivo

Esempio

Consideriamo il seguente grafo:

Determinando la durata minima del progetto, i tempi minimi, massimi ed il percorso critico, si
ottiene:

62
il nodo di arrivo ha un potenziale pari a 22, quindi il progetto complessivo durerà non meno di 22
giorni ( durata minima).

I nodi verdicorrispondono agli eventi facenti parte del percorso critico (archi verdi).

I valori in rosso indicano i tempi minimi mentre quelli verdi sono i tempi massimi: i due valori
coincidono per gli eventi che si trovano sul cammino critico (scorrimento = 0).

PERT (Program Evaluation and Review Technique)

Il metodo CPM, modello di risoluzione del problema di Pianificazione dei Progetti, è poco
realistico; infatti, la durata di una attività futura può essere pianificata solo fino ad un certo punto;
un modello migliore è fornito dal PERT.

Uno dei principali obiettivi del PERT è determinare la probabilità di raggiungere determinati livelli
di allarme; il PERT identifica pure le attività che costituiscono delle "strozzature", per le quali si
dovrebbe fare lo sforzo maggiore per mantenersi nei limiti della previsione; un terzo obiettivo è
valutare l’effetto dei cambiamenti nel programma: per esempio, si valuterà l’effetto di uno
spostamento di risorse da attività non critiche ad attività critiche, definite come probabili
strozzature; si può anche valutare l’effetto di una deviazione dai limiti fissati dell’attuale occorrenza
di tempo per una certa attività.

Il primo passo nell’applicazione del PERT è sviluppare una rappresentazione reticolare del piano
progettato: ciascun nodo rappresenta un evento, che è una realizzazione specifica, definibile e
collegabile ad un particolare istante di tempo; ogni ramo rappresenta una attività, che è uno dei
compiti richiesti dal progetto; un evento è il completamento di tutte le attività che portano al nodo e
deve precedere l’inizio delle attività che portano fuori dal nodo stesso; il nodo verso il quale
tendono tutte le attività (il pozzo della rete) è l’evento corrispondente al completamento del progetto
pianificato.

Il diagramma di flusso può rappresentare sia il piano del progetto dal suo inizio, sia, se il progetto è
già stato iniziato, il piano per il suo completamento.

Nella versione originale del PERT, si fa la supposizione realistica che il tempo richiesto per
svolgere ogni attività del diagramma di flusso sia una variabile casuale, avente una certa
63
distribuzione di probabilità; spesso, in pratica, si conviene più semplicemente che questi tempi
siano delle costanti prevedibili (metodo CPM).

Considereremo la versione originale del PERT, dove i tempi di attività sono variabili casuali.

Una variabile aleatoria è una entità che può assumere diversi valori, con una certa probabilità; le
variabili aleatorie si distinguono in discrete, possono cioè assumere solo un numero finito di
valori, e continue, possono assumere un numero infinito di valori.

Le durate sono variabili aleatorie continue ed il loro campo di variabilità va da zero ad infinito

La funzione b rappresenta la densità di probabilità dei valori che la durata può assumere; il
metodo PERT usa una procedura di stima semplificata: si ottengono, cioè, tre valori stimati del
tempo richiesto per ogni attività e, precisamente, un valore stimato "più verosimile", un valore
stimato "ottimistico" ed un ed un valore stimato "pessimistico".

Valore stimato "ottimistico" a: tempo stimato in cui l’attività si può compiere se tutto procede
eccezionalmente bene; e' il valore minimo di durata dall’attività
Valore stimato "più verosimile" m: tempo stimato più realistico nel quale l’attività può essere
svolta
Valore stimato "pessimistico" b: tempo massimo che l’attività richiede per il suo
completamento, nelle condizioni più avverse

Βισογνα χονϖερτιρε θυεστι τρε ϖαλορι, ιν στιμε δελ ϖαλορε αττεσο ε δελλα ϖαριανζα δε
λ τεμπο ριχηιεστο δαλλ αττιϖιτ◊; σι ιντροδυχε λ ιποτεσι χηε λα δεϖιαζιονε στανδαρδ σ
sia uguale ad un sesto della differenza delle durate ragionevolmente possibili

Valore atteso della distribuzione, utilizzando il modello di


E[x] = ( a + 4m + distribuzione β
b) / 6

σx = ( b − a ) / 6 Deviazione standard

64
σ² = (( b − a ) / Stima desiderata della varianza
6 )²

Ipotesi assunte dal PERT

1. La durata del progetto viene considerata uguale a quella del percorso critico: non si
prendono in considerazione percorsi alternativi; la durata del percorso critico è data dalla
somma delle attività che si trovano su di esso; queste attività sono variabili aleatorie ed
anche la loro somma è una variabile aleatoria, percio' la durata complessiva del percorso
critico è una variabile aleatoria in quanto somma di variabili aleatorie.

E[∑ xk] = ∑ E[xk] Valore atteso stimato del tempo richiesto per l’intero progetto, come somma
dei valori attesi stimati dei tempi richiesti per ogni singola attività; la speranza matematica di una
somma di variabili aleatorie, equivale alla somma delle speranze matematiche delle variabili
considerate.

2. Tutte le variabili aleatorie che descrivono le durate delle attività del progetto, sono variabili
aleatorie indipendenti; il valore assunto da una variabile, non porta a modificare il valore
attribuito ad un’altra variabile.

σ²[∑ xi] = ∑ σ²[xi] La varianza di una somma di variabili aleatorie equivale alla somma delle
varianze delle variabili considerate; grazie all’ipotesi di indipendenza delle variabili aleatorie,
possiamo calcolare la varianza dell’intero progetto come somma delle varianzedelle singole attività
del progetto.

3. La durata complessiva del progetto è una variabile aleatoria distribuita secondo una
distribuzione Gaussiana, che è una distribuzione di probabilità simmetrica rispetto al punto
di probabilità massima

Supponiamo di dover consegnare il progetto entro una data prefissata tf: l’area al di sotto della
curva a destra di tf, indica la probabilità di essere in ritardo; l’area al di sotto della curva a sinistra di
tf, indica la probabilità di consegnare il progetto entro il tempo stabilito.

65
Programmazione Intera e Mista
Introduzione
Si è parlato di programmazione lineare, si sono analizzati vari problemi e varie metodologie di
soluzione, ed in tutti i casi affrontati, le variabili in gioco potevano assumere qualsiasi valore reale
(ammesso che ciò avesse significato nel contesto del problema); può accadere però, che le variabili
debbano assumere solo valori interi: in questo caso non si parla più di programmazione lineare ma
di programmazione intera.

Confrontiamo i due tipi di problemi:

Le linee azzurre delimitano l'area all'interno della quale ricercare la soluzione ottima, ma mentre nel
caso della PL si ha una quantità infinita e continua di punti amissibili, per la PI gli unici punti validi
sono i soli punti neri (interni o solcati dalle linee azzurre):

nella PL per cercare la soluzione ottima si vanno a valutare unicamente i vertici


risultanti dall'intersezione dei vincoli (quadratini neri) che sono comunque in quantità
limitata
nella PI, l'area amissibile è data da un insieme di punti sconnessi, che nella maggior
parte dei casi cadono all'interno dell'area stessa e non sui vertici; inoltre i punti tra due
possibili soluzioni, non sono a loro volta soluzioni, come accadeva invece nella PL

Per la PI si parla quindi di enumerazione: si vanno a considerare tutte le possibili alternative ⇒ tra
tutti i punti, si valuta quali soddisfano i vincoli e, tra questi, si scelgono quelli che rendono ottima la
funzione obiettivo.

66
Modelli ed Applicazioni
Il modello matematico utilizzato nella programmazione intera è molto siminle a quello utilizzato
nella programmazione lineare:

max C x funzione obiettivo


A x≤ B vincoli
x≥ 0 variabili
condizione aggiunta per la programmazione
x INTERE
intera

Le situazioni più interessanti sono quelle in cui le variabili non rappresentano quantità, come visto
fino ad ora, ma soluzioni alternative: ad esempio, si deve decidere quale scegliere tra due insiemi di
vincoli:

Si può definire una variabile y che avrà valore 0 nel caso in cui la scelta cada sull'insieme I, valore 1
nel caso in cui si scelga l'insieme II:

insieme I A1 x ≤ b1 A1 x ≤ b1 + M y

insieme II A2 x ≤ b2 A2 x ≤ b2 + M (1 - y )

M è un valore qualunque, molto grande, scelto in modo tale che siano verificate le disugualianze per
ogni x

se y = 0
A1 x ≤ b1

A2 x ≤ b2 + M
essendo M molto grande, la soluzione è spostata rispetto l'area delimitata dal
secondo gruppo A2 x ≤ b2, ma cade nell'area circoscritta dal primo gruppo di
vincoli ⇒ si sceglie l'insieme I
se y = 1
A1 x ≤ b1 + M

67
A2 x ≤ b2
stavolta viene scelto l'insieme II in base alle stesse considerazioni viste sopra

L'aggiunta di M grande, fà sì che la soluzione venga spostata fuori dall'area circoscritta da uno dei
due insiemi di vincoli

In alcuni casi può accadere che non tutte le variabili possono avere valori interi, allora
avremo una problema di programmazione intera mista.

Altra situazione interessante, si presenta come un'estensione del problema del trasporto: bisogna
infatti stabilire la convenienza o meno di costruire nuovi magazzini e la metodologia di
distribuzione migliore dai magazzini al dettaglio

di costi dell'impianto i-esimo


cij costi di distribuzione e trasporto dall'impianto i al dettaglio j
ai disponibilità di magazzino nella zona i
bj richieste dei clienti
yi =
se si decide di non costruire nella zona i-esima
0
yi =
se si decide di costruire nella zona i-esima
1

68
si vogliono minimizzare i costi di distribuzione cij ·
min ∑ di · yi + ij e di costruzione di nuovi impianti di · yi (se yi =
x
funzione obiettivo
cij · xij 0 ⇒ di yi = 0 e non ho costi di impianto nella
zona i)
ai yi sarà ≠ da 0 solamente se si decide di costriure
I vincolo ∑ xji ≤ ai yi
il magazzino nella zona i (se yi = 1 ⇒ ai yi ≠ 0)
II vincolo ∑ xij ≥ bj .
xij ≥ 0, per
variabili .
ogni i e j

Anche questo è un problema di programmazione intera, in quanto la costruzione o meno del nuovo
impianto dipende dal valore che assume yi , valore che può essere 0 o 1.

Taglio di Gomory
Si procede risolvendo il problema rilassato (si trascura il fatto che le variabili devono essere intere),
comportandosi quindi come se si trattasse di un normale problema di programmazione lineare; una
volta trovata la soluzione ottima lineare, si introducono in modo appropriato dei nuovi vincoli, tali
da eliminare alcune parti dell'area amissibile e far coincidere la soluzione ottima con un vertice
intero.

E' possibile effettuare queata riduzione dell'area amissibile perche', l'area amissibile per il problema
intero è contenuta strettamente all'interno dell'area amissibile relativa al problema lineare.

Analizziamo la procedura attraverso un esempio:

max x2 funzione obiettivo


3x1 + 2x2 ≤ 6 I vincolo
-3x1 + 2x2 ≤ 0 II vincolo
x1 , x2 ≥ 0, INTERI

Risolviamo il problema rilassato con il metodo del simplesso:

x1 x2 x3 x4 −Z b
3 2 1 0 0 6
-3 2 0 1 0 0
⇐ COSTI
0 1 0 0 1 0
RIDOTTI

Si è di fronte ad un caso degenere, a causa dei due zeri inattesi presenti (celle rosse); proseguendo si
ottiene:

69
x1 x2 x3 x4 −Z b
6 0 1 -1 0 6
-3/2 1 0 1/2 0 0
⇐ COSTI
0 1 0 0 1 0
RIDOTTI

x1 x2 x3 x4 −Z b
1 0 1/6 -1/6 0 1
0 1 1/4 1/4 0 3/2
⇐ COSTI
0 0 -1/4 -1/4 1 0
RIDOTTI

Quella appena ottenuta, è la soluzione ottima per un problema di programmazione lineare, ma non
va bene nel nostro cado perchè non è intera; graficamente si ha:

Andiamo ora a ritragliare l'area amissibile; il metodo del taglio di Gomory parte da un vincolo che
ha termine noto non intero: prendiamo il II vincolo e scomponiamo i coefficienti in parte intera e
parte frazionaria:

N.B. parte intera di k ⇒ primo numero non più grande di k


parte
⇒ k meno la sua parte intera
frazionaria di k
E.S. k parte intera ⎣k⎦ parte frazionaria k - ⎣k⎦
3,7 ⎣3,7⎦ = 3 3,7 - ⎣3,7⎦ = 0,7
- 5,2 ⎣-5,2⎦ = -6 -5,2 - ⎣-5,2⎦ = 0,8

70
II vincolo x2 + 1/4x3 + 1/4x4 = 3/2
separo parte intera e
frazionaria
x2 + 1/4x3 + 1/4x4 = 1 + 1/2
porto a dx le parti intere 1/4x3 + 1/4x4 = 1/2 + 1 - x2
ora: 1/4x3 + 1/4x4 ≥ 0 per definizione
0 ≤ 1/2 ≤ 1
1 - x2 deve necessariamente essere non negativo; inoltre è intero perchè è dato dalla

somma delle parti intere del II vincolo

Tralasciando la parte intera si ottiene il taglio che stavamo cercando:

I taglio di Gomory 1/4x3 + 1/4x4 ≥ 1/2


ricavo x3 dal I vincolo x3 = 6 - 3x1 - 2x2
ricavo x4 dal II vincolo x4 = 3x1 - 2x2
sostituisco x3 e x4 nel
1/4(6 - 3x1 - 2x2)+ 1/4(3x1 - 2x2) ≥ 1/2
taglio
si ottiene x2 ≤ 1

il taglio, perciò, va a modificare l'area amissibile ed elimina la soluzione ottima precedentemente


trovata:

Poniamo tra i vincoli anche il taglio trovato e proseguiano nei calcoli:

x1 x2 x3 x4 x5 −Z b
0 0 -1/4 -1/4 1 0 -1/2 I TAGLIO
1 0 1/6 -1/6 0 0 1 I vincolo
0 1 1/4 1/4 0 0 3/2 II vincolo
⇐ COSTI
0 0 -1/4 -1/4 0 1 -3/2
RIDOTTI

71
E' corretto che il valore in rosso sia negativo, perchè in questo modo viene esclusa la soluzione
ottima trovata; procedendo con il simplesso duale si ottiene:

x1 x2 x3 x4 x5 −Z b
0 0 1 1 -4 0 2 I TAGLIO
1 0 0 -1/3 2/3 0 2/3 I vincolo
0 1 0 0 1 0 1 II vincolo
⇐ COSTI
0 0 0 0 -1 1 -1
RIDOTTI

La soluzione ottima non è ancora intera, bisogna calcolare un nuovo taglio:

I vincolo x1 - 1/3x4 + 2/3x5 = 2/3


separo parte intera e
frazionaria
x1 - x4 + 2/3x4 + 2/3x5 = 2/3
porto a dx le parti intere 2/3x4 + 2/3x5 = 2/3 - x1 + x4

Tralasciando la parte intera, abbiamo trovato il secondo taglio:

II taglio di Gomory 2/3x4 + 2/3x5 ≥ 2/3


ricavo x3 dal I vincolo x3 = 6 - 3x1 - 2x2
ricavo x4 dal II vincolo x4 = 3x1 - 2x2
ricavo x5 dal I taglio x5 = 1/4x3 + 1/4x4 - 1/2 = 1 - x2
sostituisco x4 e x5 nel II
2/3(3x1 - 2x2) + 2/3(1 - x2) ≥ 2/3
taglio
si ottiene 2x1 - 2x2 ≥ 0

l'area amissibile viene ulteriormente ridimensionata, ma anche queata volta nessun valore intero
viene eliminato; inserendo il nuovo taglio nel tableau ottenuto precedentemente ed applicando
nuovamente il simplesso duale, si ha:

x1 x2 x3 x4 x5 x6 −Z b
0 0 1 1 -4 0 0 2 I TAGLIO
0 0 0 -2/3 -2/3 1 0 -2/3 II TAGLIO
1 0 0 -1/3 2/3 0 0 2/3 I vincolo
0 1 0 0 1 0 0 1 II vincolo
0 0 0 0 -1 0 1 -1 ⇐ COSTI RIDOTTI

72
x1 x2 x3 x4 x5 x6 −Z b
0 0 1 0 -5 3/2 0 1 I TAGLIO
0 0 0 1 1 -3/2 0 1 II TAGLIO
1 0 0 0 1 -1/2 0 1 I vincolo
0 1 0 0 1 0 0 1 II vincolo
0 0 0 0 -1 0 1 -1 ⇐ COSTI RIDOTTI

Questa è, finalmente, la soluzione ottima del problema intero; graficamente si ha:

Con il metodo del Taglio di Gomory, non è garantita la convergenza in un numero finito di passi;
perturbare i termini noti fà sì che il problema si stabilizzi, evitando di ciclare, ma il tempo che si
impiega per determinare la soluzione, può rimanere comunque elevato: infatti, se si effettuano
molte iterazioni, il numero delle variabili di slack aumenta sensibilmente (ne viene aggiunta una per
ogni taglio trovato), appesantendo in questo modo i calcoli.

Questo metodo non si può applicare nel caso di programmazione mista.

Branch and Bound


Determinazione dell'albero binario
Procedimento di ramificazione
Tipologie di visita dell'albero binario
Complessità dell'albero binario

L'impostazione e la filosofia di questo metodo sono completamente diverse rispetto al Taglio di


Gomory, anche se le tecniche utilizzate sono molto simili.

73
Vediamo subito un esempio:

max 3x1 + 4x2 funzione obiettivo


x1 + 4x2 ≤ 8 I vincolo
7x1 + 2x2 ≤ 14 II vincolo
x1 , x2 ≥ 0, INTERI

Applichiamo il metodo del simplesso al problema rilassato:

x1 x2 x3 x4 -Z b
1 4 1 0 0 8
7 2 0 1 0 14

3 4 0 0 1 0 ⇐ COSTI
RIDOTTI

x1 x2 x3 x4 -Z b
1 1 1/4 0 0 2
13/2 0 -1/2 1 0 10
2 0 -1 0 1 -8 ⇐ COSTI RIDOTTI

x1 x2 x3 x4 -Z b
0 1 7/26 -1/26 0 21/13
1 0 -1/13 2/13 0 20/13
- -11-
0 0 -4/13 1 ⇐ COSTI RIDOTTI
11/13 (1/13)

La soluzione ottima ottenuta non è intera: anche in questo caso si procede cercando un taglio
partendo da un vincolo con termine noto non intero; possiamo scegliere entrambi i vincoli,
esaminiamo il primo:

I
vincolo
x2 = 21/13 = 1 +8/13
⇒ x2 ≤1 o x2 ≥ 2
questo perchè x2 non può essere frazionario

Così facendo, la regione amissibile è stata divisa in due parti, eliminando anche possibili soluzioni
intere, contrariamente a quanto succedeva con Gomory:

74
Considerando prima la zona x2 ≤1 e poi quella x2 ≥ 2, si ha:

x1 x2 x3 x4 x5 -Z b
0 1 0 0 1 0 1 ⇐ x2 ≤1
-
0 1 7/26 0 0 21/13 I vincolo
1/26
1 0 -1/13 2/13 0 0 20/13 II vincolo
- - -11- ⇐ COSTI
0 0 0 1
11/13 4/13 (1/13) RIDOTTI

x1 x2 x3 x4 x5 -Z b
0 0 -7/26 1/26 1 0 -8/13 ⇐ x2 ≤1
-
0 1 7/26 0 0 21/13 I vincolo
1/26
1 0 -1/13 2/13 0 0 20/13 II vincolo
- - -11- ⇐ COSTI
0 0 0 1
11/13 4/13 (1/13) RIDOTTI

Per x2 ≥ 2 si ottiene:

x1 x2 x3 x4 x5 -Z b
0 1 0 0 -1 0 2 ⇐ x2 ≥ 2
-
0 1 7/26 0 0 21/13 I vincolo
1/26

75
1 0 -1/13 2/13 0 0 20/13 II vincolo
- - -11- ⇐ COSTI
0 0 0 1
11/13 4/13 (1/13) RIDOTTI

x1 x2 x3 x4 x5 -Z b
0 0 7/26 -1/26 1 0 -5/13 ⇐ x2 ≥ 2
-
0 1 7/26 0 0 21/13 I vincolo
1/26
1 0 -1/13 2/13 0 0 20/13 II vincolo
- - -11- ⇐ COSTI
0 0 0 1
11/13 4/13 (1/13) RIDOTTI

In entrambi i casi bisogna riportare in base x2 (casella rossa) per ripristinare la forma canonica, e,
così facendo, si ottiene un termine noto negativo (casella verde): questo è perfettamente corretto, in
quanto, andando ad applicare il simplesso duale, si ridimensiona l'area amissibile per il problema
intero, andando ad eliminare la soluzione ottima precedentemente trovata.

Determinazione dell'albero binario

Man mano che si procede con la risoluzione del problema, si traccia un grafo (quello che si ottiene è
un albero binario) ponendo come radice il valore della soluzione ottima del problema rilassato,
come figli le soluzioni ottime nelle due aree in cui è stata suddivisa l'area amissibile, ed indicando
sui rami a quale zona la soluzione ottima appartiene; questo per ogni soluzione ottima non intera
trovata:

Questo modo di procedere, spiega il nome assunto dal metodo: Branch & Bound = Ramificare &
Limitare:

76
si ramifica perchè ogni volta che appare un termine noto non intero, l'area amissibile
viene suddivisa in due zone distinte, e questo corrisponde ad una ramificazione
nell'albero: un ramo per ciascuna area
si limita perchè i valori nei nodi assumono un significato particolare:
Lower
ogni soluzione intera trovata, costrituisce un possibile LB
Bound:
ha carattere globale
costituisce una limitazione inferiore al valore che la SO relativa al
problema intero potrà assumere ⇒ tra tutti i valori interi trovati, si
considera LB solo il maggiore
Upper
è la parte intera di ogni soluzione ottima frazionaria trovata
Bound:
ha carattere locale: vale solamente per il sottoalbero che si andrà a
ramificare partendo dal nodo con SO non intera
costituisce una limitazione superiore ai valori della SO all'interno di quel
sottoalbero: nel sottoalbero non si potranno trovare SO maggiori rispetto
al valore dell'UP

Nell'esempio che si sta analizzando, la soluzione ottima del problema intero sarà necessariamente
compresa tra 8 (LB) e 11 (UB); continuando a sviluppare il ramo con SO pari a 9+1/7, le ulteriori
SO non potranno essere supeiori a 9 (UB relativo al sottoalbero).

Procedimento di ramificazione

Esistono alcune modalità per decidere quando non efettuare la ramificazione di un nodo: non tutto
l'albero viene esplicitato e questo, in problemi più complessi, genera un notevole risparmio
nell'elaborazione; si possono verificare tre casi:

soluzione una volta trovata una SO intera, si ferma l'iterazione e non si espande
1.
intera: ulteriormente il nodo
se la soluzione cade al di fuori dell'area amissibile per il problema
soluzione non
2. lineare, non ha senso continuare la ramificazione perchè l'area
amissibile:
amissibile per il problema intero è strettamente contenuta in essa
la SO del problema intero non potrà mai assumere il valore dell'UB
trovato, in quanto il LB ha carattere generele e ed è un limite inferiore:
3. LB ≥ UB: se UB è ancora più piccolo di LB, non ha senso continuare ad
esplicitare quel nodo N.B. si sta facendo riferimento ad un problema di
massimo

Proseguendo l'esercizio, si ottiene l'albero seguente:

77
A questo punto il procedimento è terminato: sono stati trovati altri due valori interi, che però sono
inferiori al LB precedente e, di conseguenza, non vengono presi in considerazione; la soluzione
ottima del problema intero sarà pari a 8.

Se al posto di 9+1/7 si trovava 8+1/7, non sarebbe stato necessario sviluppare il nodo: infatti, per
quel sottoalbero, l'unico valore amissibile per l'ottimo intero sarebbe stato 8, valore che era già stato
trovato nella precedente iterazione e che sarebbe diventato SO per il problema intero.

Tipologie di visita dell'albero binario

Il branch & bound fa parte di una classe di algoritmi di enumerazione implicita: ci si limita a capire
l'andamento del problema in una determinata zona, riducendo i calcoli al minimo indispensabile,
per poi proseguire con le altre.

Come si è visto, la soluzione ottima viene individuata abbastanza velocemente; il problema stà nel
riconoscerla: bisogna proseguire con i calcoli per avere la conferma che si è raggiunto l'ottimo e
questo porta via la maggior parte del tempo di elaborazione; per fare ciò, si può scegliere tra tre
metodi di visita dell'albero: la soluzione ottenuta rimane invariata, ma il numero di elaborazioni
varia a seconda della struttura del problema:

Depth sviluppa l'albero in profondità, partendo dalla radice ed arrivando fino alle
First: foglie
Breadth sviluppa l'albero in larghezza, considerando prima tutti i nodi dello stesso
First: livello per poi passare a quelli del livello sottostante
Best
vengono analizzati per primi i nodi con l'upper bound più elevato
First:

Vediamo cosa accade nell'esempio analizzato utilizzando primi due metodi e ponendo 8+1/7 al
posto di 9+1/7:

78
In questo caso, la tipologia più indicata è il Depth First, che permette di fermare l'iterazione senza
andare ad esplicitare tutti i nodi; con il DF si raggiunge la soluzione ottima per il problema interi in
tre passi (è da notare che le tabelle di transizione da elaborare sono comunque di più).

Solitamente il DF ha la maggior probabilità di raggiungere in modo abbastanza rapido un valore


intero (grazie al modo in cui agisce, raggiunge velocemente un LB); a priori non esiste un sistema
per scegliere quale delle tre procedure applicare, a meno che non si tratti di casi particolari.

Complessità dell'albero binario

Generalmente, il numero di nodi effettivamente esplorati è solo una piccola percentuale rispetto al
numero totale dei nodi dell'albero; se il numero di nodi possibili è molto elevato, si può arrivare alla
saturazione completa, dovendo andare a valutarli tutti; esiste sempre un caso peggiore, anche se è
molto raro, in cui bisogna esplicitare tutti i nodi e quello cercato è proprio l'ultimo; in generale il
branch & bound è un buon metodo.

Il problema di programmazione intera ha n variabili: quanto sarà grande l'albero completo? Il


numero di livelli dell'albero sarà pari a n solamente nel caso in cui le variabili siano binarie
(assumono solamente i valori 0 e 1); in caso contrario i livelli possono essere superiori ad n;
vediamo un esempio.

79
Le variabili presenti sono solamente due e possono assumere qualsiasi valore intero; l'albero
associato ad un'area amissibile di questo tipo sarà:

Come si vede dal disegno, il numero di livelli dell'albero e' pari a 5, anche se le variabili sono
solamente 2.

Alcune osservazioni:

i nodi con la X rappresentano soluzioni al di fuori dell'area amissibile, di conseguenza


non vengono ulteriormente ramificati.
in (*), si è raggiunto un valore intero per la SO: solamente x1 è intero, x2 no: bisogna
esplicitare ulteriormente l'unico nodo possibile in modo da trovare un valore intero
anche per x2.
in (**) sia x1 che x2 hanno valori interi: si è raggiunta la soluzione ottima relativa al
problema intero.

80