Estoy en el proceso de desarrollar un módulo de enrutamiento y gestión de señal para un sistema audiovisual integrado y lo estoy diseñando con la intención de ser lo más flexible posible en diferentes redes de distribución de señal. La intención del módulo es manejar el enrutamiento a través de varios conmutadores de matriz apilados 1 y manejar la conversión de formato necesaria.
La mejor solución que he explorado en este punto es mapear la red en un gráfico con vértices discretos para cada tipo de señal compatible con los conmutadores y que luego se unen a través de nodos que representan los procesadores de video que manejan la conversión de formato.
Los colores representan formatos de señal. Los nodos redondos son conmutadores, fuentes o sumideros. Los nodos cuadrados son procesadores de video que realizan conversión de formato.
A partir de ahí, puedo usar una implementación del algoritmo de Dijkstra para identificar la ruta que debe formarse para que la entrada X salga Y. Esto debería permitir que se pasen los datos sobre la configuración de entrada / salida de todos los conmutadores y procesadores. y el módulo se adapta en consecuencia.
¿Es esta una solución apropiada o hay un enfoque alternativo que valga la pena investigar?
1 también conocido como 'interruptor de barra cruzada', un enrutador de video con M entradas x N salidas que admite conexiones de uno a muchos. Cada dispositivo físico puede manejar múltiples formatos de señal y puede o no ser capaz de realizar cualquier conversión de formato.
editar: Como mencionó Péter Török, el gráfico no será necesariamente un árbol, el diagrama es un ejemplo simple para ilustrar la idea. Cuando se implementa en el "mundo real", pueden existir múltiples caminos que ofrecen diferentes niveles de definición (DVI> VGA> componente> compuesto) que estaba planeando representar con ponderación de borde.
editar 2: Aquí hay un ejemplo un poco más completo con directividad indicada y que muestra una red que consta de dos tipos de señal. El ejemplo inicial se ha modificado ligeramente para que cada entrada y salida en un dispositivo se defina como un nodo discreto, ya que esto proporcionará los datos necesarios para controlar el enrutamiento de la matriz / selección de entrada.
fuente
Respuestas:
Este es un árbol, Dijkstra es O ( n ^ 2 ) exageración. La búsqueda trivial O ( n ) de amplitud es suficiente.
EDITAR: Inicie el BFS en cualquier nodo con un grado de al menos dos.
EDIT2: Dado que no se garantiza que el gráfico sea un árbol, use Dijkstra, si desea optimizar un poco, primero puede "despojar" del gráfico todos los vértices de primer grado (para ellos, el camino es trivial), incluidos aquellos eso sucede para adquirir el primer grado debido a despojar a sus ex vecinos, y hacer el Dijkstra en el resto (que es exactamente la parte "no arbórea").
Además, diría que quieres rutas de cada nodo a otro, ¿no? El algoritmo de Dijsktra solo hace rutas de uno a todos los demás. Tal vez haga el algoritmo Floyd-Warshall en el resto despojado. Por supuesto, si la topología es muy dinámica, lo mejor es hacer la (eliminación y) Dijkstra, ad hoc.
fuente
Es posible que pueda usar A * (la forma más general del algoritmo de Dijkstra) para buscar el gráfico en cuestión. Usted menciona los costos de las ponderaciones en su comentario:
Si lo entiendo correctamente, desea encontrar la ruta de ruta de menor costo desde el principio hasta el objetivo. Si proporciona a cada nodo un costo real y una estimación (heurística) de la meta (que es admisible y consistente), entonces A * garantiza una solución óptima. Sin embargo, puede ser excesivo, dependiendo de qué tan bien entienda su problema.
fuente