Ottimizzazione Discreta – Esercizi V: Soluzioni

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