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]