Estou desenvolvendo um módulo de gerenciamento e roteamento de sinais para um sistema audiovisual integrado e estou projetando-o com a intenção de ser o mais flexível possível em diferentes redes de distribuição de sinais. A intenção do módulo é manipular o roteamento entre vários comutadores de matriz empilhados 1 e manipular a conversão de formato necessária.
A melhor solução que eu explorei neste momento é mapear a rede para um gráfico com vértices discretos para cada tipo de sinal suportado pelos comutadores e que são então unidos por nós que representam os processadores de vídeo que manipulam a conversão de formato.
Cores representam formatos de sinal. Nós redondos são comutadores, fontes ou sumidouros. Nós quadrados são processadores de vídeo que realizam conversão de formato.
A partir daí, posso usar uma implementação do algoritmo de Dijkstra para identificar o caminho que deve ser formado para obter a entrada X na saída Y. Isso deve permitir que os dados sobre a configuração de entrada / saída de todos os comutadores e processadores sejam transmitidos e o módulo se adapta de acordo.
Essa é uma solução apropriada ou existe uma abordagem alternativa que talvez valha a pena investigar?
1 aka 'crossbar switch', um roteador de vídeo com saídas M x N de entrada que suporta conexões um para muitos. Cada dispositivo físico pode lidar com vários formatos de sinal e pode ou não ser capaz de executar qualquer conversão de formato.
edit: Como mencionado por Péter Török, o gráfico não será necessariamente uma árvore, o diagrama é um exemplo simples para ilustrar a ideia. Quando implementados no 'mundo real', vários caminhos podem existir, oferecendo níveis variados de definição (DVI> VGA> componente> composto) que eu planejava representar com ponderação de borda.
edit 2: Here's an slightly more comprehensive example with directivity indicated and showing a network consisting of two signal types. The initial example has been modified slightly so that each input and output on a device is defined as a discrete node as this will provide the data required to control matrix routing / input selection.
fonte
Respostas:
This is a tree, Dijkstra is O(n^2) overkill. Trivial O(n) breadth-first search is enough.
EDIT: Start the BFS in any node with degree at least two.
EDIT2: Since the graph is not guaranteed to be a tree, use Dijkstra, if you want to optimize a little, you can first "strip" the graph all the vertices of degree one (for them, the path is trivial), including those that happen to acquire degree one due to stripping their ex-neighbours, and do the Dijkstra on the rest (which is exactly the "non-tree" part).
Plus, I would say you want paths from every node to every other, don't you? Dijsktra's algorithm does only paths from one to all others. Maybe do Floyd-Warshall algorithm on the stripped rest. Of course, if the topology is very dynamic, it is best to do the (stripping and) Dijkstra, ad hoc.
fonte
You may be able to use A* (the more general form of Dijkstra's algorithm) for searching the graph in question. You mention the costs of the weightings in your comment:
If I understand it correctly, you want to find the lowest cost path path from the start to the goal. If you provide each node both an actual cost and an estimate (heuristic) to the goal (that is both admissible and consistent), then A* is guaranteed to provide an optimal solution. It might be overkill though, depending on how well I understand your problem.
fonte