Para un proyecto en el que estoy trabajando, debería generar árboles de expansión aleatorios con altura acotada.
Básicamente hago lo siguiente: 1) Generar un árbol de expansión 2) Verificar la viabilidad, si es posible, mantenerlo.
1) Comenzando desde un árbol de expansión mínimo (Prim o Kruskal) agrego un borde no existente y esto crea un ciclo, detecto este ciclo y elimino uno de los bordes de este ciclo que me da un nuevo árbol de expansión y continúo con este árbol de expansión agregando un nuevo borde ...
2) Supongamos que hay un vértice especial . Para cada vértice v , la longitud de la ruta de v a V c e n t e r debería ser menor que δ , donde δ es un parámetro dado.
¿Hay alguna forma mejor (inteligente) de hacer esto?
PD: Olvidé especificar la otra restricción (mi error): el grado de los vértices también debería estar limitado.
Respuestas:
Estuve trabajando en árboles de expansión de profundidad limitada hace unos años, son realmente interesantes. A algunos de mis colegas se les ocurrieron algoritmos de paso de mensajes que hicieron un gran trabajo, pero no puedo encontrar ninguno de sus códigos disponibles. Lo escribimos en un estilo de física aquí: http://iopscience.iop.org/1742-5468/2009/12/P12010/ . Me han dicho que también funciona con límites de grado, aunque eso no llegó al papel.
El enfoque que propone, que yo llamaría Markov Chain Monte Carlo, es a menudo un competidor del enfoque de transmisión de mensajes. Si está interesado en muestrear de manera aproximadamente uniforme al azar del conjunto de árboles que abarcan grados limitados y profundidades delimitadas de un gráfico dado, sugiero alterar su enfoque para utilizar límites "suaves". Es decir, en lugar de rechazar un intercambio de borde que hace que el árbol viole el límite de profundidad, acéptelo, pero con menor probabilidad que un intercambio que no viole el límite. Si tiene un parámetro que controla qué tan baja es esta probabilidad, puede hacer que la restricción que viola las configuraciones sea cada vez menos probable hasta que llegue a una solución factible que sea casi aleatoria de manera uniforme.
La gran pregunta es cuánto tiempo necesita para ejecutar la cadena. Dado que un árbol de expansión con un grado máximo de 2 es un camino hamiltoniano, debe esperar que cualquier límite genérico sea exponencial en el tamaño del gráfico. Pero tal vez los gráficos que le interesan sean especiales de alguna manera.
fuente
Sin embargo, no estoy seguro de si el algoritmo que describió generará un árbol de expansión aleatorio. En su lugar, recomendaría buscar algoritmos estándar. Hay dos algoritmos: el algoritmo de Wilson y el algoritmo de Aldous-Broder. Puedes echar un vistazo aquí . Hay un algoritmo más nuevo (de aproximación) pero es bastante complicado.
Además, podría haber una manera de generar este árbol de expansión con altura limitada directamente. Pero nunca he oído hablar de tales algoritmos.
fuente
Utilice la búsqueda de amplitud primero! Haga un BFS desde cada vértice en el gráfico, elija el árbol resultante de menor altura. Un BFS siempre encuentra la ruta desde la raíz a cualquier otro vértice con la menor cantidad de saltos.
fuente