2010-06-14 31 views
10

Estoy oxidado en las plantillas de C++ y estoy usando la biblioteca de gráficos de impulso (una combinación fatal). He buscado en la web y no puedo encontrar ninguna instrucción directa sobre cómo tomar una estructura gráfica personalizada y ajustarla lo suficiente a BGL (biblioteca de gráficos de refuerzo) que puedo usar para aumentar los algoritmos de desplazamiento de gráficos. ¿Alguien suficientemente familiarizado con la biblioteca para ayudarme?¿Cómo adaptar un gráfico personalizado a la plantilla de la biblioteca de gráficos de impulso?

EDITAR: Entonces, el principal problema que he tenido es dónde encontrar una fuente donde los requisitos totales para asignar un gráfico arbitrario a un gráfico BGL. Soy realmente nuevo en las plantillas, así que es difícil para mí leer las especificaciones/ejemplos de BGL. ¿Tal vez debería buscar una fuente general sobre plantillas?

+0

Ayudaría si pudiéramos ver una muestra de cómo se ve la estructura gráfica personalizada. –

Respuesta

5

El enfoque, según tengo entendido, es especializar la estructura boost::graph_traits para su tipo de gráfico. Esto configura BGL con varias propiedades importantes que necesita saber sobre su gráfico. A continuación, especializa las funciones de plantilla globales para el tipo especializado graph_traits de su gráfico para implementar cualquier interfaz gráfica de impulso que pueda aplicar a su tipo específico de gráfico.

Un ejemplo es allí mismo, en la documentación BGL:

http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/leda_conversion.html

Hay enlaces para varios de los diferentes interfaces de allí, que indican qué funciones globales plantilla que tendrá que especializarse para su gráfica si quieres apoyar esa interfaz La lista completa de las interfaces está aquí:

http://www.boost.org/doc/libs/1_43_0/libs/graph/doc/graph_concepts.html

+1

He leído la mayoría de la documentación de BGL que el sitio tiene con respecto a conseguir que la plantilla funcione. Sin embargo, si no está familiarizado con LEDA, el ejemplo que muestra no es trivial y no está bien explicado. Si miras su código, está casi completamente desprovisto de comentarios. Cada pieza de código que he encontrado en el sitio de gráfico de impulso está casi completamente desprovista de comentarios, y para un objeto este genérico es bastante desalentador. – Michael

+0

Le ayudará, entonces, si indica cosas específicas que no le son claras o aspectos específicos relacionados con la estructura de su gráfico que dificultan la adaptación. –

+0

es suficiente, pondrá una edición más tarde hoy – Michael

6

Mi sugerencia sería abandonar el uso de BGL por completo a menos que usted ya tiene una cantidad significativa de código escrito en la parte superior de la misma. Lo estaba probando recientemente para su uso futuro en un gran proyecto de análisis de gráficos, y me pareció casi inutilizable debido a una API demasiado compleja y mal diseñada.

No hay tareas simples en BGL, solo complejas, y estuve peleando constantemente con el compilador debido a la jerarquía de plantillas excesivamente complicada que tiene BGL. La poca o ninguna documentación útil (al menos no donde realmente se necesita) y no suficientes ejemplos solo agravan las cosas. Esa no es forma de escribir código.

Recomiendo cambiar a LEMON. Es estable, está escrito en C++, es fácil de entender y codifica, ofrece varias formas especializadas de gráficos para soportar diferentes necesidades de uso, y es compatible con las funciones de búsqueda/visitante de BFS y DFS. También tiene su propio equivalente de mapas de propiedades para nodos/bordes, por lo que debería poder ajustar su propia estructura de gráficos y otros datos en ella.

Probar LEMON; sabe mucho mejor y causará menos úlceras. ;-)

+2

Acabo de terminar de probar LEMON en un gráfico con 1 millón de nodos y 100 millones de bordes; escalado muy bien sin problemas de rendimiento, etc. –

+0

¡Gracias por la idea!Lamentablemente, estoy trabajando con una base de código GRANDE y no creo que mis jefes quieran otra dependencia: S – Michael

+1

Ah, y es bueno saber que no soy el único que piensa que BGL es completamente complejo y demasiado general y que los ejemplos no son ¡particularmente revelador! – Michael

Cuestiones relacionadas