Come posso generare casualmente alberi spanning ad altezza limitata?


9

Per un progetto a cui sto lavorando, dovrei generare alberi spanning casuali con altezza limitata.

Fondamentalmente faccio quanto segue: 1) Genera un albero di spanning 2) Verifica la fattibilità, se fattibile tienilo.

1) Partendo da un albero di spanning minimo (di Prim o Kruskal) aggiungo un bordo inesistente e questo crea un ciclo, rilevo questo ciclo e rimuovo uno dei bordi di questo ciclo che mi dà un nuovo albero di spanning e continuo con questo spanning tree aggiungendo un nuovo bordo ...

2) Supponiamo che ci sia un vertice speciale . Per ogni vertice v , la lunghezza del percorso da v a V c e n t e r deve essere inferiore a δ , dove δ è un dato parametro.vcentervvVcenterδδ

Esiste un modo migliore (intelligente) per farlo?

PS Ho dimenticato di specificare l'altro vincolo (errore mio): anche il grado dei vertici dovrebbe essere limitato.


Non sono sicuro di aver capito bene. Nel primo passaggio, rimuovi il bordo solo casualmente o in modo che l'altezza dell'albero sia (possibilmente) ridotta?
Sacha,

Aggiungo e rimuovo casualmente i bordi.
Arman,

Potresti invece provare il percorso più breve casuale che attraversa gli alberi? Semplifica le cose
Yaroslav Bulatov,

hai qualche costo sui bordi? stai cercando un albero spanning con altezza e costo minimo? Come ha scritto @pboothe, puoi usare BFS e basta. L'unico problema è che BFS utilizza troppa memoria. Se ti interessano i costi, puoi provare l'algoritmo in wikipedia per gli alberi di spanning minimi euclidei ( en.wikipedia.org/wiki/Euclidean_minimum_spanning_tree ). Ha un tempo di esecuzione di O ( n log n ) con O ( n ) di spazio. δO(nlogn)O(n)
Marcos Villagra,

Quindi il tuo problema ha tre quantità limitate: altezza dell'albero, grado di ciascun vertice e distanza da v_center, giusto? Solo il vincolo del grado limitato rende il problema NP-difficile, ma suppongo che tu stia cercando un metodo che probabilmente produrrà una soluzione rapidamente e non un algoritmo esatto.
Jagadish,

Risposte:


7

Alcuni anni fa stavo lavorando su alberi a profondità limitata, sono davvero interessanti. Alcuni miei colleghi hanno escogitato algoritmi di passaggio dei messaggi che hanno fatto un ottimo lavoro, ma non riesco a trovare nessuno dei loro codici disponibili. Lo abbiamo scritto in uno stile fisico qui: http://iopscience.iop.org/1742-5468/2009/12/P12010/ . Mi hanno detto che funziona anche con limiti di laurea, anche se questo non è stato inserito nel documento.

L'approccio che proponi, che definirei Markov Chain Monte Carlo, è spesso in concorrenza con l'approccio del passaggio di messaggi. Se sei interessato a campionare approssimativamente in modo uniforme in modo casuale dall'insieme di alberi a spargimento di profondità limitata, di un determinato grafico, ti suggerisco di modificare il tuo approccio per usare i limiti "soft". Vale a dire invece di rifiutare uno scambio di bordo che fa sì che l'albero violi il limite di profondità, accettalo, ma con una probabilità inferiore rispetto a uno scambio che non viola il limite. Se si dispone di un parametro che controlla quanto più bassa è questa probabilità, è possibile rendere il vincolo che viola le configurazioni sempre meno probabile fino ad arrivare a una soluzione fattibile quasi uniformemente casuale.

La grande domanda è per quanto tempo devi far funzionare la catena. Poiché un albero di spanning con un massimo di 2 è un percorso hamiltoniano, dovresti aspettarti che qualsiasi limite generico sia esponenziale nella dimensione del grafico. Ma forse i grafici che ti interessano sono in qualche modo speciali.


2
Maggiori dettagli, oltre a un film: healthyalgorithms.wordpress.com/2010/12/23/…
Abraham Flaxman,

3

SShhh

Tuttavia, non sono sicuro che l'algoritmo che hai descritto genererà un spanning tree casuale. Consiglierei invece di guardare algoritmi standard. Esistono due algoritmi: l'algoritmo di Wilson e l'algoritmo di Aldous-Broder. Puoi dare un'occhiata qui . Esiste un nuovo algoritmo (approssimazione) ma è piuttosto complicato.

Inoltre, potrebbe esserci un modo per generare direttamente questo spanning tree con altezza limitata. Ma non ho mai sentito parlare di tali algoritmi.


1

Usa la ricerca per primo! Esegui un BFS da ogni vertice nel grafico, scegli l'albero risultante della più piccola altezza. Un BFS trova sempre il percorso dalla radice ad ogni altro vertice con il minor numero di salti.


Hai perfettamente ragione. Abbiamo iniziato a lavorare con BFS ma non ha funzionato a causa del vincolo dei gradi sui vertici. Ho dimenticato di menzionare questo vincolo (il mio errore): anche il grado dei vertici nell'albero generato dovrebbe essere limitato. La tua risposta è corretta con la domanda attuale, ma penso che dovrei modificare la mia domanda.
Arman,

Quindi il tuo problema è quasi sicuramente NPC per riduzione da Degree Constrained Spanning Tree - en.wikipedia.org/wiki/Degree-constrained_spanning_tree
Peter Boothe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.