Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Problemi di ottimizzazione e programmazione matematica, Appunti di Ricerca Operativa

Principali argomenti della ricerca operativa utilizzati nei processi decisionali tramite processi analitici che andranno a trovare l’ottimo per una funzione obiettivo.

Tipologia: Appunti

2019/2020

Caricato il 14/04/2020

simone.lombardo
simone.lombardo 🇮🇹

2 documenti

1 / 15

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Dispense del corso di Ottimizzazione Combinatoria (IN440)
5. Problemi di Ottimizzazione e
Programmazione Matematica
Marco Liverani
Università degli Studi Roma Tre
Dipartimento di Matematica e Fisica
Corso di Laurea in Matematica
Aprile 2014
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Anteprima parziale del testo

Scarica Problemi di ottimizzazione e programmazione matematica e più Appunti in PDF di Ricerca Operativa solo su Docsity!

Dispense del corso di Ottimizzazione Combinatoria (IN440)

5. Problemi di Ottimizzazione e

Programmazione Matematica

Marco Liverani

Università degli Studi Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica E-mail [email protected]

Aprile 2014

2 M. Liverani – IN

Revisione del 13 aprile 2014.

4 M. Liverani – IN

Classe Descrizione Problemi di decisione o di esistenza Si richiede di verificare se esiste o meno una certa soluzione per l’istanza del problema Problemi di ricerca Si richiede di costruire ed esibire una soluzione per l’istanza del problema Problemi di enumerazione Si richiede di costruire ed esibire tutte le soluzioni per l’istanza del problema Problemi di ottimizzazione Si richiede di costruire le soluzioni ottimali in base ad un determinato criterio (funzione obiettivo o di costo)

Tabella 1: Una classificazione dei problemi in base al tipo di soluzione richiesta

se una soluzione esiste o meno per quella determinata istanza del problema. Risolvere problemi di enumerazione sarà quindi più laborioso che risolvere problemi di ricerca; risolvere problemi di ricerca sarà più laborioso che risolvere problemi di esistenza. Arriviamo così alla formulazione dei problemi di ottimizzazione: in questo caso non ci si accon- tenterà né di stabilire soltanto se una soluzione esiste, né di identificare una soluzione qualsiasi per l’istanza del problema e neanche di identificare tutte le soluzioni del problema stesso, indistintamente; si richiede, invece, di identificare una o tutte le soluzioni che risultano ottimali rispetto ad un qualche criterio di valutazione delle soluzioni ammissibili per una specifica istanza del problema. Ad esempio tra tutti gli zeri della funzione f (x) nell’intervallo (a, b) si chiederà di individuare quelli che rendono minima la funzione ϕ(x) nell’intervallo stesso; tra tutti i cammini che sul grafo G collegano i vertici u e v si chiederà di trovare quelli di lunghezza minima o che minimizzano il costo dato dalla somma dei pesi attribuiti a ciascuno spigolo del grafo, e così via. In un problema di ottimizzazione viene quindi fornita anche una funzione con cui valutare il costo di ciascuna soluzione del problema: questa funzione, detta funzione obiettivo, costituisce un criterio di scelta tra le possibili soluzioni del problema, ossia uno strumento, una bussola, con cui orientarsi nell’insieme delle soluzioni ammissibili con l’intento di selezionare solo le soluzioni migliori, quelle che “minimizzano” il costo o massimizzano il “profitto”. Nel seguito ci occuperemo quasi esclusivamente di problemi di ottimizzazione; in particolare, co- me vedremo tra breve, ci occuperemo di una particolare classe di problemi che va sotto il nome di problemi di ottimizzazione combinatoria. In generale per questi problemi l’insieme delle soluzioni ammissibili entro cui cercare il sottoinsieme di soluzioni ottimali è un insieme discreto, di cardinalità finita; tuttavia il numero di elementi di cui è costituito è di un ordine di grandezza molto superiore alla dimensione dell’istanza del problema che si intende risolvere.

2 Formulazione generale per i problemi di ottimizzazione

In termini molto generali un’istanza di un problema di ottimizzazione è definita come una coppia (A, f ), dove A è l’insieme delle soluzioni ammissibili ed f : A → R è la funzione obiettivo che si deve ottimizzare (massimizzare o minimizzare). Il problema di ottimizzazione viene posto chiedendo di trovare i valori x ∈ A tali che f (x) ≤ f (y) per ogni y ∈ A (problema in forma di minimizzazione). Tali valori x costituiscono delle soluzioni ottime globali per il problema; nel caso in cui risulti invece f (x) ≤ f (y) soltanto per ogni y appartenente ad un intorno di x, allora la soluzione x si dice soluzione ottima locale.

Problemi di Ottimizzazione e Programmazione Matematica 5

x

y S (^) z x^ z

y

S'

Figura 1: Un insieme convesso S ed un insieme S′^ non convesso (concavo): S′^ è tale che, fissata una cop- pia di punti x, y ∈ S′, esistono altri punti z = λx + ( 1 − λ)y che, per alcuni valori di λ ∈ [ 0 , 1 ], non appartengono ad S′

L’insieme A delle soluzioni ammissibili è l’insieme entro il quale devono essere cercate le soluzioni che rendono minima o massima la funzione obiettivo: la definizione di A è una caratteristica specifica di ciascun problema e consente di escludere punti dello spazio su cui sono definite le variabili del problema su cui non è utile o non ha senso cercare la soluzione. Non si deve necessariamente pensare all’insieme A come ad un sottoinsieme o un intervallo della retta reale: spesso infatti l’insieme A è un sottoinsieme di Rn^ o un insieme discreto definito in modo più articolato, come ad esempio un sottografo con determinate caratteristiche. Ad esempio il problema della ricerca del cammino più breve tra due vertici u e v di un grafo G, può essere formulato come problema di ottimizzazione definendo l’insieme A delle soluzioni ammissibili come la collezione di tutti i cammini semplici in G dal vertice u al vertice v; la funzione obiettivo f : A → R viene definita come la funzione che associa ad ogni cammino p ∈ A la sua lunghezza. I cammini ottimi sono quelli che rendono minima la funzione obiettivo, ossia quei cammini da u a v con la lunghezza minima. Nella formulazione di un problema di ottimizzazione un aspetto assai critico e rilevante è costituito dalla corretta definizione dell’insieme delle soluzioni ammissibili; è necessario circoscrivere questo sottoinsieme dello “spazio delle soluzioni”, senza escludere punti dello spazio che possano corrispon- dere ad una soluzione ammissibile e dunque potenzialmente ottima e al tempo stesso cercando di ridurre al massimo l’insieme entro cui eseguire la ricerca delle soluzioni, per rendere più efficien- te e meno oneroso in termini computazionali, il procedimento di calcolo adottato per individuare le soluzioni ottime. In generale quindi l’insieme A delle soluzioni ammissibili viene definito attraverso un insieme di vincoli che limitano e circoscrivono l’insieme entro cui possono assumere valori le variabili del problema. In particolare tra i problemi di ottimizzazione rivestono notevole importanza i problemi di pro- grammazione matematica. In questo genere di problema i vincoli che circoscrivono l’insieme A delle soluzioni ammissibili sono costituiti da un certo numero, anche molto ampio, ma sempre fini- to, di equazioni e disequazioni; da qui il nome di questa classe di problemi. In generale quindi un problema di programmazione matematica viene definito come segue:

minimizzare f (x) per x tale che gi(x) ≥ 0 i = 1 , 2 ,... , m (1) h (^) j(x) = 0 j = 1 , 2 ,... , p

Le funzioni gi e h (^) j costituiscono i vincoli del problema. Dati due punti dello spazio x, y ∈ Rn^ una combinazione convessa di x e y è un punto z dello spazio definito come z = λx + ( 1 − λ)y, con λ ∈ R e 0 ≤ λ ≤ 1. Un insieme S ⊆ Rn^ è convesso se contiene qualsiasi combinazione convessa di ogni coppia di elementi distinti di S; in altri termini S è convesso

Problemi di Ottimizzazione e Programmazione Matematica 7

Proposizione 3. In un problema di programmazione convessa ogni soluzione ottima locale è anche una soluzione ottima globale.

Dimostrazione. Supponiamo che per un determinato problema di programmazione convessa (A, f ) risulti f (x) ≤ f (y) per ogni y ∈ N(x) ⊆ A (indichiamo con N(x) un intorno del punto x) e che esista un punto z 6 ∈ N(x), z ∈ A, tale che f (x) 6 ≤ f (z). In questo caso x sarebbe una soluzione ottima locale, ma non globale. Dunque se così fosse, allora esisterebbe sicuramente un punto y ∈ N(x) tale che possa essere espresso come combinazione convessa di x e z: y = λx + ( 1 − λ)z. In questo caso si avrebbe f (z) < f (x) ≤ f (y) contraddicendo così la convessità di f.

3 Programmazione lineare

Le funzioni lineari sono un caso molto particolare di funzioni convesse. Se la funzione obiettivo ed i vincoli del problema di ottimizzazioni sono funzioni lineari, allora il problema di programmazione matematica che si ottiene è un problema di programmazione lineare (LP). È facile osservare che se la funzione obiettivo è lineare, allora i suoi punti di minimo o di massimo si trovano sicuramente sulla frontiera dell’insieme A delle soluzioni ammissibili. Proprio su questo principio si basa il celebre metodo per la risoluzione di problemi di programma- zione lineare proposto dal matematico americano George Dantzig nel 1947 e noto come algoritmo del simplesso. L’algoritmo proposto da Dantzig opera su un simplesso, ossia un politopo in n dimen- sioni con n + 1 vertici (ad esempio, in uno spazio di dimensione n = 3, un simplesso è un tetraedro, il poliedro con il minor numero di vertici). I vincoli del problema di ottimizzazione definiscono la regione ammissibile, cioè l’insieme dei punti che soddisfano tutti i vincoli del problema. Nel caso della programmazione lineare la regione ammissibile è un politopo (un poligono nel piano, un polie- dro nello spazio), che può essere vuoto (nel caso in cui non esistono soluzioni al problema), limitato o illimitato. La funzione obiettivo che deve essere minimizzata o massimizzata esprime il “costo” di ogni soluzione tenendo conto dei vincoli (ossia calcolando la soluzione all’interno del poliedro). L’algoritmo del simplesso è in grado di determinare di che tipo di poliedro si tratta e di individuare la soluzione ottima, che è, sotto opportune ipotesi, un vertice del poliedro, nel caso in cui il problema abbia una soluzione ottimale finita. Tra i problemi di programmazione lineare è opportuno distinguere i problemi di programmazione lineare intera (PLI): in questo caso alcune delle variabili del problema sono vincolate ad assumere soltanto valori interi. Questo vincolo ulteriore riduce drasticamente il numero di punti presenti nella regione ammissibile. Il problema di programmazione lineare diventa un problema di ottimizzazione combinatoria se tutte le variabili sono vincolate ad assumere soltanto valori interi. Quando in un problema di programmazione lineare intera si eliminano i “vincoli di integrità”, ossia i vincoli che impongono x ∈ Zn, si ottiene un problema di programmazione lineare detto rilassamento continuo. Se, inoltre, accade che le soluzioni ottime del problema originario sono anche soluzioni ottime del suo rilassamento continuo, si dice che il problema gode della proprietà di integralità. In effetti la proprietà di integralità riguarda l’insieme ammissibile del problema più che il problema in sè. Infatti la funzione obiettivo del rilassamento continuo ha lo stesso valore di quella del problema originario sul suo insieme ammissibile e, inoltre, poiché è un problema di programmazione lineare, ha sempre una soluzione ottima di vertice. Per chiarire meglio questi concetti, vediamo di seguito alcuni problemi classici di ottimizzazione combinatoria che possono essere formulati come problemi di Programmazione Lineare e di Program- mazione Lineare Intera.

8 M. Liverani – IN

3.1 Problema della bisaccia

Il problema della bisaccia binario (knapsack problem, in inglese) può essere posto come segue: ab- biamo a disposizione un sacco, una bisaccia, in grado di sopportare un carico pari a P, con cui siamo intenzionati a trasportare un certo numero di oggetti di peso e di valore diverso, selezionandoli da una collezione di n elementi, in modo tale da massimizzare il valore complessivo degli oggetti selezionati, ma senza rompere la bisaccia riempiendola con un peso eccessivo, superiore a P. Naturalmente ogni oggetto ha un peso intero ben definito e non è possibile rompere gli oggetti in modo da costituire oggetti più piccoli di peso inferiore: ciascun oggetto può essere preso per intero oppure deve essere lasciato al suo posto, rinunciando a trasportarlo. Qual è il modo migliore con cui è possibile operare la scelta degli oggetti da inserire nella bisaccia? Il problema può essere formulato come un problema di programmazione lineare intera indicando con ci e pi rispettivamente il valore e il peso dell’i-esimo oggetto. Con la variabile binaria xi ∈ { 0 , 1 } indicheremo se l’oggetto i-esimo è stato scelto (xi = 1) oppure se è stato scartato (xi = 0). In questo modo la soluzione ottima del problema è una sequenza x = (x 1 , x 2 ,... , xn) ∈ { 0 , 1 }n^ con cui possiamo identificare il contenuto della bisaccia; il problema di ottimizzazione può essere posto nei seguenti termini:

massimizzare f (x) =

n ∑ i= 1

cixi n ∑ i= 1

pixi ≤ P (3)

xi ∈ { 0 , 1 } i = 1 , 2 ,... , n

Le variabili del problema, x 1 ,... , xn, non soltanto sono intere, ma addirittura sono vincolate ad assumere valori binari: xi = 0 oppure xi = 1. In questi casi si parla di problema di programmazione lineare intera “0-1”. Il problema è chiaramente di tipo combinatorio: le soluzioni ammissibili sono in numero finito e possono essere anche prodotte in modo esaustivo, costruendo tutte le sequenze binarie con n caratteri; tuttavia questo approccio conduce ad un algoritmo di complessità esponenziale nella dimensione n dell’istanza del problema, dal momento che il numero di stringhe binarie con n caratteri (o, come abbiamo visto in precedenza, l’insieme delle parti di un insieme di cardinalità n) sono 2n.

3.2 Problema dell’assegnazione di task

Un problema classico di pianificazione riguarda l’assegnazione di task ai processori di un calcolatore parallelo, alle macchine di una rete di calcolatori che cooperano per la soluzione di uno stesso proble- ma o ad un gruppo di persone. Supponiamo che n processori debbano svolgere m task. Ciascuno di essi deve essere svolto esattamente da un processore ed inoltre, ciascun processore può svolgere al al massimo un task. Indichiamo con ci j il costo dell’utilizzo del processore i per l’esecuzione del task j. Il problema chiede di assegnare i task alle varie risorse (processori, calcolatori o persone, a seconda del contesto applicativo) minimizzando il costo totale per la realizzazione di tutti gli m task previsti. Per formulare questo problema in termini di programmazione lineare intera, introduciamo le variabili binarie xi j, per i = 1 ,... , n e j = 1 ,... , m corrispondenti all’evento “i j” (esecuzione del task j da parte della risorsa i) definite come segue xi j = 1 se il task j viene eseguito dalla risorsa i e xi j = 0 altrimenti. Poiché esattamente una ed una sola risorsa deve essere assegnata al task j, avremo i seguenti vincoli: n ∑ i= 1

xi j = 1 , per ogni j = 1 , 2 ,... , m

10 M. Liverani – IN

può così essere riformulata come segue:

minimizzare f (x) = ct^ x per x tale che Ax ≤ b (4) A ∈ Rm×n, b ∈ Rm, c ∈ Rn

L’insieme di disequazioni lineari Ax ≤ b definisce un poliedro P come intersezione dei semispazi definiti da ciascuna disequazione. È all’interno di P che sono da ricercare le soluzioni ottime del problema, tra tutte le soluzioni ammissibili. Esistono due casi degeneri per un problema di programmazione lineare: il caso in cui il problema non ammette nessuna soluzione, quando cioè i vincoli producono un poliedro nullo, P = 0 /, o il caso in cui il problema ammette infinite soluzioni, quando il poliedro P è illimitato. Quando il problema di programmazione lineare è ben posto e dunque P non è né nullo, né illimitato, diremo che P è un politopo. Un simplesso, il termine che dà il nome all’algoritmo di Dantzig, è un politopo di n + 1 vertici in n dimensioni: un segmento in dimensione 1, un triangolo in dimensione 2 e un tetraedro in dimensione 3. Cerchiamo di formalizzare meglio questi concetti. Innanzi tutto chiamiamo vertice di un poliedro P un punto x ∈ P tale che non esistono altri due punti x′, x′′^ ∈ P, con x 6 = x′, x′′^ e x ∈ [x′, x′′]. Non tutti i poliedri ottenuti come intersezioni di semispazi definiti mediante disequazioni lineari hanno almeno un vertice. Ad esempio se consideriamo un unico semispazio di R^2 , questo non ha vertici. Dunque il poliedro P = {x ∈ Rn^ : Ax ≥ b} non ha vertici se la matrice A ha un numero di righe minore di n: in tal caso non è possibile trovare n vincoli linearmente indipendenti che circoscrivano un poliedro chiuso. Un poliedro P non ha vertici se contiene rette: diremo che un poliedro P contiene una retta se esiste un punto ˜x ∈ P e un vettore non nullo d ∈ Rn^ tale che ˜x + λd ∈ P per ogni λ ∈ R. Possiamo infine enunciare il seguente Teorema fondamentale della Programmazione Lineare:

Teorema 1. Si consideri il problema di Programmazione Lineare

min ct^ x Ax = b

Supponiamo che il poliedro P = {x ∈ Rn^ tale che Ax = b} non contenga rette. Allora una e una sola delle seguenti tre affermazioni è vera:

  1. il problema è inammissibile, ovvero il poliedro P è vuoto;
  2. il problema è illimitato inferiormente;
  3. il problema ammette soluzioni ottime e almeno una di queste è un vertice del poliedro P.

L’algoritmo del simplesso non consiste altro che in una “visita intelligente” dei vertici di P; il teorema fondamentale della programmazione lineare garantisce infatti che la soluzione ottimale del problema, se esiste, è situata in uno di questi vertici. Muovendosi sugli spigoli del poliedro, da un vertice ad un altro, il metodo del simplesso cerca di individuare una soluzione ottima, che massimizzi o minimizzi la funzione obiettivo.

Consideriamo la matrice A ∈ Rm×n; se I è un insieme di indici di riga di A, indichiamo con AI la

sottomarine di A composta con le sole righe in I ; analogamente se b è un vettore, indichiamo con bI

il sottovettore composto dalle sole componenti di indice in I. Indichiamo con ai la riga A{i} e con

Problemi di Ottimizzazione e Programmazione Matematica 11

Algoritmo 1 SIMPLESSO(A, b, c)

Input: Una matrice di coefficienti A ∈ Rm×n, il vettore dei termini noti b ∈ Rm, il vettore dei costi ct^ ∈ Rn, un vertice x ∈ P = {x ∈ Rn^ : Ax ≤ b} Output: Un vertice x∗^ ∈ P tale che ct^ x∗^ = maxx∈P{ct^ x}, oppure un vettore w ∈ Rn^ con Aw ≤ 0 e ct^ w > 0 (il poliedro P è illimitato)

1: Scegli un insieme di n indici di riga I tali che AI è non singolare e AI x = bI

2: Calcola c (AI )−^1 e aggiungi gli zeri necessari per ottenere un vettore y tale che c = yA e tutti gli

elementi di y fuori da I siano nulli

3: se y ≥ 0 allora 4: return x e y; stop 5: fine-condizione 6: Sia i il minimo indice per cui risulta yi < 0 7: Sia w la colonna di −(AI )−^1 con indice i, tale che AI {i}w = 0 e aiw = − 1 8: se Aw ≤ 0 allora 9: return w; stop 10: fine-condizione 11: Sia λ := min (^) j= 1 ,...,m

{ (^) b j −a^ j x a (^) j w :^ a^ jw^ >^0

e sia j il più piccolo indice di riga con cui si ottiene questo minimo

12: Sia I := (I \ {i}) ∪ { j} e x := x + λw

13: Vai al passo 2

bi = b{i}. Utilizzando queste notazioni formalizziamo il Metodo del Simplesso con lo pseudo codice dell’Algoritmo 1. È possibile dimostrare che l’Algoritmo del Simplesso termina al massimo dopo

(m n

iterazioni del ciclo 2–13. Se l’algoritmo restituisce x e y al passo 4, allora x e y sono i vettori che rappresentano le soluzioni ottime per i seguenti problemi di programmazione lineare, con c x = y b:

max{c x : Ax ≤ b} (5) min{y b : ytA = ct, y ≥ 0 } (6)

Infine, se l’algoritmo restituisce il vettore w al passo 9, allora cw > 0 e il problema di programmazione lineare (5) è illimitato. Il problema di programmazione lineare espresso da (5) viene chiamato problema primale, mentre il problema di programmazione lineare (6), associato al precedente, viene chiamato problema duale.

5 Programmazione lineare per problemi di ottimizzazione su grafi

Per concludere questa breve panoramica sui problemi di programmazione matematica e su quelli di programmazione lineare in particolare, vediamo alcune applicazioni della programmazione lineare alla teoria dei grafi. Una volta impostato il problema in termini di programmazione lineare è possibile calcolarne una soluzione con l’algoritmo del simplesso, che garantisce l’identificazione di una solu- zione ottima, al costo di una complessità computazionale più elevata di un algoritmo specificamente progettato per risolvere un determinato problema (es.: il problema del cammino minimo tra due verti- ci di un grafo). Di seguito consideriamo alcuni problemi classici di ottimizzazione combinatoria con l’obiettivo di offrirne una formulazione in termini di programmazione lineare intera:

Problemi di Ottimizzazione e Programmazione Matematica 13

Riassumendo, il problema della massima clique può essere formulato come problema di program- mazione lineare intera nel modo seguente:

  

max (^) ∑vi∈V xi ∀ (vi, v (^) j) ∈/ E, xi + x (^) j ≤ 1 ∀ vi ∈ V, xi ∈ { 0 , 1 }

5.3 Cammino di costo minimo

Sia G = (V, E) un grafo con dei pesi non negativi assegnati agli spigoli: per ogni (vi, v (^) j) ∈ E(G) di j ≥ 0 sia il peso corrispondente. Dati due vertici s,t ∈ V , si vuole trovare un cammino p da s a t per cui la somma dei pesi assegnati agli spigoli sia minima. Per formulare il problema in termini di programmazione lineare, si introducono le seguenti variabili, questa volta una per ogni spigolo:

∀ (vi, v (^) j) ∈ E(G) xi j =

1 se (vi, v (^) j) è nel cammino p : s t 0 altrimenti

Per trovare una soluzione del problema dobbiamo quindi minimizzare la seguente funzione obietti- vo: ∑(vi,v (^) j )∈E di jxi j. Affinché un insieme di spigoli del grafo G costituisca un cammino da s a t bisogna assicurarsi che esattamente uno spigolo del cammino esca da s e nessuno entri in esso, esattamente uno spigolo del cammino entri in t e nessuno esca da esso e che per tutti gli altri vertici il numero di spigoli del cammino uscenti sia pari a quello di spigoli entranti. Formalizzando si ottengono i seguenti vincoli:

∑ (vi,vh)∈E

xh j − (^) ∑ (v (^) j ,vi)∈E

xi j =

− 1 , vh = s 1 , vh = t 0 , ∀ vh ∈ V \ {s,t}

Riassumendo, il problema del cammino minimo può essere formalizzato nel modo seguente come un problema di programmazione lineare intera:

      

∑(vi,v (^) j )∈E di jxi j ∑(vi,vh)∈E xh j −^ ∑(v (^) j ,vi)∈E xi j =^ −^1 ,^ se^ vh =^ s ∑(vi,vh)∈E xh j − ∑(v (^) j ,vi)∈E xi j = 1 , se vh = t ∑(vi,vh)∈E xh j −^ ∑(v (^) j ,vi)∈E xi j =^0 ,^ se^ vh ∈^ V^ \ {s,t} ∀ (vi, v (^) j) ∈ E, xi j ∈ { 0 , 1 }

5.4 Albero ricoprente di costo minimo

Un albero ricoprente (spanning tree) di un grafo G = (V, E) è un albero T = (V, E′), con E′^ ⊆ E, ossia un albero con gli stessi vertici di G e n − 1 spigoli di G, affinché T sia un grafo connesso e aciclico (un albero). Se associamo un peso non negativo w(u, v) ad ogni spigolo (u, v) ∈ E(G), è possibile definire il problema di ottimizzazione combinatoria che chiede di costruire l’albero ricoprente di G di peso minimo, ossia l’albero T ∗^ tale che

∑ (u,v)∈E(T ∗)

w(u, v) = min T che ricopre G (^) (u,v∑)∈E(T ) w(u, v)

14 M. Liverani – IN

v 3

v 1

v 2

e 3 = (^

v 1 ,^ v^3 )

w (e^3

) = 10

2^ e = ( v (^1) , (^) v (^2) )

w (e (^2) ) = 20

e 2 = ( v 2 , v 3 ) w (e 2 ) = 30 (a)

x 1

x 2

x 3

1

1

1

x = (1, 0, 1)

x ’’ = (1, 1, 0)

x ’’’ = (0, 1, 1)

(b)

Figura 4: Un grafo pesato G = (V, E) e il politopo con la regione delle soluzioni ammissibili per il problema MST.

Anche in questo caso, per formulare il problema in termini di programmazione lineare, si introdu- cono le seguenti variabili associate agli spigoli del grafo:

∀ ei ∈ E(G) xi =

1 se ei ∈ E(T ) 0 altrimenti

In questo modo possiamo formulare il problema del minimo albero ricoprente (MST – minimum spanning tree) come segue:

min f (x) = ∑mi= 1 w(ei)xi per x tale che x 1 + x 2 + · · · + xm = n − 1 xi ≥ 0 per i = 1 , 2 ,... , m xi ≤ 1 per i = 1 , 2 ,... , m

Per aiutare a visualizzare il significato geometrico di questa formulazione, consideriamo il gra- fo G = (V, E) definito ponendo V = {v 1 , v 2 , v 3 }, E = {e 1 = (v 1 , v 2 ), e 2 = (v 2 , v 3 ), e 3 = (v 1 , v 3 )}; supponiamo anche che w(e 1 ) = 20, w(e 2 ) = 30 e w(e 3 ) = 10. Il grafo è rappresentato in Figura 4(a).

Effettuando un rilassamento continuo del problema, possiamo rappresentare l’insieme delle so- luzioni ammissibili con il poliedro (triangolo) evidenziato in Figura 4(b), ossia il poliedro a 2 di- mensioni collocato nello spazio a 3 dimensioni, con vertici nei punti x′^ = ( 1 , 0 , 1 ), x′′^ = ( 1 , 1 , 0 ) e x′′′^ = ( 0 , 1 , 1 ). Per il vincolo di integrità delle variabili del problema (dobbiamo scegliere uno spigo- lo o non sceglierlo per nulla, non possiamo prenderne solo un pezzo!), le soluzioni del problema si trovano proprio nei vertici del politopo costituito dal triangolo. In particolare, come si può osservare facilmente senza la necessità di applicare l’Algoritmo del Simplesso, la soluzione ottima è costituita dal punto x′′^ = ( 1 , 0 , 1 ): questo punto rappresenta l’albero ricoprente costruito scegliendo gli spigoli e 1 ed e 3 , con peso complessivo f (x′′) = w(e 1 ) + w(e 3 ) = 20 + 10 = 30.