Ich bin dabei, ein Signalmanagement- und Routing-Modul für ein integriertes audiovisuelles System zu entwickeln und entwerfe es mit der Absicht, über verschiedene Signalverteilungsnetze hinweg so flexibel wie möglich zu sein. Die Absicht des Moduls ist es, das Routing über eine Anzahl von gestapelten Matrixschaltern 1 und die erforderliche Formatkonvertierung zu handhaben.
Die beste Lösung, die ich an dieser Stelle untersucht habe, besteht darin, das Netzwerk auf einen Graphen mit diskreten Eckpunkten für jeden von den Switchern unterstützten Signaltyp abzubilden, die dann über Knoten verbunden werden, die die Videoprozessoren darstellen, die die Formatkonvertierung handhaben.
Farben repräsentieren Signalformate. Runde Knoten sind entweder Switcher, Quellen oder Senken. Quadratknoten sind Videoprozessoren, die eine Formatkonvertierung durchführen.
Von dort aus kann ich mit einer Implementierung des Dijkstra-Algorithmus den Pfad identifizieren, der gebildet werden muss, um die Eingabe X zur Ausgabe Y zu bringen. Dies sollte die Übergabe der Daten über die Eingabe- / Ausgabekonfiguration aller Switches und Prozessoren ermöglichen und das Modul entsprechend anpassen.
Ist dies eine angemessene Lösung oder gibt es einen alternativen Ansatz, der möglicherweise untersucht werden sollte?
1 auch als "Crossbar-Switch" bezeichnet, ein Video-Router mit M Eingängen und N Ausgängen, der 1: 1-Verbindungen unterstützt. Jedes physikalische Gerät kann mehrere Signalformate verarbeiten und ist möglicherweise nicht in der Lage, eine Formatkonvertierung durchzuführen.
edit: Wie von Péter Török erwähnt, wird die Grafik nicht unbedingt ein Baum sein, das Diagramm ist ein einfaches Beispiel, um die Idee zu veranschaulichen. Bei der Implementierung in der "realen Welt" können mehrere Pfade existieren, die unterschiedliche Definitionsebenen bieten (DVI> VGA> Component> Composite), die ich mit Kantengewichtung darstellen wollte.
edit 2: Hier ist ein etwas umfassenderes Beispiel mit angegebener Richtwirkung und einem Netzwerk, das aus zwei Signaltypen besteht. Das erste Beispiel wurde geringfügig geändert, sodass jeder Ein- und Ausgang eines Geräts als diskreter Knoten definiert ist, da hierdurch die zur Steuerung des Matrixroutings / der Eingangsauswahl erforderlichen Daten bereitgestellt werden.
quelle
Antworten:
Dies ist ein Baum, Dijkstra ist O ( n ^ 2 ) Overkill. Triviale O ( n ) Breitensuche ist ausreichend.
BEARBEITEN: Starten Sie das BFS in einem beliebigen Knoten mit mindestens zwei Graden.
EDIT2: Da das Diagramm nicht unbedingt ein Baum ist, verwenden Sie Dijkstra. Wenn Sie ein wenig optimieren möchten, können Sie zuerst alle Scheitelpunkte des ersten Grades (für sie ist der Pfad trivial) einschließlich dieser "streifen" Das passiert, um Grad eins zu erreichen, weil man seine Ex-Nachbarn entkleidet und die Dijkstra für den Rest erledigt (was genau der "Nicht-Baum" -Teil ist).
Außerdem würde ich sagen, Sie möchten Pfade von jedem Knoten zu jedem anderen, nicht wahr? Dijsktras Algorithmus führt nur Pfade von einem zu allen anderen aus. Vielleicht tun Floyd-Warshall-Algorithmus auf dem Rest abgestreift. Wenn die Topologie sehr dynamisch ist, ist es natürlich am besten, die (Abisolier- und) Dijkstra ad hoc durchzuführen.
quelle
Möglicherweise können Sie A * (die allgemeinere Form des Dijkstra-Algorithmus) zum Durchsuchen des betreffenden Diagramms verwenden. In Ihrem Kommentar erwähnen Sie die Kosten für die Gewichtung:
Wenn ich es richtig verstehe, möchten Sie den Pfad mit den niedrigsten Kosten vom Anfang bis zum Ziel finden. Wenn Sie jedem Knoten sowohl die tatsächlichen Kosten als auch eine Schätzung (heuristisch) für das Ziel bereitstellen (die zulässig und konsistent ist), bietet A * garantiert eine optimale Lösung. Es könnte jedoch übertrieben sein, abhängig davon, wie gut ich Ihr Problem verstehe.
quelle