Ottimizzazione Discreta – Esercizi V: Soluzioni Grafi e cammini minimi A.A. 2014/2015 Esercizio 1 (a) Nella terminologia della teoria dei grafi, si chiede di dimostrare che ogni grafo non orientato G = (V, E), con n = |V | ≥ 2, ha due nodi con lo stesso grado. Supponiamo per assurdo che tutti i nodi di G abbiano grado diverso. Allora, poiché |δ(v)| ∈ {0, . . . , n − 1} per ogni v ∈ V , i gradi degli n nodi di G devono assumere tutti i possibili valori interi tra 0 e n − 1. In particolare, esistono un nodo u di grado 0 ed un nodo v di grado n − 1. Allora v è adiacente a tutti gli altri nodi, in particolare anche ad u. Ma questo è impossibile, perché u ha grado 0. (b) In questo caso, l’affermazione sarebbe la seguente: ogni grafo orientato con almeno due nodi ha due nodi u, v tali che |δ+ (u)| = |δ+ (v)|. L’affermazione è, in generale, falsa: si consideri, ad esempio, un grafo con soli due nodi u, v ed un unico arco (u, v). Esercizio 2 Poiché stringersi la mano è chiaramente un’azione simmetrica, possiamo riformulare l’affermazione in termini di grafi non orientati. Vogliamo dimostrare che in ogni grafo non orientato G = (V, E) c’è un P numero pari di nodi di grado dispari. Si ricordi la relazione del Lemma 5.1: v∈V |δ(v)| = 2|E|. Questa relazione dice, in particolare, che la somma dei gradi di tutti i nodi è pari. Ne segue che il numero di nodi di grado dispari deve essere pari, altrimenti la sommatoria avrebbe valore totale dispari. Esercizio 3 Siano v e w gli unici due nodi di grado dispari del grafo, che chiamiamo G. Se G contiene un ciclo, rimuovendo gli archi del ciclo il grado di ogni nodo del ciclo cala di due unità, mentre gli altri nodi mantengono lo stesso grado. In particolare, nel sottografo cosı̀ ottenuto gli unici due nodi di grado dispari saranno ancora v e w. Iterando questa procedura, otteniamo infine un sottografo aciclico di G (chiamiamolo G′ ) in cui v e w sono gli unici nodi di grado dispari. Poiché |δ(v)| = 6 0 in G′ , esiste uno spigolo vv1 in G′ . Se v1 = w abbiamo trovato un cammino tra v e w in G′ e dunque anche in G. Altrimenti, poiché |δ(v1 )| è pari, deve esserci almeno un altro spigolo di G′ incidente in v1 , diciamo lo spigolo v1 v2 . Se v2 = w abbiamo finito. Altrimenti possiamo continuare la 1 costruzione allungando ancora il cammino. Poiché G′ è aciclico, non torneremo mai ad un nodo già visitato. Questa procedura deve terminare prima o poi, perché il numero di nodi è finito. Ma questo avviene solo se ci imbattiamo in un nodo di grado dispari. Poiché, a parte v, l’unico nodo di grado dispari in G′ è w, cosı̀ facendo troviamo un cammino da v a w in G′ e dunque anche in G. Esercizio 4 (a) Se G contiene un albero ricoprente, allora, poiché gli alberi sono connessi, in G c’è un cammino tra ogni coppia di nodi; dunque G è connesso. Viceversa, supponiamo che G sia connesso. Se G è aciclico, allora G è esso stesso un albero ricoprente di G. Altrimenti, sia C un ciclo di G. Scegliamo un qualunque spigolo uv di C. Mostriamo che rimuovendo lo spigolo uv, il sottografo ottenuto, che chiamiamo G′ , resta connesso. Sia P un qualunque cammino in G tra due nodi w1 , w2 . Se P non usa l’arco uv, allora P esiste ancora in G′ . Supponiamo dunque che uv ∈ E(P ). Senza perdita di generalità, assumiamo che, partendo da w1 , il cammino P tocchi prima u e poi v. Poiché uv ∈ E(C), il ciclo C privato dell’arco uv consiste di un cammino Q tra u e v. Allora, in G′ , i nodi u e v sono connessi. Sempre in G′ , i nodi w1 e u sono conessi e i nodi v e w2 sono connessi (grazie alla parte di P che sopravvive in G′ ). Per transitività della relazione di connessione, u e v sono connessi in G′ . Dunque G′ è un sottografo connesso di G. Inoltre, G′ è definito sugli stessi nodi di G (non ne abbiamo rimosso nessuno). Se G′ contiene cicli, ripetiamo la procedura. Iterando, arriveremo ad un sottografo T di G con le seguenti proprietà: T ha gli stessi nodi di G; T è connesso; T è aciclico. Dunque T è un albero ricoprente di G. (b) Se G = (V, E) è connesso, allora, per il punto (a), G contiene un albero ricoprente T = (V, E ′ ), dove E ′ ⊆ E. Poiché T è un albero, vale |E ′ | = |V | − 1. Dunque |E| ≥ |E ′ | = |V | − 1. Esercizio 5 Prima dimostrazione. Supponiamo per assurdo |E| > |V | − 1. Scegliamo un qualunque sottoinsieme E ′ ⊆ E tale che |E ′ | = |V | − 1. Poiché il grafo G′ = (V, E ′ ) è aciclico e |E ′ | = |V | − 1, G′ è un albero, dunque è connesso. Allora anche G è connesso. Poiché G è anche aciclico, G è un albero. Ma questo contrasta con l’ipotesi |E| > |V | − 1. Seconda dimostrazione. Procediamo per induzione su n = |V |. Se n = 1, allora |E| = 0 = |V |− 1. Fissiamo n ≥ 2 e supponiamo il risultato vero per grafi con meno di n nodi. Poiché G è aciclico, le sue componenti connesse sono alberi (perché ciascuna di esse è un grafo connesso e aciclico). Se tutte le componenti connesse avessero un singolo nodo, allora avremmo |E| = 0 e la tesi seguirebbe subito. Dunque assumiamo che ci sia una componente connessa con almeno due nodi. Poiché ogni albero con almeno due nodi ha una foglia (in realtà due, 2 come sappiamo dal Lemma 5.3), tale componente contiene un nodo v di grado 1. Rimuovendo v da G (insieme all’unico arco incidente in v), otteniamo un grafo G′ = (V ′ , E ′ ) con |V ′ | = |V | − 1 e |E ′ | = |E| − 1. Poiché G′ è aciclico, per induzione |E ′ | ≤ |V ′ | − 1. Ne segue che |E| ≤ |V | − 1. Terza dimostrazione. Sia k il numero di componenti connesse di G (dove ovviamente k ≥ 1), che indichiamo con G1 = (V1 , E1 ), . . . , Gk = (Vk , Ek ). Poiché G è aciclico, Gi è un albero per ogni i = 1, . . . , k. Dunque |Ei | = |Vi | − 1 per i = 1, . . . , k. Da questo segue che |E| = k X |Ei | = i=1 k X (|Vi | − 1) = |V | − k ≤ |V | − 1. i=1 Esercizio 6 Se G = (V, E) è un albero con sequenza deiPgradi (a1 , . . . , an ), allora ai ≥ 1 per P ogni i (perché G è connesso) e ni=1 ai = v∈V |δ(v)| = 2|E| = 2(n − 1). Per il viceversa, sia G = (V, P E) un grafo la cui sequenza dei nodi (a1 , . . . , an ) soddisfi ai ≥ 1 per ogni i e ni=1 ai = 2n − 2. Mostriamo per induzione su n che G è un albero. Se n = 2, la condizione a1 + a2 = 2 implica che entrambi i nodi hanno grado 1 e dunque G è un albero. Fissiamo ora n ≥P2 ed assumiamo che la proprietà sia vera per grafi con meno di n nodi. Poiché ni=1 ai = 2n − 2, esiste i tale che ai = 1; dunque esiste un nodo v di grado 1. Possiamo assumere senza perdita di generalità che i = n e che l’unico nodo adiacente a v corrisponda all’elemento an−1 nella sequenza dei gradi. Rimuovendo da G il nodo v e l’unico arco incidente in v, otteniamo un sottografo con n − 1 nodi la cui sequenza dei gradi è (a1 , . . . , an−2 , an−1 − 1). Poiché n−2 X ai + (an−1 − 1) = i=1 n X ai − an − 1 = 2n − 4 = 2(n − 1) − 2, i=1 possiamo applicare l’ipotesi induttiva e concludere che il grafo cosı̀ ottenuto è un albero. Ne segue che anche G è un albero. Esercizio 7 (a) È sufficiente costruire un grafo orientato D sostituendo ogni spigolo uv di G con la coppia di archi (u, v), (v, u), a ciascuno dei quali diamo costo cuv . Un cammino non orientato da s a t in G corrisponde ad un cammino orientato da s a t in D e viceversa. Inoltre, cammini corrispondenti hanno lo stesso costo. Possiamo applicare l’algoritmo di Bellman-Ford perché non ci sono cilci di costo negativo in D, dato che tutti gli spigoli di G hanno costo non-negativo. (b) Anche in presenza di un solo spigolo uv di costo negativo, gli archi (u, v) e (v, u) formano un ciclo orientato di costo negativo, il che rende inutilizzabile l’algoritmo di Bellman-Ford. 3 Esercizio 8 (a) Sia C un qualunque ciclo di costo negativo. Poiché i nodi di C non sono raggiungibili da s, è facile vedere che per ogni v ∈ V (C) l’algoritmo di Bellman-Ford porrà ℓk (v) = +∞ per ogni k = 0, . . . , n − 1. Dunque l’algoritmo resituirà correttamente ℓ(v) = +∞ per ogni v ∈ V (C). Dobbiamo mostrare che otteniamo la risposta corretta anche per gli altri nodi. Consideriamo un arco (u, v) ∈ A(C). Quando l’algoritmo verifica se ℓk (v) > ℓk−1 (u) + cuv , abbiamo ℓk−1 (u) = +∞ (perché u ∈ V (C)) e dunque la condizione risulterà falsa. Questo significa che gli archi di C non hanno alcuna influenza sullo svolgimento dell’algoritmo. Possiamo dunque immaginare di rimuovere tali archi, ottenendo un grafo D ′ per cui l’algoritmo produce lo stesso output. Se D ′ contiene ancora un ciclo di costo negativo (per ipotesi non raggiungibile da s), ripetendo il ragionamento possiamo immaginare di rimuovere gli archi di tale ciclo senza alterare l’output dell’algoritmo. Continuando, otteniamo un grafo orientato privo di cicli di costo negativo su cui il comportamento dell’algoritmo è lo stesso che avrebbe su D. La tesi ora segue dal fatto che per grafi privi di cicli di costo negativo l’algoritmo è corretto. (b) Sebbene durante il corso abbiamo dimostrato la validità delle equazioni di Bellman sotto l’ipotesi che il grafo non abbia cicli di costo negativo e che tutti i nodi siano raggiungibili da s, è facile vedere che la dimostrazione funziona anche in un contesto più generale, a patto che ci si restringa al sottografo formato dai nodi raggiungibili da s e tale sottografo non abbia cicli di costo negativo (il che significa che il grafo originale non ha cicli di costo negativo raggiungibili da s). Applicando l’algoritmo di Bellman-Ford al grafo dato, se i valori ℓ(v) < ∞ ottenuti in output violano le condizioni di Bellman, allora, per quanto appena osservato, non abbiamo trovato correttamente i cammini minimi. Per il punto (a), questo implica che il grafo contiene cicli di costo negativo raggiungibili da s. Se, invece, i valori ℓ(v) < ∞ ottenuti in output soddisfano le condizioni di Bellman, allora abbiamo trovato un potenziale ammissibile relativo ai soli nodi raggiungibili da s. Questo vuol dire che non c’è un ciclo di costo negativo su tali nodi. Esercizio 9 (a) Per il primo grafo, l’algoritmo di Bellman-Ford produce la seguente tabella: Iterazione k=0 k=1 k=2 k=3 k=4 s 0 (−) 0 (−) 0 (−) 0 (−) 0 (−) a b c d ∞ (−) 10 (s) 8 (b) 8 (b) 8 (b) ∞ (−) 5 (s) 5 (s) 5 (s) 5 (s) ∞ (−) ∞ (−) 11 (a) 9 (a) 9 (a) ∞ (−) ∞ (−) 7 (b) 6 (c) 4 (c) 4 L’albero dei cammini di costo minimo contiene gli archi (s, b), (b, a), (a, c), (c, d). Per il secondo grafo, l’algoritmo produce la seguente tabella: Iterazione k=0 k=1 k=2 k=3 k=4 s 0 0 0 0 0 (−) (−) (−) (−) (−) a b c d ∞ (−) 6 (s) 6 (s) 2 (c) 2 (c) ∞ (−) 7 (s) 7 (s) 7 (s) 7 (s) ∞ (−) ∞ (−) 4 (b) 4 (b) 4 (b) ∞ (−) ∞ (−) 2 (a) 2 (a) −2 (a) L’albero dei cammini di costo minimo contiene gli archi (s, b), (b, c), (c, a), (a, d). (b) Per il primo grafo, alla prima iterazione raggiungiamo a e b, alla seconda c e d; a questo punto possiamo fermarci. L’albero dei cammini di lunghezza minima contiene gli archi (s, a), (s, b), (a, c), (b, d). Per il secondo grafo, alla prima iterazione raggiungiamo a e b, alla seconda c e d; a questo punto possiamo fermarci. L’albero dei cammini di lunghezza minima dipende dagli archi scelti per raggiungere i nodi c e d alla seconda iterazione. Le possibilità sono le seguenti: l’albero contenente gli archi (s, a), (s, b), (a, c), (b, d); quello contenente gli archi (s, a), (s, b), (a, c), (a, d); quello contenente gli archi (s, a), (s, b), (b, c), (b, d); quello contenente gli archi (s, a), (s, b), (b, c), (a, d). Esercizio 10 Fissiamo t ∈ V \ {s} arbitrariamente. Poiché D non contiene cicli di costo negativo e tutti i nodi sono raggiungibili da s, il programma lineare (6.6)– (6.8) delle dispense ed il suo duale (6.9)–(6.10) ammettono entrambi soluzione ottima. Inoltre, il vettore ȳ definito da ȳv = ℓ(v) per ogni v ∈ V è una soluzione ottima del duale (si veda la dimostrazione del Teorema 6.13). I programmi lineari (6.6)–(6.8) e (6.9)–(6.10) associati a D ′ sono ottenuti semplicemente sostituendo A con A′ . Si noti che ȳ è una soluzione ammissibile del duale associato a D ′ . Sia x′ una qualunque soluzione ammissibile per il primale associato a D ′ . Poiché ȳ soddisfa tutti i vincoli duali ad uguaglianza, la coppia di vettori x′ , ȳ soddisfa le condizioni degli scarti complementari. Dunque ogni x′ ammissibile è una soluzione ottima del primale. In particolare, ogni vettore associato ad un cammino da s a t in D ′ (definito tramite la (6.4) delle dispense) è una soluzione ottima del primale. Questo significa che ogni cammino da s a t in D ′ è un cammino minimo da s a t. Poiché questo ragionamento vale per ogni t ∈ V \ {s}, otteniamo la tesi. Esercizio 11 Definiamo un grafo orientato D = (V, A), dove V = {0, . . . , n + 1} e A consiste dei seguenti archi (si veda la Figura 1): • l’arco (0, i) per ogni i ∈ {1, . . . , n}, a cui diamo costo ai ; 5 a5 a4 a3 a2 0123 7654 0 a1 // 0123 7654 1 a2 ((// 0123 7654 2 a3 %%// 0123 7654 3 a4 $$ // 0123 7654 4 a5 ## // 0123 7654 5 0 // 0123 7654 ;;99::66 6 0 0 0 0 Figura 1: Soluzione dell’Esercizio 11 per n = 5. Sono indicati i costi associati agli archi. • l’arco (i − 1, i) per ogni i ∈ {2, . . . , n}, a cui diamo costo ai ; • l’arco (i, n + 1) per ogni i ∈ {1, . . . , n}, a cui diamo costo 0. Scegliamo 0 come sorgente e n + 1 come terminazione dei cammini. Ogni cammino da 0 a n + 1 in D consiste di un arco (s, h), seguito da una sequenza di archi (h, h + 1), . . . , (k − 1, k) per qualche k ∈ {h, . . . , n − 1} (se k = h questa sequenza Pè vuota), a sua volta seguita dall’arco (k, n + 1). Il costo di tale cammino è ki=h ai . Dunque trovando un cammino minimo da 0 a n + 1 troviamo due indici h e k come richiesto. Esercizio 12 Definiamo un grafo orientato in cui c’è un nodo s che rappresenta il mittente S, un nodo t che rappresenta il destinatario T ed un nodo per ogni intermediario. Gli archi indicano i possibili passaggi del messaggio. Sia pi la probabilità che il messaggio venga intercettato al nodo i, con pi = 0 se i ∈ {s, t}. Se ad ogni arco (i, j) assegnassimo come costo il valore 1 − pi (probabilità che il messaggio non venga intercettato al nodo i), il problema consisterebbe nel determinare un cammino da s a t che massimizzi il prodotto dei costi. Per ottenere un problema di cammino minimo nella sua forma usuale, possiamo invece scegliere di assegnare come costi i valori cij = − ln(1 − pi ). In questo modo, il costo totale di un cammino P da s a t sarà X X Y c(P ) = cij = − ln(1 − pi ) = − ln (1 − pi ), (i,j)∈A(P ) (i,j)∈A(P ) (i,j)∈A(P ) che è l’opposto del logaritmo dell’espressione che vogliamo massimizzare. Grazie alla monotonia della funzione logaritmo, massimizzare il prodotto delle probabilità equivale a minimizzare c(P ). Abbiamo dunque ottenuto un problema di cammino minimo. Esercizio 13 Se, ad esempio, un tasso di interesse del 3% viene scritto nella forma 1.03, il problema consiste nel trovare una sequenza di investimenti che massimizzi il prodotto dei tassi di interesse. Costruiamo un grafo con un nodo per ogni anno tra il 2016 ed il 2026 (si veda la Figura 2). Per ognuno dei sei investimenti, 6 − ln(1.03) 0123 7654 16 0 // 0123 7654 17 0 − ln(1.11) // 0123 7654 18 0 // 0123 719 654 0 // 0123 7654 20 − ln(1.03) − ln(1.07) 0 // 0123 721 654 0 // 0123 7654 ::<< 22 0 //** 0123 723 654 0 ((// 0123 7654 24 0 // 0123 725 654 0 $$ // 0123 726 654 − ln(1.06) − ln(1.05) Figura 2: Soluzione dell’Esercizio 13. Sono indicati i costi associati agli archi. creiamo un arco che va dal nodo associato all’anno di inizio dell’investimento al nodo associato all’anno successivo a quello in cui l’investimento termina, assegnandogli come costo l’opposto del logaritmo del tasso di interesse. Ad esempio, all’investimento A corrisponde un arco tra i nodi associati agli anni 2016 e 2018 che ha costo − ln(1.03). Inoltre, per ogni coppia di nodi associati ad anni consecutivi, creiamo un arco di costo zero che corrisponde alla scelta di non investire il denaro durante quell’anno. Con un ragionamento analogo a quello svolto nella soluzione dell’esercizio precedente, il problema di trovare la sequenza di investimenti che massimizza il prodotto dei tassi di interesse è equivalente al problema di trovare un cammino minimo dal nodo associato al 2016 a quello associato al 2026. 7