¿Es el algoritmo de Dijkstra una solución adecuada para este problema de enrutamiento de señal?

12

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.

Gráfico de ejemplo

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. Ejemplo 2: dos tipos de señal, conmutadores apilados

Kim Burgess
fuente
¿Pretende que las ponderaciones de borde sean multiplicativas?
Peter Taylor
Aditivo. La teoría es que esto permitirá que se defina de modo que cuanto mayor sea la definición de la ruta de la señal, menor será la ponderación. Los bordes que conectan nodos que realizan conversión de formato recibirían una ponderación más alta que la asignada a los bordes que conectan nodos de no conversión. Esto enrutaría la señal en su formato nativo si es posible, solo involucrando la conversión de formato (y la degradación de la señal asociada y la utilización del equipo) cuando sea necesario.
Kim Burgess
1
@PeterTaylor: ¿Importaría si fueran multiplicativos? Tienen exactamente la misma semántica que el aditivo (siempre que sean positivos) aplicando un logaritmo. ¿O es algo más complicado detrás de esto?
herby
@herby, buen punto, no había pensado en eso. cuelga cabeza avergonzado
Peter Taylor

Respuestas:

4

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.

herby
fuente
2
Creo que el gráfico que se muestra arriba es un ejemplo simple (ified) y en la vida real a menudo puede haber múltiples rutas alternativas entre dos nodos (formatos), es decir, es posible que no cuente con que el gráfico siempre sea un árbol.
Péter Török
Implementado adecuadamente, el algoritmo de Dijkstra también sería O ( n ), aunque más complicado y aún exagerado.
Peter Taylor
@ PéterTörök: En ese caso, sí. Solo el autor de la pregunta lo sabe con certeza. Pero cuando es un árbol, bfs es suficiente (y absolutamente simple).
herby
@PeterTaylor: Interesante. ¿Alguna fuente, por favor?
herby
@ PéterTörök es correcto. Ver pregunta editada.
Kim Burgess
2

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:

Aditivo. La teoría es que esto permitirá que se defina de modo que cuanto mayor sea la definición de la ruta de la señal, menor será la ponderación. Los bordes que conectan nodos que realizan conversión de formato recibirían una ponderación más alta que la asignada a los bordes que conectan nodos de no conversión. Esto enrutaría la señal en su formato nativo si es posible, solo involucra la conversión de formato (y la degradación de la señal asociada y la utilización del equipo) cuando sea necesario

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.

jdt141
fuente
+1: Además, IIRC, la heurística siempre tiene que estimar un costo que es peor que el costo real para garantizar un camino óptimo. En el peor de los casos, si no puede obtener la heurística correcta, simplemente devuelva 0 de la heurística y obtendrá el algoritmo de dijkstra.
Steven Evers