Sei sulla pagina 1di 16

Ricerca Operativa

Procedimenti esercizi esame - Anno 2016/2017

Soluzioni ammissibili e/o degeneri


Primale

 Una soluzione è ammissibile se non viola nessun vincolo;


 Una soluzione è degenere se sostituendola in uno dei vincoli non di base risulta
verificata l’uguaglianza;

Duale

 Una soluzione è ammissibile se tutte le componenti del vettore sono positive;


 Una soluzione è degenere se almeno una componente di base è uguale a 0;

1
Simplesso primale

1. Scrivo la matrice A avente i coefficienti delle disequazioni del problema di


massimo dato;
2. Considero solo le due disequazioni aventi indici uguali a quelli della base
data (ES: B(1,3) considero la prima e la terza disequazione);
3. Costruisco un sistema con le disequazioni considerate ma prese con
l’uguale;
4. Ottengo la x richiesta risolvendo il sistema;
5. Costruisco il duale facendo la trasposta della matrice e affiancandole i
coefficienti della funzione obiettivo;
6. Sempre considerando gli indici della base data, prendo le disequazioni
corrispondenti, costruisco un altro sistema di equazioni e risolvo
ottenendo la y richiesta;
7. L’indice della prima componente di y negativa sarà l’indice entrante (h);
8. Scrivo una matrice AN con tutti i coefficienti delle disequazioni non di base
e una AB con tutti i coefficienti delle disequazioni in base;
9. Calcolo l’inversa di AB e la cambio di segno;
10. Moltiplico ogni riga di An per la colonna di indice h-esimo di AB ed
escludo quelli che risultano <= 0;
11. Calcolo i rapporti ignorando quelli i cui indici sono di base (ES: B(3,4)
con 4 disequazioni calcolo solo r1 ed r2) usando la formula:
ri=(bi – Aix)/Aiwh
dove per bi si intende il termine noto della disequazione i-esima;
12. L’indice del rapporto di valore minore sarà l’indice uscente k;

2
Simplesso duale
1. Scrivo la matrice A avente i coefficienti delle disequazioni del problema di
minimo dato;
2. Considero solo le due disequazioni aventi indici uguali a quelli della base
data (ES: B(1,3) considero la prima e la terza disequazione);
3. Costruisco un sistema con le disequazioni considerate ma prese con
l’uguale;
4. Ottengo la y richiesta risolvendo il sistema;
5. Costruisco il primale facendo la trasposta della matrice e affiancandole i
coefficienti della funzione obiettivo;
6. Sempre considerando gli indici della base data, prendo le disequazioni
corrispondenti, costruisco un altro sistema di equazioni e risolvo
ottenendo la x richiesta;
7. Sostituisco la x ottenuta nelle disequazioni, tranne in quelle di base, e
vedo se sono verificate. L’indice della prima disequazione non verificata
rappresenta l’indice entrante h;
8. Scrivo una matrice An con tutti i coefficienti delle disequazioni non di base
e una Ab con tutti i coefficienti delle disequazioni in base;
9. Calcolo l’inversa di Ab e la cambio di segno;
10. Moltiplico la riga di indice h-esimo di An per ogni colonna di Ab;
11. Calcolo i rapporti ignorando quelli i cui indici sono di base (ES: B(3,4)
con 4 disequazioni calcolo solo r1 ed r2) usando la formula:

ri = -yi/Ahwi
dove per yi si intende la componente i-esima di y;
12. L’indice del rapporto di valore minore sarà l’indice uscente k;

3
Allocazione ottima di risorse
1. Si scelgono le variabili decisionali (x1 ... xn). Per esempio in un problema di
produzione in cui si producono i beni A e B e si deve decidere quanto
produrre di uno e quanto dell’altro si prendono come variabili xA e xB;
2. Si sceglie la funzione obiettivo ovvero la funzione che vogliamo ottimizzare
che può essere di massimo o di minimo. Se si considera il profitto ottenuto
dalla vendita dei beni A e B rispettivamente 90 e 120 ed è richiesto di
trovare una funzione che ricavi il massimo guadagno allora si sceglie come
funzione obiettivo: max(90xA+120xB);
3. Si scelgono i vincoli ovvero una serie di equazioni e/o disequazioni che
restringono la regione ammissibile del problema. Se ad esempio venisse
richiesto di produrre almeno 3 beni di tipo A allora si dovrebbe scrivere
come vincolo xA>=3 tuttavia trattandosi di un problema di massimo si
scriverebbe -xA<=-3;

4
Comandi linprog e intlinprog
Il problema va considerato sempre come problema di minimo.

 A: Matrice dei coefficienti delle variabili dei vincoli del problema escluse le
uguaglianze. Viene rappresentata come A=[v1 v2;v3 v4; ... ;vn-1 vn] ovvero mettendo
tutti gli elementi di una stessa riga separati da uno spazio e il “;” per distinguere una
riga dalla successiva;
 b: Vettore dei termini noti dei vincoli del problema escluse le uguaglianze. Viene
rappresentato come b=[t1;t2; ... ;tm];
 c: Vettore dei coefficienti delle variabili della funzione obiettivo. Viene rappresentato
come c=[o1;o2; ... ;ok];
 Aeq: Matrice dei coefficienti delle variabili dei vincoli del problema escluse le
disuguaglianze. Si indica come A;
 beq: Vettore dei termini nodi dei vincoli del problema escluse le disuguaglianze. Si
indica come b;
 LB: Vettore indicante il minimo valore che può assumere ogni variabile. Viene indicato
come LB=[mX1;mX2; ... mXp];
 UB: Vettore indicante il massimo valore che può assumere ogni variabile. Viene
indicato come LB=[MX1;MX2; ... MXp];
 intcon: Solo per i problemi che necessitano di imporre alcune variabili intera si usa
questo vettore contenente gli indici delle variabili che devono per forza essere intere.
Viene indicato come intcon=[I1 I2, ... Is];

5
Reti – Flusso di costo minimo
Trovare la X
1. Riscrivo il grafo considerando i soli nodi di T e di U elencati in tabella;
2. Scrivo l’elenco di tutti gli archi compresi quelli del grafo iniziale;
3. Metto a 0 tutti gli archi che non si trovano nel nuovo grafo ottenuto;
4. Metto l’arco in U uguale al valore della capacità (secondo valore);
5. Su ogni nodo è indicato il bilancio, se questo valore è negativo vuol dire che produce
una certa quantità, se invece è positivo vuol dire che ne necessita. Partendo dalle
foglie si deve fare in modo che i nodi che producono mandino abbastanza valore da
soddisfare la richiesta dei nodi che non producono. Si compila quindi la tabella
indicando la quantità che viene mandato dal nodo i al nodo j con i!=j che sarà positiva
se il verso è concorde, negativa se il verso è discorde;
6. Si avrà l’ammissibilità se non ci sono componenti del vettore x ottenuto negative;
7. Sarà degenere se c’è almeno una componente di base uguale a 0;

Trovare il π
1. Riscrivo il grafo considerando i soli nodi di T e di U elencati in tabella;
2. Scrivo l’elenco di tutti i nodi in ordine crescente;
3. Metto 0 come valore del nodo 1 nell’elenco e partendo da questo nodo sommo il
potenziale del nodo di partenza con il costo (primo valore) del nodo d’arrivo;
4. Calcolo i costi ridotti per ogni arco usando la formula:

cr = CostoArco + (PotNodoPartenza-PotNodoArrivo)
5. Se negli archi di L ed U c’è almeno uno 0 allora è degenere;
6. E’ ammissibile se verifica le condizioni che gli archi di L>=0, U<=0 e T=0;

6
Simplesso su reti
1. Calcolo x e π come descritto sopra;
2. Calcolo i costi ridotti degli archi in ordine lessico-grafico usando la formula:

cr = CostoArco + (PotNodoPartenza-PotNodoArrivo)

3. Quando trovo un arco di L<0 o uno di U>0 allora ho trovato l’arco


entrante;
4. Se l’arco entrante appartiene a L allora pongo C+ uguale all’arco e
posiziono gli altri archi che formano il ciclo insieme a quello entrante in C+
o C- in base al verso (se uguale a quello dell’arco entrante allora in C+
altrimenti in C-). Viceversa se l’arco entrante appartiene a U allora pongo
C- uguale all’arco e posiziono gli altri archi che formano il ciclo insieme a
quello entrante in C+ o in C- in base al verso (se uguale a quello dell’arco
entrante allora in C- altrimenti in C+);
5. Calcolo:

θ+= min {uij-xij (i,j) ∈ C+};

θ-= min {xij : (i,j) ∈ C-}

Dove uij è la capacità dell’arco mentre xij è il suo flusso.

6. Trovo l’arco uscente scegliendo il minimo tra i due ottenuti nel punto 5;

7
Albero dei cammini minimi - Dijkstra

1. Si procede vedendo la distanza partendo dal nodo di partenza X a tutti i nodi a cui è
collegato con un cammino orientato;
2. Ogni volta che si compila una riga della tabella si sceglie un nuovo nodo che sarà
quello avente distanza minore tra quelli che non sono stati ancora analizzati;
3. Ad ogni passo si sommano i valori degli archi partendo dal nodo di partenza X e
passando per il nodo considerato. Se questo valore è minore del valore corrente
viene sostituito;
4. Ad ogni passo aggiorno anche Q che sarà uguale alla Q precedente, togliendo il nodo
considerato e aggiungendo quelli raggiungi da quel nodo in quella iterazione;

8
Ford-Fulkerson
Algoritmo della croce

1. Traccio una linea verticale, sulla colonna di sinistra metto il nodo 1 e sulla destra
metto tutti i nodi a cui esso è collegato;
2. Traccio una linea orizzontale subito sotto e scrivo sulla colonna di sinistra il nodo
minore a cui era collegato il nodo precedente e metto a destra i nodi a cui esso è
collegato ignorando eventuali nodi già presenti nella colonna di destra;
3. Se il nodo non è collegato a niente oppure se i nodi a cui è collegato sono stati già
tutti considerati si mette “-“;
4. Mi fermo appena compare nella colonna di destra l’ultimo nodo;
5. Partendo dall’ultimo elemento della colonna di destra mi sposto sulla colonna di
sinistra e poi sull’elemento della colonna di destra corrispondente all’elemento di
sinistra che stiamo considerando e continuo fino in cima ottenendo così (letta al
contrario) una sequenza;

Ford-Furkerson

1. Partendo dal nodo 1 faccio l’algoritmo della croce e considerando la sequenza di nodi
ottenuta seleziono l’arco avente valore minimo ottenendo il δ;
2. Pongo v uguale alla sommatoria di tutti i δ (che nel primo passo corrisponde a dire
v=δ) e sottraggo ad ogni arco della sequenza considerata il δ;
3. Continuo ottenendo sequenze sempre diverse poiché ad ogni iterazione si annulla
almeno un arco che quindi non può essere considerato nell’algoritmo della croce;
4. Mi fermo nel momento in cui il nodo 6 non è più raggiungibile perché gli archi che
portano a lui sono azzerati;

9
Taglio di Gomory
Trovare la VI e la Vs
1. Per i problemi di massimo la Vs si ottiene dal rilassamento e la VI arrotondando il
rilassato;
2. Per i problemi di minimo la VI si ottiene dal rilassamento e la VS arrotondando il
rilassato;

Rilassamento
1. Risolvo il sistema dato considerando le disequazioni con l’uguale e il punto P1, pongo
x1=0 e calcolo P2 e P3 e poi pongo x2=0 e calcolo P4 e P5;
2. Sostituisco i punti nella funzione obiettivo e vedo quale ha valore minimo o valore
massimo (in base al problema dato) ottenendo così il rilassamento che va
arrotondato sempre per eccesso;
3. Il punto scelto viene arrotondato per eccesso e nuovamente sostituito nella funzione
obiettivo ottenendo il rilassato arrotondato;

Taglio di Gomory
1. Porto il problema in formato duale standard utilizzando le variabili di scarto per
soddisfare le uguaglianze;
2. Si scrive il nuovo punto che avrà le prime due componenti uguali a quelle del punto
precedentemente scelto per calcolare il rilassamento e le altre due (ovvero le
variabili di scarto) vanno calcolate sostituendo nelle equazioni le componenti
conosciute. Almeno due componenti del vettore devono risultare 0;
3. Si scrive la matrice AB composta dai coefficienti delle variabili del sistema che sono in
base e AN composta da quelli non in base;
4. Si calcola A˜ moltiplicando AB-1 e AN e scelgo una delle due righe;
5. Scrivo un’equazione avente per coefficienti la parte frazionaria delle componenti
della riga scelta. Per calcolare la parte frazionaria di un numero si applica la formula

{x} = x – [x]
dove x è il coefficiente preso in considerazione e [x] è la sua parte intera ovvero il
numero intero più piccolo che non supera il numero x. Ad esempio {-17/96}=79/96
oppure {11/96}=11/96 oppure {95/32}=31/32. Risolvendo la disequazione trovo il
taglio di Gomory richiesto.

10
Branch and Bound
Trovare la VI e la Vs
1. Per trovare la VI si disegna il k-albero richiesto e si sommano i valori degli archi;
2. Per trovare la VS usa l’algoritmo del nodo più vicino partendo dal nodo richiesto e si
sommano i valori degli archi;

Branch and Bound


1. Si costruisce un albero avente per radice il primo dei nodi richiesti dall’esercizio e
come valori di VI e VS quelli precedentemente calcolati;
2. Disegno due rami uno in cui considero l’impossibilità di considerare il nodo e l’altro in
cui considero l’obbligo di considerarlo;
3. Per ogni ramo calcolo la VI facendo il solito k-albero ma rispettando la condizione
imposta e verifico se questa è maggiore o uguale della VS attuale. Se così fosse, taglio
il ramo e ignoro tutto quello che verrebbe dopo. Se si arriva in un nodo in cui le
condizioni imposte non permettono ad ogni nodo di avere, in una qualsiasi
configurazione, almeno due rami allora l’insieme è vuoto e si taglia. Infine se a VI
ottenuta è maggiore della VS corrente e da ogni nodo, partono due rami, allora la VS
diventa uguale alla nuova VI e si rieffettua la visita dell’albero;
4. Procedo ogni volta inserendo come nuovi nodi quelli richiesti finché non si
esauriscono;

11
Zaino
Trovare la VI e la Vs

1. Calcolo i rendimenti facendo Valori/Volumi;


2. Per trovare la VI prendo ogni volta il bene di massimo rendimento e considero il suo
volume. Se aggiungendo questo bene non si raggiunge il volume massimo allora
scrivo “1” nel vettore e procedo con il successivo più grande. Se si supera il volume
massimo allora viene ignorato questo rendimento (mettendo “0” nel vettore) e
procedo con il successivo più grande. Ottengo così la soluzione ottima e sommando i
volumi corrispondenti alle componenti prese ottengo la VI;
3. Per trovare la VS faccio la stessa cosa solo che nel caso in cui supero il volume
massimo anziché mettere “0” nel vettore, inserisco il rapporto tra il volume rimasto
disponibile e il volume occupato da quell’indice. Ottengo così il rilassato continuo e
sommando i volumi corrispondenti alle componenti prese moltiplicate per i valori
delle componenti arrotondato per difetto ottengo la VS ;

Albero

1. Costruisco l’albero avente per radice il nodo di indice uguale a quello della
componente frazionaria del rilassato continuo;
2. Considero il ramo di destra quello in cui sono costretto a prendere il nodo e quello a
sinistra quello in cui sono costretto a non prenderlo e per ognuno di questi calcolo la
VS che se è minore o uguale della VS corrente e tutte le componenti del vettore
ottenuto sono 1 o 0 allora si sostituisce la VI corrente con la VS. Se la VS ottenuta è
minore o uguale della VI corrente il ramo viene tagliato e non considero più tutto
quello che viene dopo quel nodo;

12
LKKT

1. Faccio il disegno dei vincoli dati e vedo se l’insieme è limitato. Se lo è allora avrà
sicuramente mA e MA e possiamo ottenerli sostituendo gli eventuali punti dati nella
funzione obiettivo e vedendo quale ha valore massimo e quale valore minimo;
2. Vedo se la funzione è coerciva ovvero che il suo limite per x che tende a infinito è
uguale a infinito. Se lo è allora ammette minimo assoluto, se è anticoerciva (ovvero il
limite risulta meno infinito) allora ammette massimo assoluto;
3. Calcolo i gradienti e scrivo il sistema:

4. Risolvo il sistema sostituendo le X se ci vengono dati i punti o i λ e trovo quello che


mi manca;
5. Analizzo i λ ottenuti o dati:
 Se sono di segni discordi allora abbiamo un punto di sella;
 Se sono entrambi negativi allora non è un punto di minimo;
 Se sono entrambi positivi allora non è un punto di massimo;
6. Se non siamo riusciti a scoprire se un punto sia massimo locale o sella oppure minimo
locale o sella allora dobbiamo procedere con l’analisi locale.

Analisi locale

1. Si vede dove si trova il punto da analizzare nel grafico e in base a quello si sceglie se
avvicinarcisi in verticale o in orizzontale;
2. Se si sceglie di avvicinarsi verticalmente allora si pone la x2 uguale alla componente x2
del punto altrimenti orizzontalmente si fa la stessa cosa con x1.L’altra componente la
si pone uguale a t;
3. Si sostituiscono i valori nella funzione data e si disegna individuando;
4. Se presi in considerazione il punto +ɛ e il punto -ɛ il punto è di minimo/massimo in
entrambi i casi allora è un punto di minimo/massimo. Se in un caso è minimo e
nell’altro è massimo allora è un punto di sella;

13
Frank-Wolfe

1. Faccio il disegno rappresentando i vertici dati e unendoli;


2. Trovo il gradiente della funzione obiettivo data;
3. Sostituisco il punto dato xk nel gradiente calcolato nel punto sopra;
4. Moltiplico il gradiente per x così da ottenere una funzione in x1 e x2 avente per
coefficienti le componenti del gradiente;
5. Trovo il vertice yk in cui la funzione appena ottenuta ha valore minimo o massimo in
base al tipo di problema richiesto;
6. Trovo la direzione facendo la differenza tra yk e xk e ottengo la direzione dk;
7. Trovo il passo φ(t)=xk+tdk;
8. Calcolo f|φ(t) ovvero la funzione calcolata nel passo;
9. Trovo il valore minimo o massimo tk (in base al tipo di problema) di f|φ(t) ponendo la
sua derivata prima uguale a 0 e risolvendo rispetto a t;
10.Trovo il nuovo punto tramite la formula xk+1= xk+tkdk;

14
Metodo del gradiente proiettato
1. Faccio il disegno rappresentando i vertici dati e unendoli;
2. Segno la posizione del punto dato sul poliedro e calcolo la retta passante per i due vertici
che compongono il segmento su cui giace il punto. Ad esempio per il punto (-2;14/3) e i
vertici sotto elencati:

In questo caso si sarebbero considerati i vertici (-1,5) e (-4,4);


3. Si calcola la retta passante per i due vertici applicando la formula:

e la poniamo <=0;
4. Scrivo la matrice M avente per componenti i coefficienti di x e y della retta ottenuta;
5. Calcolo il gradiente della funzione e ci sostituisco il punto dato;
6. Calcolo la matrice H tramite la formula:

H = I – MT(M*MT)-1*M

Dove I è la matrice identica;

7. Trovo la direzione usando la formula (se è un problema di minimo si mette – altrimenti +):
d = ± H* ∇f
8. Si segna la direzione ottenuta sul grafico e si vede su quale segmento del poliedro si va a
fermare:

9. Si calcola l’equazione della retta passante per i due vertici che è stata trovata nel punto
precedente;
10. Studio A(xk+tdk)<=b dove A è la matrice formata dai coefficienti di x e y della retta ottenuta
nel punto 9 e b è il suo termine noto;
11. Calcolo f’(xk+tdk)=0 se è impossibile allora il massimo spostamento è il passo altrimenti il
massimo spostamento è la t trovata dall’equazione;
12. Calcolo xk+1=xk+tk dk;

15
16