Я нахожусь в процессе разработки модуля управления сигналами и маршрутизации для интегрированной аудиовизуальной системы и проектирую его с целью обеспечения максимальной гибкости в различных сетях распределения сигналов. Целью модуля является обработка маршрутизации через несколько стековых матричных коммутаторов 1 и обработка необходимого преобразования формата.
Лучшее решение, которое я исследовал в этой точке, - это отобразить сеть на графике с дискретными вершинами для каждого типа сигнала, поддерживаемого коммутаторами, и затем соединить через узлы, представляющие видеопроцессоры, которые обрабатывают преобразование формата.
Цвета представляют форматы сигналов. Круглые узлы являются либо переключателями, источниками или приемниками. Квадратные узлы - это видеопроцессоры, которые выполняют преобразование формата.
Оттуда я могу использовать реализацию алгоритма Дейкстры, чтобы определить путь, который должен быть сформирован, чтобы получить вход X для вывода Y. Это должно позволить передавать данные о конфигурации ввода / вывода всех коммутаторов и процессоров в и модуль адаптируется соответственно.
Это подходящее решение или есть альтернативный подход, который стоит изучить?
1 aka 'crossbar switch', видеомаршрутизатор с M входом x N выходов, который поддерживает соединения «один ко многим». Каждое физическое устройство может обрабатывать несколько форматов сигналов и может или не может выполнять любое преобразование формата.
редактировать: как упоминал Петер Török, график не обязательно будет деревом, диаграмма является простым примером, чтобы проиллюстрировать идею. При реализации в «реальном мире» могут существовать несколько путей, которые предлагают различные уровни определения (DVI> VGA> компонент> композитный), которые я планировал представить с использованием граничных весов.
редактировать 2: Вот немного более полный пример с указанием направленности и изображением сети, состоящей из двух типов сигналов. Первоначальный пример был слегка изменен, так что каждый вход и выход на устройстве определяется как отдельный узел, поскольку он будет предоставлять данные, необходимые для управления маршрутизацией матрицы / выбором входа.
источник
Ответы:
Это дерево, Дейкстра O ( n ^ 2 ) излишним. Тривиальный O ( n ) поиск в ширину достаточно.
РЕДАКТИРОВАТЬ: Запустите BFS в любом узле со степенью не менее двух.
РЕДАКТИРОВАТЬ 2: Поскольку граф не гарантированно является деревом, используйте Dijkstra, если вы хотите немного оптимизировать, вы можете сначала «обрезать» граф все вершины степени один (для них путь тривиален), в том числе которые получают первую степень из-за того, что лишают своих бывших соседей, и делают Дейкстру на остальной части (которая является частью «не-дерева»).
Кроме того, я бы сказал, что вам нужны пути от каждого узла к другому, не так ли? Алгоритм Dijsktra делает только пути от одного до всех других. Может быть, сделать алгоритм Флойда-Варшалла на раздетом отдыхе. Конечно, если топология очень динамична, лучше всего сделать (раздевание и) Dijkstra, ad hoc.
источник
Возможно, вы сможете использовать A * (более общую форму алгоритма Дейкстры) для поиска рассматриваемого графа. Вы упоминаете стоимость взвешивания в своем комментарии:
Если я правильно понимаю, вы хотите найти путь с наименьшей стоимостью пути от начала до цели. Если вы предоставите каждому узлу как фактическую стоимость, так и оценку (эвристическую) для цели (которая является допустимой и последовательной), то A * гарантированно предоставит оптимальное решение. Это может быть излишним, в зависимости от того, насколько хорошо я понимаю вашу проблему.
источник