У меня есть беспроводная сеть с узлами, каждая из которых способна сообщать о своем «расстоянии» соседей, измеряя их (упрощенную) силу сигнала. Узлы географически расположены в трехмерном пространстве, но из-за радиопомех расстояние между узлами не должно быть тригонометрическим (тригономически?) Согласованным. То есть, если заданы узлы A, B и C, расстояние между A и B может быть 10, между A и C также 10, но между B и C 100.«Стабильный» алгоритм многомерного масштабирования
Что я хочу сделать, это визуализировать логическую схему сети в условия подключения узлов, т.е. включают логическое расстояние между узлами в визуальном.
До сих пор мое исследование показало, что многомерное масштабирование (MDS) предназначено именно для такого рода вещей. Учитывая, что мои данные могут быть непосредственно выражены как матрица расстояния 2d, это даже более простая форма более общего MDS.
Теперь, похоже, существует много алгоритмов MDS, см., Например, http://homepage.tudelft.nl/19j49/Matlab_Toolbox_for_Dimensionality_Reduction.html и http://tapkee.lisitsyn.me/. Мне нужно сделать это на C++, и я надеюсь, что смогу использовать готовый компонент, т. Е. Не придется повторно реализовывать алгоритм из бумаги. Итак, я подумал: https://sites.google.com/site/simpmatrix/ будет билетом. И это работает, но:
Схема не стабильна, то есть каждый раз, когда алгоритм повторно запускается, меняется положение узлов (см различия между изображением 1 и 2 ниже - это от того, чтобы выполняются дважды, без каких-либо дальнейших изменений). Это связано с матрицей инициализации (которая содержит начальное местоположение каждого узла, которое алгоритм затем итеративно исправляет), который передается этому алгоритму - я пропускаю пустой, а затем реализация получает случайную. В общем, макет подходит к макету, который я ожидал от данных ввода. Кроме того, между различными прогонами направление узлов (по часовой стрелке или против часовой стрелки) может меняться. См. Изображение 3 ниже.
«Решение», которое я считал очевидным, состояло в том, чтобы передать стабильную матрицу инициализации по умолчанию. Но когда я сначала кладу все узлы в одном и том же месте, они вообще не перемещаются; когда я помещаю их на одну ось (узел 0 на 0,0, узел 1 на 1,0, узел 2 - 2,0 и т. д.), они перемещаются только по этой оси. (см. изображение 4 ниже). Однако относительные расстояния между ними в порядке.
Так кажется, что этот алгоритм изменяет только расстояние между узлами, но не изменяет их местоположение.
Спасибо за чтение этого далеко - мои вопросы (я был бы счастлив, чтобы получить только один или несколько из них ответили, поскольку каждый из них мог бы дать мне ключ к пониманию того, в каком направлении продолжать):
- Где я могу найти дополнительную информацию о свойствах каждого из многих алгоритмов MDS?
- Существует ли алгоритм, который выводит полное местоположение каждого узла в сети, без необходимости передавать начальную позицию для каждого узла?
- Есть ли способ оценить местоположение каждой точки, чтобы алгоритм мог правильно масштабировать расстояние между ними? У меня нет географического местоположения каждого из этих узлов, это и есть цель этого упражнения.
- Существуют ли какие-либо алгоритмы для сохранения «угла», при котором сеть получается постоянной между циклами?
Если все остальное не удается, мой следующий вариант будет состоять в использовании алгоритма, упомянутого выше, увеличьте количество итераций, чтобы сохранить изменчивость между прогонами на несколько пикселей (мне пришлось бы экспериментировать с сколько будет выполняться итераций), затем «поверните» каждый узел вокруг узла 0, чтобы, например, выровнять узлы 0 и 1 по горизонтальной линии слева направо; таким образом, я бы «исправил» местоположение точек после того, как их относительные расстояния были определены алгоритмом MDS. Я должен был бы корректировать порядок подключенных узлов (по часовой стрелке или против часовой стрелки) вокруг каждого узла. Это может стать волосатым довольно быстро.
Очевидно, что я предпочел бы стабильное алгоритмическое решение - увеличение итераций для сглаживания случайности не очень надежное.
Спасибо.
EDIT: Мне было передано сообщение cs.stackexchange.com, и некоторые замечания были сделаны там; для алгоритмических предложений, см. https://cs.stackexchange.com/questions/18439/stable-multi-dimensional-scaling-algorithm.
Изображение 1 - со случайной матрицей инициализации:
Изображение 2 - после того, как работает с такими же входными данными, повернуто по сравнению с 1:
Изображения 3 - то же самое как и предыдущие 2, но узлы 1-3 находятся в другом направлении:
Изображение 4 - с начальной компоновки узлов на одной линии, их положение на оси у не изменяется:
После дальнейшего развития моих наборов тестовых данных, я узнал, что у меня есть еще одно требование. У меня нет расстояний между всеми узлами - узлы на одной стороне сети могут быть недоступны от узлов с другой стороны. Мне нужно, чтобы это можно было указать, не указывая расстояния между теми, которые находятся вне друг друга, потому что тогда расстояние между ними будет одинаковым в графе результатов. Я предпочитаю, чтобы узлы, находящиеся вне досягаемости, были далеки друг от друга, но, возможно, визуальное изображение было бы ясным, если бы я просто не рисовал связи между ними. – Roel
вы можете добавить поддельное расстояние для разделения несвязанных групп (вы можете это знать, но то, что вы хотите, - это «односвязные компоненты» на графике), но, к сожалению, каждая группа может быть индивидуально отражена и повернута. я удалил свой ответ, поскольку он просто дублировал идею, которую вы уже имели. –
Спасибо, я не знал этого термина, я буду исследовать в этом направлении. Re: другой ответ, ОК ясно - я просто проверял, не хватает ли я детали. Информация, которую я могу найти на эту тему, намного более плотная, чем большая часть моей обычной работы, мне нужно дважды и тройную проверку часто :) Еще раз спасибо за участие в этом вопросе ниши - я даже не мог найти теги, где это действительно принадлежит. – Roel