Problema dello Steiner Tree (a cura di Gerardo Catena) L`istanza

Problema dello Steiner Tree
(a cura di Gerardo Catena)
L’istanza del problema è un grafo G = (V,E), un insieme R  V (dei nodi richiesti) ed
una funzione costo
c: E
R+.
Il problema dello Steiner Tree consiste nel trovare un albero di costo minimo che
ricopra (almeno) i vertici di R.
Si noti che tale problema è simile a quello di trovare un albero di copertura minimo
(MST). Tale problema è risolvibile in tempo polinomiale solo se l’insieme dei vertici
da ricoprire coincide con V.
Quando il problema richiede di ricoprire un sottoinsieme R di vertici, le cose si
complicano. Per capire meglio la differenza tra i due problemi consideriamo il
seguente esempio. Abbiamo un grafo con quattro nodi e l’insieme R è costituito da
tutti i nodi tranne quello centrale:
1
2
1
2
1
2
fig. 1
Un possibile MST è il seguente:
Ed il suo costo è 4.
Tale MST non è però la soluzione ottima al problema dello Steiner Tree.
Come mostrato dalla seguente figura, la soluzione ottima al problema costa 3:
In pratica, considerando anche nodi non richiesti esplicitamente, cioè non
appartenenti ad R, riusciamo ad abbassare il costo della soluzione calcolata
dall’MST.
Ciò che rende difficile il problema è quanto segue:
R è fissato e quindi il calcolo di un MST su R richiede tempo polinomiale.
L’insieme S = R\V dei nodi che potrebbero partecipare alla soluzione ottima ma non
necessariamente richiesti è arbitrario e quindi non fissato. Tale insieme potrebbe
quindi contenere molti nodi e tra questi dobbiamo scegliere quelli che ci fanno
migliorare la soluzione. Scegliere un nodo non richiesto fa scaturire una ricerca di
minimi path considerando un nodo ed un confronto con il risultato di una ricerca di
minimi path non considerando un nodo. Questo va fatto per ogni nodo v di S.
Da qui si capisce che la soluzione del problema è super polinomiale perché si basa su
una ricerca esaustiva.
Il problema dello Steiner Tree è applicabile a parecchi problemi di pratico interesse.
Ad esempio se volessimo fare un multicast in una rete (un nodo trasmettitore vuole
inviare un messaggio ad un sottoinsieme R dei nodi di una rete) e minimizzare il
tempo per effettuarlo, converrebbe calcolare uno Steiner Tree considerando come
funzione costo il tempo necessario a trasmettere un pacchetto su di un link (u,v).
Ecco perché ci interessa trovare un algoritmo di approssimazione per tale problema.
Prima di introdurre l’algoritmo bisogna considerare che G è un grafo qualsiasi, anche
non completo.
La cosa interessante è che per approssimare il problema è sufficiente considerare un
grafo completo. A tale proposito sussiste il seguente teorema:
Teorema.
Per approssimare il problema dello Steiner Tree possiamo limitarci a considerare i
grafi completi.
Dimostrazione:
L’idea è di far vedere che costruendo un grafo completo G’ a partire da G il costo
della soluzione ottimale non cambia.
Costruiamo G’ come segue:
G’=(V,E’) dove V è l’insieme dei nodi di G ed E’ è l’insieme degli archi di G più gli
archi aggiuntivi per completarlo.
Definiamo un costo c’:E’
R+ e tale che per ogni u,v appartenente a V
c’(u,v) è il costo del cammino minimo da u a v in G.
L’algoritmo A che esegue questa trasformazione fa quanto segue:
G=(V,E)
G’=(V,E’)
A
A richiede tempo polinomiale perché calcola uno shortest path tra tutti i nodi di V.
L’algoritmo per calcolo dello shortest path è eseguibile in tempo polinomiale e lo si
denoti con SPT. Il numero di shortest path da calcolare è |V|2 , per un totale di tempo
richiesto O(|V|2 * SPT).
Data questa riduzione dobbiamo verificare che il costo della soluzione ottimale su G
è uguale a quello di G’.
A tale proposito consideriamo quanto segue:
Sia ST[G’] uno Steiner Tree ottimale su G’ e ST[G’] uno Steiner Tree ottimale di G:
vogliamo dimostrare che C(ST[G’]) = C(ST[G]).
c’(u,v) è il costo di un cammino minimo in G e quindi c’(u,v)  c(u,v) ed inoltre ogni
soluzione in G è anche soluzione di G’.
Allora C(ST[G’])  C(ST[G]) (*).
Consideriamo ora quanto segue.
Ogni soluzione ammissibile su G’ non è detto che sia anche una soluzione per G in
quanto ST[G’] potrebbe contenere archi che non appartengono a G.
I costi c’(u,v) corrispondono a cammini minimi in G, allora possiamo pensare di
sviluppare ogni arco (u,v) di ST[G’] nei cammini minimi il cui costo è rappresentato
da c’(u,v).
Sia ST’[G’] il grafo risultante. Si noti che tale grafo non è detto che sia un albero in
quanto potrebbe contenere cammini minimi che formano un ciclo.
In questo caso per ogni ciclo eliminiamo un arco, eliminando di conseguenza un
ciclo. Sia ST’’[G’] tale albero.
Risulta perciò verificata la seguente relazione:
C(ST’’[G’])  C(ST’[G’]) (**)
in quanto abbiamo eliminato degli archi ed inoltre ST’’[G’] è anche uno Steiner
Tree ottimo di G.
In pratica se T è uno Steiner Tree ottimo di G e T’ uno Steiner Tree ottimo su G’
dalla (* ) risulta T’  T, dalla (**) risulta T  T’; dalle due affermazioni insieme si
deduce che T=T’.
Abbiamo pertanto dimostrato che possiamo limitarci a considerare grafi completi per
trovare un’approssimazione allo Steiner Tree. Considerando grafi completi che
rispettino la disuguaglianza euclidea riusciamo ad approssimare in maniera molto
semplice il problema.
Descriviamo l’algoritmo.
Sia G un grafo completo che rispetti la disuguaglianza euclidea:
u, v, w V  c(u, v)  c(u, w)  c( w, v) .
Approx-Steiner-Tree (G,R,c):
 Costruire un MST sui nodi di R.
Ci restano da dimostrare la correttezza, da calcolare la complessità ed il fattore di
approssimazione.
Correttezza:
immediata, in quanto deriva direttamente dalla correttezza dell’MST.
Complessità:
polinomiale in quanto esistono algoritmi che risolvono il problema
dell’MST in tempo polinomiale.
Rapporto Limite:
dobbiamo dimostrare tale algoritmo di approssimazione del problema dello Steiner
Tree su di un grafo G completo ed euclideo ha rapporto limite 2.
In pratica dimostriamo che C(MST)  2C(OPT), dove OPT è la soluzione ottima.
Dimostrazione:
Sia OPT lo Steiner Tree ottimo. E’ chiaro che OPT potrebbe avere nodi sia in R che
in S.
Ora, per ogni (u,v) appartenenti ad OPT aggiungiamo l’arco (v,u):
u
v
u
v
Eseguiamo una visita qualsiasi del grafo ed otteniamo un tour T’.
Sicuramente C(T’)=2C(OPT)
Applichiamo la disuguaglianza triangolare e visitiamo i nodi di T’ saltando i nodi già
visitati e quelli che non appartengono ad R.
Otteniamo così un ciclo W.
C(W)  C(T’)=2C(OPT).
Eliminiamo un arco dal ciclo ed otteniamo un cammino W’ che è un caso particolare
di albero. Risulta perciò:
C(W’)  C(W)  C(T’)=2C(OPT).
Ora W’ è un albero ma deve avere un costo maggiore di MST, in quanto per
definizione l’MST è l’albero di copertura minimo.
Da questa considerazione otteniamo che:
C(MST)  C(W’)  C(W)  C(T’)=2C(OPT)
C(MST)  2C(OPT)
Che era quello che volevamo dimostrare.
[Vaz par. 3.1]