L'algoritmo di Dijkstra è una soluzione adeguata a questo problema di routing del segnale?


12

Sto sviluppando un modulo di gestione e instradamento del segnale per un sistema audiovisivo integrato e lo sto progettando con l'intento di essere il più flessibile possibile su diverse reti di distribuzione del segnale. L'intento del modulo è gestire il routing attraverso un numero di switcher di matrici impilate 1 e gestire la conversione di formato necessaria.

La migliore soluzione che ho esplorato a questo punto è mappare la rete su un grafico con vertici discreti per ciascun tipo di segnale supportato dagli switcher e che vengono poi uniti tramite nodi che rappresentano i processori video che gestiscono la conversione del formato.

Grafico di esempio

I colori rappresentano i formati del segnale. I nodi rotondi sono switcher, origini o sink. I nodi quadrati sono processori video che eseguono la conversione del formato.

Da lì posso usare un'implementazione dell'algoritmo di Dijkstra per identificare il percorso che deve essere formato per ottenere l'input X all'output Y. Ciò dovrebbe consentire il passaggio dei dati sulla configurazione input / output di tutti gli switcher e processori e il modulo si adatta di conseguenza.

È una soluzione appropriata o esiste un approccio alternativo che potrebbe valere la pena di indagare?

1 aka "interruttore a barra", un router video con ingresso M x uscite N che supporta connessioni da uno a molti. Ogni dispositivo fisico può gestire più formati di segnale e può o meno essere in grado di eseguire qualsiasi conversione di formato.

modifica: Come menzionato da Péter Török, il grafico non sarà necessariamente un albero, il diagramma è un semplice esempio per illustrare l'idea. Se implementati nel "mondo reale", possono esistere più percorsi che offrono diversi livelli di definizione (DVI> VGA> componente> composito) che stavo pianificando di rappresentare con la ponderazione dei bordi.

modifica 2: ecco un esempio leggermente più completo con la direttività indicata e che mostra una rete composta da due tipi di segnale. L'esempio iniziale è stato leggermente modificato in modo tale che ogni input e output su un dispositivo sia definito come un nodo discreto poiché fornirà i dati richiesti per controllare il routing / selezione degli input della matrice. Esempio 2: due tipi di segnale, commutatori sovrapposti


Intendi che le ponderazioni dei bordi siano moltiplicative?
Peter Taylor,

Additivo. La teoria in base a ciò consentirà di definirla in modo tale che maggiore è la definizione del percorso del segnale, minore è la ponderazione. Ai bordi che collegano i nodi che eseguono la conversione del formato verrebbe quindi assegnata una ponderazione superiore a quella assegnata ai bordi che collegano i nodi non di conversione. Questo indirizzerebbe il segnale nel suo formato nativo, se possibile, coinvolgendo solo la conversione del formato (e il relativo degrado del segnale e l'utilizzo dell'apparecchiatura) quando necessario.
Kim Burgess,

1
@PeterTaylor: Avrebbe importanza se fossero moltiplicativi? Hanno la stessa semantica esatta dell'additivo (purché positivi) applicando un logaritmo. O è qualcosa di più complicato dietro di esso?
erbaceo

@herby, buon punto, non ci avevo pensato. pende la testa nella vergogna
Peter Taylor l'

Risposte:


4

Questo è un albero, Dijkstra è eccessivo O ( n ^ 2 ). Trivial O ( n ) ricerca in ampiezza è sufficiente.

EDIT: avviare il BFS in qualsiasi nodo con laurea almeno due.

EDIT2: Dal momento che il grafico non è garantito per essere un albero, usa Dijkstra, se vuoi ottimizzare un po ', puoi prima "spogliare" il grafico di tutti i vertici di grado uno (per loro, il percorso è banale), compresi quelli che capita di acquisire il primo grado a causa della spogliatura dei loro ex vicini e di fare il Dijkstra sul resto (che è esattamente la parte "non albero").

Inoltre, direi che vuoi percorsi da ogni nodo verso l'altro, vero? L'algoritmo di Dijsktra esegue solo percorsi da uno a tutti gli altri. Forse fare l'algoritmo di Floyd-Warshall sul resto messo a nudo. Certo, se la topologia è molto dinamica, è meglio fare (stripping e) Dijkstra, ad hoc.


2
Credo che il grafico visualizzato sopra sia un esempio semplice (ified) e nella vita reale potrebbero spesso esserci più percorsi alternativi tra due nodi (formati), vale a dire che non si può contare sul fatto che il grafico sia sempre un albero.
Péter Török il

Se opportunamente implementato, l'algoritmo di Dijkstra sarebbe anche O ( n ), sebbene più complicato e ancora eccessivo.
Peter Taylor,

@ PéterTörök: in tal caso, sì. Solo chi lo sa sa per certo. Ma quando è un albero, bfs è abbastanza (e morto semplice).
Herby il

@PeterTaylor: interessante. Qualche fonte, per favore?
lei il

@ PéterTörök è corretto. Vedi domanda modificata.
Kim Burgess,

2

Potresti essere in grado di usare A * (la forma più generale dell'algoritmo di Dijkstra) per cercare il grafico in questione. Nel commento commentate i costi dei coefficienti correttori:

Additivo. La teoria in base a ciò consentirà di definirla in modo tale che maggiore è la definizione del percorso del segnale, minore è la ponderazione. Ai bordi che collegano i nodi che eseguono la conversione del formato verrebbe quindi assegnata una ponderazione superiore a quella assegnata ai bordi che collegano i nodi non di conversione. Questo instraderebbe il segnale nel suo formato nativo, se possibile, coinvolgendo solo la conversione del formato (e il degrado del segnale associato e l'utilizzo dell'apparecchiatura) quando necessario

Se lo capisco correttamente, si desidera trovare il percorso di costo più basso dall'inizio all'obiettivo. Se si fornisce a ciascun nodo sia un costo effettivo sia una stima (euristica) per l'obiettivo (che è sia ammissibile che coerente), allora A * è garantito per fornire una soluzione ottimale. Potrebbe essere eccessivo, a seconda di quanto bene comprendo il tuo problema.


+1: Inoltre, IIRC, l'euristica deve sempre stimare un costo peggiore del costo effettivo per garantire un percorso ottimale. Nel peggiore dei casi, se non riesci a ottenere l'euristica corretta, restituisci 0 dall'euristica e avrai l'algoritmo di dijkstra.
Steven Evers,
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.