Problemi di flusso Flusso a costo minimo MinCostFlow(G(V,E),b,l,u,c,min) Istanza: una rete G(V,E) per cui è dato un valore intero bi (flusso prodotto dal nodo) per ogni nodo vi un costo cij per flusso unitario e delle capacità intere minime lij e massime uij per ogni arco eij Reti Soluzione: un flusso xij per ogni arco eij t.c. in ogni nodo vi siano soddisfatte le condizioni di bilanciamento, i.e., la somma dei flussi uscenti più il flusso bi (eventualmente negativo) del nodo sia uguale alla somma dei flussi entranti: Σj∈ w+(i) xij = Σk∈ w-(i) xki + bi Problemi di percorso 25/06/2005 0.55 Obiettivo: il costo totale del flusso sia minimo, i.e., minΣ(i,j) ∈ E cij xij Commenti • Il problema si può applicare anche alle reti non orientate sdoppiando ogni arco in una coppia di archi anti-paralleli • I nodi con bi>0 vengono detti sorgenti, quelli con bi<0 pozzi Raffaele Pesenti Raffaele Pesenti 2 Problemi di flusso Problemi di flusso minΣ(i,j) ∈ E cij xij Commenti: Σj∈ w+(i) xij = Σk∈ w-(i) xki + bi ∀ i∈ N MinCostFlow ∝ LP il problema di flusso a costo minimo è in P poiché può essere formulato (quindi ridotto) in forma di programmazione lineare (LP) utilizzando un numero di variabili e vincoli polinomiale nella dimensione del problema. In particolare siano: – n i nodi di G (in seguito individuati dal solo indice i) – m gli archi di G (in seguito individuati dalla coppia degli indici (i,j) dei nodi estremi) – xij le variabili del problema corrispondenti ai flussi sugli archi (i,j) allora il problema può essere formulato come segue ... Raffaele Pesenti lij ≤ xij≤ uij ∀ (i,j)∈ E • m variabili • n vincoli di bilanciamento dei flussi ai nodi • 2m vincoli di capacità In forma matriciale mincx Ax = b l ≤ x≤ u dove A è la matrice di incidenza 3 Raffaele Pesenti 4 Problemi di flusso Problemi di flusso Commenti: • Il problema MinCostFlow è in P, tutti i problemi π π∝ MinCostFlow (che possono ridursi ad esso) sono anch’essi in P • Tutti i problemi π: π∝ MinCostFlow, possono essere risolti con il simplesso o una specializzazione dello stesso alle reti (simplesso per reti) che tiene conto della struttura della matrice di incidenza e del significato topologico delle basi (ogni base è un albero) o con un’ulteriore specializzazione del simplesso (magari nella formulazione primale-duale) allo specifico problema • Malgrado gli algoritmi basati sul simplesso siano mediamente molto efficienti si può pensare di realizzare algoritmi di soluzione polinomiali adhoc che sfruttino meglio del simplesso le caratteristiche strutturali dei problemi e che non abbiano (nemmeno teoricamente) le controindicazioni del simplesso. Il ragionamento è particolarmente vero per quei problemi (come SPP) che devono essere risolti molte volte per la soluzione di problemi più complessi (e.g., di distribuzione) Esempi di problemi riducibili a MinCostFlow: • problema del percorso minimo (Shortest Path Problem, SPP) tra una coppia di nodi s e t, o tra un nodo s e tutti i rimanenti nodi • problema del cammino critico (PERT-CPM) di pianificazione di operazioni • problema del massimo flusso (MaxFlow) tra una coppia di nodi s e t • problema di assegnazione (Assignment Problem, AP) di k operai a k lavori • problema di trasporto (Transport) da r magazzini a s distributori • problema di pianificazione della produzione e dei magazzini • problema di schedulazione di equipaggi (CrewSched) e di mezzi (Vehicle Scheduling Problem, VSP) • problema della miniera a cielo aperto (OpenMine) Commento: tutti questi problemi si studiano su reti orientate, le reti non orientate si riducono ad essere orientate sdoppiando gli archi Raffaele Pesenti Raffaele Pesenti 5 Percorsi minimi 6 Percorsi minimi Percorso minimo (Shortest Path Problem) SPP(G(V,E) , c,s,t, min) Commenti: Istanza: una rete orientata G(V,E) in cui ad ogni arco eij è associato un costo cij di attraversamento, un nodo origine s∈V e un nodo destinazione t∈V Soluzione: un percorso P={s,...,vi,...,t} dal nodo origine s al nodo t che rispetti gli eventuali orientamenti degli archi. Obiettivo: il costo totale del precorso sia minimo, i.e., detto E(P) l’insieme degli archi attraversati minΣ(i,j) ∈ E(P) cij • Se non esiste un cammino tra s e t il problema non è ammissibile • Se esiste un ciclo orientato C in G tale che c(C)<0 (peso negativo), il problema è illimitato • P* è sempre un percorso (cammino semplice) ⇔ non esistono cicli con peso negativo in G • Gli algoritmi di soluzione devono segnalare l’eventuale non connessione tra s e t o la presenza di cicli negativi Il problema di percorso a costo minimo si trova anche nella forma di calcolo dei percorsi minimi da un nodo s a tutti gli altri nodi del grafo: 5 2 SPP(G(V,E) , c,s,min) -5 3 1 ciclo con peso negativo Raffaele Pesenti 7 Raffaele Pesenti 8 Percorsi minimi Percorsi minimi Complessità: • se non esistono circuiti negativi il problema SPP è riducibile ad un problema MinCostFlow, MinCostFlow è in P, quindi SPP è in P: SPP ∝ MinCostFlow, MinCostFlow∈ P ⇒ SPP∈ P infatti SPP(G(V,E) , c,s,t, min) si riduce a MinCostFlow(G’(V,E),b’,l’,u’,c’,min) G’(V,E) ← G(V,E) c’← c l’← 0 u’← 1 b’← 0 tranne bs=1 e bt=-1 uno qualunque degli, eventualmente multipli, percorsi su cui si muove il flusso da s a t è un percorso minimo che soddisfa SSP Raffaele Pesenti 9 Complessità (cont.): • analogamente il problema dei percorsi minimi da un nodo s a tutti gli altri nodi del grafo SPP(G(V,E) , c,s, min) si riduce a MinCostFlow(G’(V,E),b’,l’,u’,c’,min) G’(V,E) ← G(V,E) c’← c l’← 0 u’← 1 bs=n-1 e bi=-1 per ∀i≠s • il problema del percorso minimo può essere risolto con il simplesso su reti o con algoritmi polinomiali ad-hoc Raffaele Pesenti Algoritmo di Dijkstra Algoritmo di Dijkstra Principi base: • L’osservazione di partenza è che un percorso da s a t che include un nodo intermedio i è ottimo solo se il sottopercorso da s a i è a sua volta percorso ottimo tra s e i. • L’algoritmo di Dijkstra per la soluzione del SPP quindi determina ricorsivamente i percorsi minimi con origine in s imponendo che detti percorsi appartengano (tranne per l’ultimo nodo) a sottografi indotti progressivamente maggiori, a partire dal sottografo che contiene solo il nodo s fino a giungere al grafo completo. • Ad ogni passo viene considerato un sottografo che ha un nodo in più rispetto al precedente. I percorsi ottimi in questo sottografo o coincidono con quelli del passo precedente o passano necessariamente per il nuovo nodo. • All’ nmo passo, poiché viene considerato tutto il grafo, è determinato il percorso ottimo, se esiste, altrimenti il problema è senza soluzioni. Raffaele Pesenti 10 11 Notazione: • cij costo dell’arco (i,j)∈ E • U insieme dei nodi del sotto grafo indotto al passo corrente • h(i) etichetta del nodo i (valore corrente del percorso, considerando solo il sottografo indotto dai nodi in U) • h*(i) costo ottimo del percorso minimo da s a i • p(i) predecessore del nodo i lungo il percorso minimo corrente Ipotesi base: c≥ 0, non ci sono archi con peso negativo e quindi nemmeno circuiti negativi Raffaele Pesenti 12 Algoritmo di Dijkstra Algoritmo di Dijkstra Algoritmo DijkstraSPP(G(V,E) , c,s) 1. Inizializzazione h*(s)=0, U={s}, h(i)=csi e p(i)=s ∀(s,i)∈E, h(j)=∞ e p(j) = nil ∀( s,j)∉E. 2. Iterazione while U≠ V { i° = arg min{h(i) : i ∉ U} U=U∪{i°}, e h*(i°)=h(i°). if U=V return //l’algoritmo termina, //il percorso minimo s-t è determinato dalla sequenza dei p(i); else if min{h(i) : i ∉ U} = ∞ return //il grafo non è connesso e l’algoritmo termina. else forall j∉U connesso ad i° ((i°,j)∈E) aggiornare l’etichetta h(j)=min{h*(i°)+ci°j, h(j)}. Se h(j)=h*(i°)+cij porre p(j)=i° } Raffaele Pesenti 13 Commenti: • Al passo (1) si pone come sottografo indotto solo il nodo origine, U = {s} e si determinano i percorsi correntemente ottimi per i nodi non in U. Ovviamente hanno costo diverso da infinito i percorsi ai soli nodi i adiacenti ad s. Ognuno di questi percorsi è composto banalmente dall’arco che congiunge s al nodo adiacente. L’insieme U contiene correntemente tutti i nodi di cui è noto il percorso minimo in assoluto. • Al passo (2) si amplia U e il sottografo indotto da U scegliendo, tra i nodi non in U, il nodo i° che è congiunto da un percorso Pi° minimo tra tutti quelli correntemente ottimi Pi per i nodi i non in U. il percorso Pi° è ottimo in assoluto per i°. Pi° è infatti il minimo tra i percorsi che connettono s a i° e che hanno solo nodi in U. Inoltre nessun altro percorso P’ da s a i°, avente nodi non in U, può essere più breve. Infatti P’ sarebbe composto in un primo tratto da un percorso Pj, non migliore di Pi°, fino ad un nodo intermedio j non in U, e da un secondo tratto da j a i° composto da archi di costo non negativo. Raffaele Pesenti 14 Algoritmo di Dijkstra Esempio Commenti (cont.): • Nell’ultima istruzione del passo (2) si determina se esistono i nuovi percorsi correntemente ottimi che passano per i°, per i nodi non in U (per i nodi in U si conoscono già i percorsi ottimi in assoluto) • L’algoritmo è, in generale, O(n2) infatti – esegue al più n passi (2) – all’interno del passo (2) • esegue una ricerca per un minimo che richiede al più n confronti, quindi la complessità del passo è O(n) • esegue al più una somma, un confronto e un assegnazione per ogni nodo, quindi la complessità del passo è O(3n) = O(n) • Osservando che ogni arco è visitato solo una volta si può realizzare una versione dell’algoritmo di complessità O(m), quindi per reti sparse (e.g., planari dove gli archi non possono essere più numerosi di tre volte il numero dei nodi) diventa O(n). Raffaele Pesenti 15 G(V,E) A 5 3 3 Caso da s a tutti gli altri nodi Legenda: • coppia [h(i),p(i)], e.g., [0,nil] • coppia ottima [h(i),p(i)]*, e.g.[0,nil]* 5 s Raffaele Pesenti s [0,nil]* [0,nil]* [0,nil]* [0,nil]* [0,nil]* [0,nil]* A [3, s] [3, s]* [3, s]* [3, s]* [3, s]* [3, s]* B [8, s] [5, A] [5, A]* [5, A]* [5, A]* [5, A]* t 2 2 7 8 6 6 B passo 0 1 2 3 4 5 D C [∞, nil] [8,A] [8,A] [8,A]* [8,A]* [8,A]* D [∞, nil] [∞, nil] [12,B] [10,C] [10,C]* [10,C]* C t [∞, nil] [∞, nil] [∞, nil] [14,C] [13,D] [13,D]* 16 passo 0 A 5 D A 3 3 5 s t 2 B B D A passo 1 A 5 3 5 t 2 passo 3 5 2 D A 6 6 C 5 D 3 5 t 2 2 7 8 6 6 6 Raffaele Pesenti B C 17 6 C Raffaele Pesenti Algoritmo di Bellman-Ford 18 Algoritmo di Bellman-Ford Principi base: • L’osservazione di partenza è che un percorso da s a t ottimo deve contenere al più n nodi e n-1 archi. Analogamente se un grafo presenta circuiti negativi, ne esiste certamente uno contente al più n nodi e n archi. • L’algoritmo di Bellman-Ford per la soluzione del SPP quindi determina ricorsivamente i percorsi minimi con origine in s imponendo che detti percorsi siano inizialmente composti al più di un solo nodo (0 archi) e quindi permettendo ad ogni passo che si possa aggiungere un nodo (un arco). • Per l’osservazione iniziale, non ha senso andare oltre nmo passo, se un percorso diminuisse ulteriormente per l’esecuzione di un passo successivo vuol dire che in realtà è un cammino che include un loop negativo. Raffaele Pesenti C passo 5 s 2 8 B 6 3 t 7 8 6 B 3 2 7 t 2 8 C 5 s 3 7 6 3 D 5 2 6 C 5 3 7 6 passo 4 s 2 8 6 B A 5 7 8 s D 3 s 2 3 5 3 t 2 passo 2 19 Notazione: • cij costo dell’arco (i,j)∈ E • k passo corrente • hk(i) etichetta del nodo i al passo k (valore corrente del percorso contenente al più k nodi oltre che i, quindi un percorso contenente al più k archi) • p(i) predecessore del nodo i lungo il percorso minimo corrente • h*(i) costo ottimo del percorso minimo da s a i Ipotesi: nessuna sui valori dei costi, l’algoritmo si blocca se determina un ciclo negativo Raffaele Pesenti 20 Algoritmo di Bellman-Ford Algoritmo di Bellman-Ford Algoritmo BellmanFordSPP(G(V,E) , c,s) 1. Inizializzazione h0(s)=0, h0(j)=∞ ∀ j∈V-{s}, p(j)=nil ∀ j∈V e k=1 2. Iterazione while k ≤ n forall j∈V { hk(j)= min {hk-1(j), min{hk-1(i)+cij :∀ i:(i,j)∈E }} //aggiornate le distanze if hk(j)=hk-1(i)+cij porre p(j)=i. else if hk(j)=hk-1(j) ∀ j∈V allora h*(j)= hk(j) ∀ j∈V return //l’algoritmo termina (eventualmente con valori infiniti se il grafo non è // connesso) ed il percorso minimo s-t resta determinato dalla sequenza dei p(i); else porre k=k+1; } if k=n+1, il grafo contiene un ciclo di peso negativo, return // se l'algoritmo non termina prima di uscire dal while il problema è illimitato Raffaele Pesenti 21 Commenti: • Al passo (1) si determinano i percorsi correntemente ottimi che contengono al più zero archi a partire dal nodo iniziale. Ovviamente ha costo diverso da infinito solo il percorso da s a se stesso. • Al passo (2) si determinano i percorsi correntemente ottimi che contengono al più k archi. Ognuno di questi percorsi dal nodo s al nodo generico j può essere identico a quello al passo precedente (che conteneva al più k-1 archi) oppure essere composto da un percorso di al più k-1 archi fino ad un nodo intermedio i più l’arco diretto da i a j. Se si sceglie il minimo tra questi percorsi, nell’ipotesi induttiva che fossero ottimi per k-1 archi quelli al passo precedente, allora si ottiene un percorso ottimo per k archi Raffaele Pesenti 22 Esempio Algoritmo di Bellman-Ford G(V,E) A -5 3 3 Commenti (cont.): • L’algoritmo è O(n3) infatti – esegue al più n passi (2) – all’interno del passo (2) esegue per ogni nodo una ricerca per un minimo che richiede al più n confronti, quindi la complessità del passo è O(n2) • L’algoritmo di Bellman-Ford è meno efficiente di quello di Dijkstra e deve essere applicato solo in presenza di archi negativi. Raffaele Pesenti 23 Caso da s a tutti gli altri nodi Legenda: • coppia [hk(i),pk(i)], e.g., [0,nil] • coppia ottima [hk(i),pk(i)]*, e.g.[0,nil]* 5 s t 2 -2 7 8 6 6 B passo s A B C 0 [0,nil] [∞, nil] [∞, nil] [∞, nil] 1 [0,nil] [3, s] [8, s] [∞, nil] 2 [0,nil] [3, s] [5, A] [8,A] 3 [0,nil] [3, s] [5, A] [8,A] 4 [0,nil] [1, D] [5, A] [8,A] 5 [0,nil] [1, D] [3, A] [6,A] 6 [0,nil] [1, D] [3, A] [6,A] riga 5 e 6 diverse quindi esiste circuito negativo Raffaele Pesenti D D [∞, nil] [∞, nil] [15,B] [6,C] [6,C] [6,C] [4,C] C t [∞, nil] [∞, nil] [∞, nil] [14,C] [9,D] [9,D] [9,D] 24 Esempio G(V,E) A -2 3 3 Caso da s a tutti gli altri nodi Legenda: • coppia [hk(i),pk(i)], e.g., [0,nil] • coppia ottima [hk(i),pk(i)]*, e.g.[0,nil]* 5 s s [0,nil] [0,nil] [0,nil] [0,nil] [0,nil] [0,nil]* A [∞, nil] [3, s] [3, s] [3, s] [3, s] [3, s]* B [∞, nil] [8, s] [-1, A] [-1, A] [-1, A] [-1, A]* t -4 2 7 8 -6 B passo 0 1 2 3 4 5 Algoritmo di Floyd D C [∞, nil] [∞, nil] [8,A] [5,B] [5,B] [5,B]* 6 D [∞, nil] [∞, nil] [15,B] [6,B] [6,B] [6,B]* C Notazione: • cij costo dell’arco (i,j)∈E • k passo corrente • hk(i,j) valore corrente del percorso da i a j non peggiore del percorso ottimo contenente al più k nodi oltre che i • h*(i,j) costo ottimo del percorso minimo da i a j • p(i,j) predecessore del nodo j lungo il percorso minimo corrente da i a j t [∞, nil] [∞, nil] [∞, nil] [2,C] [-1,C] [-1,C]* Raffaele Pesenti Principi base: • Determina i percorsi minimi tra tutte le coppie di nodi su principi simili a quelli di Bellman-Ford 25 Raffaele Pesenti Algoritmo di Floyd Algoritmo di Floyd Algoritmo FloydSPP(G(V,E) , c, min) 1. Inizializzazione k=0, h0(i,j) = cij, p(i,j) = i, h0(i,i) = 0, p(i,i) = i, h0(i,j) =∞ , p(i,j) = nil, se (i,j)∉E 2. Iterazione while k ≤ n{ forall i,j:, hk-1(i,k)≠∞ e hk-1(k,j)≠∞ hk(i,j) =min{hk-1(i,j) ,(hk-1(i,k) + hk-1(k,j) ), se hk(i,j) modificato p(i,j) = p(k,j) if qualche hk(i,i) risulta negativo return //esiste un ciclo negativo //passante per il nodo imo, non esiste soluzione finita, l’algoritmo termina. if tutti i hk(i,i) sono nulli e k=n return //è stata trovata la soluzione. // La matrice [hk(i,j) ] fornisce le distanze minime da ogni nodo i ad ogni // nodo j. L’algoritmo termina. porre k=k+1; } Raffaele Pesenti 26 27 Commenti: • Al passo (1) si determinano i percorsi correntemente ottimi che contengono al più un arco a partire dal nodo iniziale. Ovviamente hanno costo diverso da infinito i soli percorsi tra nodi adiacenti. Il costo di un percorso da un nodo a se stesso è posta a zero. • Al passo (2) si determinano i percorsi correntemente ottimi che non sono peggiori di quelli ottimi che contengono al più k archi. Ognuno di questi percorsi dal nodo i al nodo generico j può essere identico a quello al passo precedente (che non era peggiore di uno che conteneva al più k-1 archi) oppure essere composto da due percorsi determinati al passo k-1: da i ad un nodo intermedio r e da r a j. La composizione di questi due percorsi forma un percorso non peggiore di quelli ottimi che contengono al più k archi. Infatti il primo tratto è non peggiore di un percorso con k-1 archi e il secondo tratto è non peggiore del percorso composto dal solo arco diretto (r,j). L’ottimalità si ottiene poiché ad ogni passo si sceglie la combinazione minima tra i percorsi determinati al passo precedente k-1, nell’ipotesi induttiva che questi percorsi non fossero peggiori di quelli ottimi composti da k-1 archi. Raffaele Pesenti 28 Esempio Algoritmo di Floyd G(V,E) Commenti (cont.): • L’algoritmo è O(n3) infatti – esegue al più n passi (2), – all’interno del passo (2) esegue per ogni nodo una ricerca per un minimo che richiede al più n confronti, quindi la complessità del passo è O(n2) A -2 3 3 5 s 2 7 -6 Nel caso di costi positivi l’algoritmo di Floyd è più efficiente che applicare n volte quello di Dijkstra se la rete è densa (tanti archi), mentre è vero l’opposto per reti sparse. Raffaele Pesenti s A B C D t s 0 inf inf inf inf inf A 3 0 5 0 -2 inf B -1 -4 0 inf -6 inf D 15 3 7 2 0 inf t inf -1 0 -6 3 0 s A B C D t s 0 inf inf inf inf inf A 3 0 5 0 -2 inf B -1 -4 0 -4 -6 inf s A B C D t A 3 0 5 0 -2 inf B -1 -4 0 -4 -6 inf D 6 3 7 2 0 inf t -1 -4 0 -6 -6 0 B 8 -4 0 inf inf inf C inf 5 6 0 inf inf D inf inf 7 2 0 inf t inf inf inf -6 3 0 C 30 Esempio C 5 2 6 0 0 inf D 6 3 7 2 0 inf t -1 -4 0 -6 -6 0 A passo 3 = passo 4 ⇒ algoritmo termina -5 Passo 1 D 3 3 5 s t 2 -2 7 8 6 B C 5 2 6 0 0 inf A 3 0 inf inf -2 inf G(V,E) Passo 4 s 0 inf inf inf inf inf s 0 inf inf inf inf inf Raffaele Pesenti Passo 3 C 8 2 6 0 3 inf 6 B 29 Passo 2 s A B C D t t -4 8 • Passo 1 D s A B C D t s 0 inf inf inf inf inf A 3 0 2 -7 -5 inf 6 Passo 2 B 5 2 0 inf -3 inf C 8 5 6 0 0 inf s A B C D t s 0 inf inf inf inf inf A 3 0 inf inf -5 inf C D 15 3 4 -2 0 inf B 8 2 0 inf inf inf C inf 5 6 0 inf inf D inf inf 7 -2 0 inf t inf inf inf 6 3 0 C 8 3 4 -2 0 inf D 6 3 4 -4 -2 inf t 9 6 7 1 1 0 Passo 3 t inf 11 10 1 3 0 s A B C D t s 0 inf inf inf inf inf A 3 -2 -1 -7 -5 inf B 5 0 0 -5 -3 inf valori negativi sulla diagonale ⇒ esiste circuito a costo negativo Raffaele Pesenti 31 Raffaele Pesenti 32 Esempio Esempio Commento: La matrice delle distanze al passo kmo Hk può essere vista come risultato di uno speciale “prodotto” ⊗ della matrice delle distanze al passo k-1 con se stessa: Hk= Hk-1 ⊗ Hk-1. Analogamente al comune prodotto matriciale l’operando di sinistra di ⊗ è un vettore riga, mentre l’operando di destra è un vettore colonna, ma, invece di eseguire una somma di prodotti come avviene nell’usuale prodotto scalare, l’operatore ⊗ esegue un minimo del risultato di somme, per cui Nel secondo dei casi considerati si ottiene ad esempio: Passo 2 s A B C D t s 0 inf inf inf inf inf A 3 0 2 -7 -5 inf B 5 2 0 inf -3 inf C 8 5 6 0 0 inf D 15 3 4 -2 0 inf t inf 11 10 1 3 0 ⊗ s A B C D t A 3 0 2 -7 -5 inf s A B C D t s 0 inf inf inf inf inf A 3 -2 -1 -7 -5 inf B 5 2 0 inf -3 inf C 8 5 6 0 0 inf D 15 3 4 -2 0 inf t inf 11 10 1 3 0 D 6 3 4 -4 -2 inf t 9 6 7 1 1 0 Passo 3 Hk= {hk(i,j)} ={Hk-1(i,.) ⊗ Hk-1(.,j) } ={ minr=1,..n (hk-1(i,r) + hk-1(r,j) ) }, mentre con il normale prodotto scalare si sarebbe ottenuto Hk= {hk(i,j)} ={Hk-1(i,.) Hk-1(.,j) } ={ Σr=1,..n (hk-1(i,r) hk-1(r,j) ) }. Notare la corrispondenza tra minr=1,..n e Σr=1,..n e tra somma e prodotto Raffaele Pesenti Passo 2 s 0 inf inf inf inf inf = 33 B 5 0 0 -5 -3 inf C 8 3 4 -2 0 inf Raffaele Pesenti 34 Percorso di lunghezza massima CPM - PERT Problema del percorso massimo (Longest Path Problem) LPP(G(V,E),c,s,t,max): Istanza: una rete G(V,E), caratterizzata da costi c sugli archi, e dati un nodo origine s e un nodo destinazione t. Soluzione: un percorso P da s a t che rispetti le eventuali orientazioni degli archi Obiettivo: massimo costo del percorso P. Critical Path Method (CPM) Project Evaluation and Review Technique (PERT) CPM e PERT sono metodologie, molto utilizzate in pratica, per la gestione di progetti composti da più attività in cui esistano relazioni di precedenza. Commenti: • LPP ∝Programmazione Lineare solo se G(V,E) è una rete orientata senza circuiti, altrimenti il problema è NP-hard. • Se si tenta di risolvere il generico LPP con la programmazione lineare si ottiene un problema illimitato che individua un cammino chiuso. • LPP su rete orientata senza circuiti ha una importante applicazione pratica nel PERT-CPM Raffaele Pesenti Sviluppati indipendentemente sono ormai considerati equivalenti anche se – il CPM originariamente era strettamente deterministico; – il PERT nasce per gestire attività di durata stocastica. 35 Raffaele Pesenti 36 = Gestione di un progetto Rappresentazione di un progetto Passi fondamentali nella gestione di un progetto: • definizione del progetto • definizione delle attività (elementari) • determinazione delle relazioni tra le attività • schedulazione delle attività • controllo dell’evoluzione delle attività Un progetto è rappresentabile come una rete G=(V,E) dove: – ogni arco (i,j) = e∈ E corrisponde ad una delle attività, l’etichetta dell’arco indica la durata dell’attività; – ogni nodo i∈ V rappresenta un evento, i.e., inizio progetto, fine progetto, completamento di un insieme delle attività, le etichette del nodo delimitano l’intervallo temporale in cui esso può realizzarsi. CPM e PERT aiutano a eseguire almeno i primi quattro passi Raffaele Pesenti 37 Raffaele Pesenti 38 Esempio elementare Esempio elementare 7/7 nome durata task • progetto – attività A iniziale senza predecessori, 2 gg; – attività B preceduta da A, 5 gg; – attività C preceduta da A, 3 gg; – attività D preceduta da B, 7 gg, nessun successore; – attività E preceduta da C , 4 gg, nessun successore; il progetto è terminato quando sono terminate tutte le sue attività. inizio progetto D 7gg B 5gg A 2gg 14/14 2/2 C 3gg E 4gg 0/0 fine progetto estremi intervallo occorrenza evento Raffaele Pesenti 39 Raffaele Pesenti 5/10 40 Regole di costruzione (archi) Esempi B Non vi possono essere attività con entrambi i nodi in comune. • Due attività con entrambe gli estremi in comune sarebbero precedute e seguite dalle stesse attività. Dal punto di vista gestionale corrisponderebbero ad un’unica attività con durata uguale alla massima delle due attività. • Per evitare parallelismi ed esprimere precedenze ‘complesse’ può essere necessario introdurre attività dummy di durata nulla. Esempio: – C è preceduta da A e B; – D è preceduta solo da A. Esempio: – D è preceduta solo da A; – E è preceduta da A e B; – F è preceduta solo da B. C dummy A B 41 42 Regole di costruzione (nodi) • • D Raffaele Pesenti Regole di costruzione (nodi) • F E A Raffaele Pesenti D L’estremo inferiore dell’intervallo di occorrenza dell’evento iniziale è 0 per definizione (e, se i calcoli sono eseguiti correttamente, anche l’estremo superiore deve risultare 0); l’estremo superiore dell’intervallo di occorrenza dell’evento finale coincide al fine di minimizzare il tempo di completamento del progetto con l’estremo inferiore ottenuto dai calcoli; • l’estremo inferiore dell’evento generico i corrisponde all’earliest starting time*, ESi, delle attività seguenti e quindi al massimo degli earliest completation time, ECk = ESk + pki, delle attività precedenti: ESi = maxk {ESk + pki} l’estremo superiore dell’evento generico i corrisponde al latest completion time*, LCi, delle attività precedenti e quindi al minimo degli latest starting time, LSj = LCj - pij, delle attività seguenti: LCi = minj {LCj - pij} * notare parallelismo tra ESi e rij e tra LCi e dij. Raffaele Pesenti 43 Raffaele Pesenti 44 Regole di costruzione (nodi) Esempio 3 5(8) 2(12) La rete costruita è orientata e priva di circuiti, si possono quindi ricavare i valori delle etichette di tutti i nodi col seguente algoritmo: – ESevento_iniziale = 0 – procedendo in avanti ricorsivamente, considerando di volta in volta solo un nodo di cui si conoscano tutti i valori ES dei nodi precedenti, si determinano gli ES di tutti i nodi fino a quello finale; – LCevento_finale = ESevento_finale – procedendo all’indietro ricorsivamente, considerando di volta in volta solo un nodo di cui si conoscano tutti i valori LC dei nodi seguenti, si determina no gli LC di tutti i nodi fino a quello iniziale (per tale nodo deve risultare LCevento_iniziale = 0); Raffaele Pesenti 45 7 1(13) 3(11) 6(9) possibile sequenza visita nodi in avanti (all’indietro) Raffaele Pesenti Percorso critico 46 Percorso critico Teorema: esiste almeno un percorso (critico) tra il nodo iniziale e finale in cui tutti gli eventi sono caratterizzati da estremi di occorrenza inferiore e superiore identici e in cui la durata di tutte le attività sono uguali alla differenza tra gli istanti di occorrenza degli eventi estremi che le definiscono. Dimostrazione: per assurdo, se ciò non fosse vero non sarebbe minimizzato il tempo di completamento del progetto. Raffaele Pesenti 4(10) 0(14) 47 Interpretazione economica: le attività che appartengono a percorsi critici non possono essere ritardate senza che ciò implichi il ritardo complessivo nel completamento di tutto il progetto. Slack: slij = ( LCj - ESi ) - pij massimo ritardo che può subire un task senza ritardare il completamento di tutto il progetto (se i rimanenti task sui percorsi di appartenenza non subiscono ulteriori ritardi). Raffaele Pesenti 48 Esempio 7/7 nome durata task inizio progetto • • D 7gg B 5gg A 2gg Commenti attività critiche 14/14 2/2 • C 3gg E 4gg 0/0 le attività dei percorsi critici vanno tenute maggiormente sotto controllo; se si deve investire per ridurre i tempi di esecuzione del progetto, si deve incidere sulle attività dei percorsi critici, eventualmente in modo dinamico, poiché la riduzione dei tempi di esecuzione può modificare la criticità dei percorsi; il problema può essere formulato anche in termini di programmazione lineare e quindi eventualmente aggiungere vincoli ulteriori o esprimere obiettivi non includenti solo la minimizzazione del tempo di completamento. fine progetto estremi intervallo occorrenza evento 5/10 Raffaele Pesenti 49 Raffaele Pesenti PERT PERT Ad ogni arco/attività sono associate: – durata media attesa – deviazione della durata Media e varianza sono di solito calcolate empiricamente nell’ipotesi di distribuzioni gamma: µ = (a + 4m + b)/6 50 σ = (b - a)/6 • Il tempo atteso di completamento del progetto è calcolato come somma dei tempi medi delle attività sui percorsi critici; • la varianza del tempo di completamento del progetto è calcolato come somma delle varianze delle attività sui percorsi critici (questo è sensato solo nell’ipotesi di indipendenza delle realizzazioni delle variabili aleatorie). dove m è il valore atteso, a è la durata ritenuta praticamente minima, b la durata ritenuta praticamente massima. Raffaele Pesenti 51 Raffaele Pesenti 52 Gestione risorse Esempio elementare • • La gestione di un progetto richiede non solo la schedulazione delle attività che lo compongono, ma anche l’assegnazione delle risorse alle attività. • Mentre la schedulazione è un problema facile, l’assegnazione delle risorse in generale risulta difficile. Raffaele Pesenti 53 progetto – attività A iniziale senza predecessori, 2 gg, 5 risorse; – attività B preceduta da A, 5 gg, 7 risorse; – attività C preceduta da A, 3 gg, 2 risorse; – attività D preceduta da B, 7 gg, nessun successore, 2 risorse; – attività E preceduta da C , 4 gg, nessun successore, 4 risorse; Si vuole minimizzare il massimo numero di risorse utilizzate contemporaneamente. Raffaele Pesenti 54 Esempio A B C D E risorse Raffaele Pesenti Esempio A B C D E slack slack 5 9 11 6 risorse 2 55 Raffaele Pesenti slack slack 5 7 4 6 56 Visita nodi di una rete Gestione risorse Poiché la gestione delle risorse è un problema difficile i SW forniscono di solito soluzioni euristiche che quindi devono essere sempre analizzate criticamente prima di essere applicate. Criteri di priorità assegnate ai task per la distribuzione delle risorse in caso di conflitti tra task o gruppi di task: – FCFS, – minimum task slack, – mimimum latest finishing time, – greatest resource demand, – greatest resource utilization. Raffaele Pesenti 57 Premessa: Gli algoritmi di determinazione di percorsi minimi permettono di visitare tutti i nodi raggiungibili da un nodo sorgente s. Esistono altri algoritmi che permettono tali visite (e.g., alla ricerca di proprietà specifiche di un nodo) che rinunciano alla proprietà di minimalità dei percorsi e la cui struttura generale può essere enunciata come segue... Raffaele Pesenti Visita nodi di una rete Visita nodi di una rete Algoritmo di ricerca SEARCH(G(V,E),s) 1. Inizializzazione. ListaNodiVisitati = {s}; ListaNodiAperti = {s}; ListaArchi = E; 2. Iterazione. while ListaNodiAperti ≠ ∅ { selezionare i ∈ ListaNodiAperti if ∃ j t.c. (i,j) ∈ ListaArchi and j∉ ListaNodiVisitati { predecessore(j) = i; ListaNodiVisitati = ListaNodiVisitati ∪ {j}; ListaNodiAperti = ListaNodiAperti ∪ {j}; ListaArchi = ListaArchi - {(i,j)}; } else ListaNodiAperti = ListaNodiAperti - {i}; } } Raffaele Pesenti 58 Commenti: • Si effettuano al più 2n cicli while. Infatti ad ogni ciclo o viene aggiunto o viene cancellato un nodo in ListaNodiAperti e ogni nodo entra in ListaNodiAperti al più una sola volta. • Se la ListaArchi è organizzata forward star per ogni nodo si scandiscono solo gli archi uscenti da esso, si eseguono quindi complessivamente m operazioni. • Se selezionare i∈ ListaNodiAperti è O(1) allora l’algoritmo è O(n+m) = O(m) • selezionare i∈ ListaNodiAperti è O(1) se e.g., viene sempre selezionato il primo o l’ultimo nodo della ListaNodiAperti. Nel primo caso si parla di depth first, nel secondo di breadth-first. 59 Raffaele Pesenti 60 Visita nodi di una rete Visita nodi di una rete Esempio (cont): Esempio: Sia dato G(V,E) in figura e siano gli archi organizzati in ordine alfabetico (e.g., nella lista del nodo A si incontrano nell’ordine (A,B), (A,C), (A,D)) A G(V,E) BreadthFirst 0 1 2 3 4 5 6 7 8 9 10 11 C s E B D Raffaele Pesenti 61 Raffaele Pesenti ListaNodiAperti s s,A s,A,B s,A,B,D s,A,B,D,E s,A,B,D s,A,B s,A s,A,C s,A s Arco selezionato (s,A) (A,B) (B,D) (D,E) Arco selezionato (s,A) (s,B) (A,C) (A,D) (C,E) (A,B) (B,D) (C,D) (D,E) 62 Esercizi Esempio (cont): ListaNodiVisitati s s,A s,A,B s,A,B,D s,A,B,D,E s,A,B,D,E s,A,B,D,E s,A,B,D,E s,A,B,D,E,C s,A,B,D,E,C s,A,B,D,E,C s,A,B,D,E,C ListaNodiAperti s s,A s,A,B A,B A,B,C A,B,C,D B,C,D C,D C,D,E D,E E Raffaele Pesenti Visita nodi di una rete DepthFirst 0 1 2 3 4 5 6 7 8 9 10 11 ListaNodiVisitati s s,A s,A,B s,A,B s,A,B,C s,A,B,C,D s,A,B,C,D s,A,B,C,D s,A,B,C,D,E s,A,B,C,D,E s,A,B,C,D,E s,A,B,C,D,E Archi considerati ma esclusi Archi considerati ma esclusi (A,C) (C,D), (C,E) (A,D) (s,B) 63 Es. 1) Scrivere i duali dei problemi di flusso a costo minimo e di cammino minimo e darne un’interpretazione economica. Es.2) Formulare come problema di programmazione lineare il problema di percorso minimo tra un nodo origine e tutti gli altri nodi. Dire che soluzioni si ottengono dalla programmazione lineare se il grafo è sconnesso, e che soluzioni si ottengono applicando invece l’algoritmo di Dijkstra o di Bellman-Ford. Es. 3) Il problema di percorso minimo tra due nodi è facilmente formulabile come problema di programmazione lineare e quindi è in P. Provare a formulare come problema di programmazione lineare il problema di percorso minimo tra tutte le coppie di nodi. Cosa si può concludere sulla complessità del problema se non vi si riesce? Raffaele Pesenti 64 Esercizi Es. 4) Per realizzare il prodotto F si possono eseguire delle lavorazioni diverse caratterizzate da diversi tempi di produzione e diverse probabilità di successo. In particolare a partire dalle materie prime si può realizzare (in un tempo 5 e con un tasso di scarti di lavorazione del 3%, in seguito saranno indicati i soli valori)) il semilavorato A , oppure un semilavorato B ( 2; 7%), oppure il semilavorato C (8; 6%). A partire da A si può produrre il semilavorato C (4; 1%), oppure il semilavorato E (5; 3%). A partire da B si può produrre il semilavorato C (3; 1%), oppure il semilavorato D (1; 4%). A partire da C si può produrre il semilavorato E (2; 1%), oppure il semilavorato D (2; 1%), oppure direttamente il prodotto finale (6, 2%). A partire da D si può produrre direttamente il prodotto finale (3, 3%). A partire da E si può produrre direttamente il prodotto finale (2, 1%). Determinare la sequenza di lavorazioni che massimizza il tasso di scarti e quella che minimizza il tempo di lavorazione richiesto per giungere al prodotto finito a partire dalle materie prime. Raffaele Pesenti 65 Esercizi Es. 6) Data la rete G determinare il percorso minimo da s a t attraverso la programmazione lineare. Verificare che ad ogni base visitata corrisponde un albero sul grafo e determinare a cosa corrisponde un’operazione di pivoting. G(V,E) A s 1 4 7 9 t -2 8 6 B 3 C Raffaele Pesenti 66 Esercizi Es. 7) Dopo avere rappresentato la rete G in forma forward star, determinare il percorso minimo da s a t utilizzando Dijkstra e Bellman-Ford. Contare l’esatto numero di operazioni elementari che un calcolatore avrebbe dovuto compiere. Determinare le distanze minime tra tutti i nodi usando Dijkstra e Floyd (per fare i calcoli per questo ultimo algoritmo probabilmente conviene fare un programma sw o usare Excel). Cercare di ottimizzare le operazioni legate all’uso di Dijkstra, utilizzando ad ogni iterazione i risultati ottenuti ai passi precedenti. G(V,E) A D 6 9 1 5 s t 4 4 9 8 2 Raffaele Pesenti D 2 3 Esercizi 10 B -2 3 C 67 Es. 8) Provare l’ottimalità delle soluzioni ottenute al passo precedente verificando che soddisfano il teorema degli scarti complementari dei problemi di programmazione lineare associati. Es. 9) G(V,E) Ripetere gli esercizi 7) e 8) per le seguenti reti D 10 2 3 F G(V,E) 5 A D -6 A E 4 9 11 1 3 5 10 5 s t 4 s t 2 4 6 9 8 9 1 2 2 10 10 -2 3 B C B C Raffaele Pesenti 68 Esercizi Es. 10) Ripetere l’esercizio 7) per la seguente rete e dedurre delle regole generali sugli archi negativi. A s 1 9 4 Esercizi G(V,E) -6 D 9 5 2 2 t 8 10 -2 B C Es. 11) Data una rete orientata G formulare il problema di percorso minimo tra due nodi s e t come problema di programmazione lineare, verificare che ad ogni percorso tra s e t corrisponde una base, spiegare perché la base è degenere se il percorso non è ricoprente, i.e., hamiltoniano. Provare ai vertici del poliedro delle soluzioni ammissibili corrispondono percorsi ammissibili e viceversa. (suggerimento: dimostrare che ad ogni base corrisponde un albero, dimostrare che dati i vincoli questo albero può avere solo due foglie in s e in t) Raffaele Pesenti 69 Es 12) Calcolare le distanze minime tra tutte le coppie di nodi per le reti presentate negli esercizi precedenti. Applicare sia l’algoritmo di Floyd che Dijkstra o Bellman-Ford a seconda dei casi, calcolare il numero di operazioni elementari eseguite con i diversi approcci. Raffaele Pesenti 70 Esercizi Esercizi Es 13) Disegnare la rete per il seguente problema di cpm. Attività Predecessori Durata A 7 B 5 C B 6 D A 8 E AB 2 F CD 3 G D 6 H DE 3 I D 4 Inoltre determinare il tempo minimo di completamento del progetto, evidenziare il percorso critico, disegnare diagramma di Gantt . Es 14) Lot-sizing La ACME spa ha necessita di una quantità dk di uno specifico semilavorato il giorno k del prossimo mese, k= 1,...,30. All’inizio del giorno 1 si prevede che sarà presente in magazzino una quantità d0, tale quantità dovrebbe essere presente anche alla fine del mese. Sia c il costo di acquisto di ogni semilavorato, K il valore dei costi fissi di ordine e di trasporto che si pagano per ogni consegna dei fornitori, infine sia h il costo giornaliero di mantenimento in magazzino di un semilavorato. Formalizzare il problema di minimizzazione dei costi complessivi come un problema di cammino minimo. [sugg: chiedersi prima che cosa è oggetto di decisione, considerare poi una rete che ha come nodi le giornate e archi orientati che uniscono ogni giorno a quelli successivi] Raffaele Pesenti Raffaele Pesenti 71 72 Esercizi Esercizi Es 15) Assortimento di magazzino (Frank 65) L’ACME Lavorazione Acciai deve decidere l’assortimento di materiale da tenere in magazzino. In particolare si deve decidere per ogni larghezza quanti coil avere a disposizione. La pianificazione della produzione prevede che per il mese successivo per ogni larghezza wi, sarà necessaria una quantità qi. Il costi medi di acquisto e di mantenimento di ogni coil di tipo i sono hi, inoltre la presenza in magazzino di coil di tipo i induce comunque dei costi fissi Ki indipendenti dal numero (se maggiore di zero) degli stessi. Si supponga che wi < wj se i < j, e che quindi un coil di tipo j possa essere sostituito da un coil di tipo i, se i < j, ad un costo dji che tiene conto delle spese di lavorazione e degli scarti. Formalizzare il problema di minimizzazione dei costi complessivi come un problema di cammino minimo. [sugg: chiedersi prima che cosa è oggetto di decisione, considerare poi una rete che ha come nodi le tipologie di coil e archi orientati che uniscono ogni tipologia a quelle successive] Raffaele Pesenti 73 Es 16) Formattazione testi L’ACME professional è un software di formattazione testi per giornali. Data una sequenza di parole che forma un paragrafo il sw ACME genera un paragrafo giustificato a destra e a sinistra. Per ottenere una giustificazione gradevole alla vista ACME dilata o comprime leggermente gli spazi tra due parole successive. Sia cnk una misura della disutilità (sgradevolezza) provata da lettore medio che veda (k+1) parole, che complessivamente danno luogo a n caratteri e k spazi, su un una riga di testo. Formulare il problema di formattazione di un paragrafo come un problema di cammino minimo, eventualmente aggiungendo degli altri fattori di disutilità o correggendo i precedenti per trattare l’indentazione all’inizio del praragrafo e la linea finale. [sugg: chiedersi prima che cosa è oggetto di decisione, considerare poi una rete che ha come nodi le parole e archi orientati che uniscono ogni parola a quelle successive] Indicare come modificare il modello ottenuto in precedenza se il sw ACME avesse anche la capacità di andare a capo spezzando (correttamente una parola). Raffaele Pesenti Esercizi Esercizi Es 17) Cpm La ACME spa vi ha stati incaricato di gestire il progetto la cui struttura è riportata nella tabella successiva. Come indicato ogni operazione richiede la disponibilità esclusiva di un certo numero di lavoratori. Attività Predecessori Durata Risorse A 2 4 B 8 5 C A 9 2 D AB 4 4 E B 3 3 F B 5 5 G DF 6 7 H F 7 2 I EC 4 2 (continua) Raffaele Pesenti 74 75 (continuazione) Determinare il tempo minimo di completamento del progetto, evidenziare il percorso critico, eseguire Diagramma di Gantt e cercare di minimizzare il numero massimo di risorse usate contemporaneamente (a parità di soluzione scegliere quella che usa il massimo numero di risorse il minor tempo possibile). Considerate invece la situazione in cui: i) avete a disposizione al massimo 10 lavoratori, ii) si paga una penalità 500EUR per ogni giorno di ritardo nella consegna della commessa, iii) si può assumere temporaneamente dei lavoratori per assegnarli a delle operazioni. Ogni lavoratore temporaneo costa 150EUR al giorno, può essere assunto solo all'inizio di un'operazione ed è assegnato alla stessa fino a quando questa non è completata. Schedulare le operazioni in modo da minimizzare i costi complessivi. Se si assumono dei lavoratori temporanei indicarne la quantità e le operazioni a cui sono stati assegnati. (continua) Raffaele Pesenti 76 Esercizi Esercizi (continuazione) Si supponga infine di non potere assumere lavoratori temporanei, ma che l’operazione D può essere completata anche con 3 risorse, anche se ciò allunga i tempi di processamento a 7 giorni. Schedulare in modo da minimizzare il tempo di completamento della commessa, tenendo presente il vicolo sul numero massimo di lavoratori disponibili. Es 18) Approssimazione di una funzione con una funzione linerare a tratti Sia data una funzione f(x) definita sull’intervallo [a,b] che si vuole approssimare con una funzione g(x) lineare a tratti. Si assuma inoltre che si voglia f(x’) = g(x’), in ogni x’∈ I, dove I è l’insieme dei punti di discontinuità della derivata di g(x), i.e., un punto di giunzione di due tratti rettilinei. Siano xi, i=1,...,n, le ascisse dei punti candidati ad appartenere all’insieme I. Per comodità si assuma x1= a e xn= b e che x1, xn ∈ I per default. Sia xj cij = α + β ∫ ( g ( x) − f ( x)) 2 x il costo associato agli errori in cui isi incorre approssimando la funzione f(x) con la funzione g(x) tra i punti nell’intervallo [xi,xj] Formulare il problema di approssimazione a costo minimo di f(x) con g(x) come un problema di costo minimo. Spiegare cosa cambia al variare dei valori α e β. Spiegare cosa cambia se si vuole approssimare f(x) con una spline di ordine maggiore. [sugg: chiedersi prima che cosa è oggetto di decisione, considerare poi una rete che ha come nodi i punti xi e archi orientati che uniscono ogni nodo a quello successivo] Raffaele Pesenti 77 Raffaele Pesenti 78