2013-11-28 3 views
16

У меня есть беспроводная сеть с узлами, каждая из которых способна сообщать о своем «расстоянии» соседей, измеряя их (упрощенную) силу сигнала. Узлы географически расположены в трехмерном пространстве, но из-за радиопомех расстояние между узлами не должно быть тригонометрическим (тригономически?) Согласованным. То есть, если заданы узлы 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 - со случайной матрицей инициализации:

Image 1 - with random initialization matrix

Изображение 2 - после того, как работает с такими же входными данными, повернуто по сравнению с 1:

Image 2 - after running with same input data, rotated when compared to 1

Изображения 3 - то же самое как и предыдущие 2, но узлы 1-3 находятся в другом направлении:

Image 3 - same as previous 2, but nodes 1-3 are in another direction

Изображение 4 - с начальной компоновки узлов на одной линии, их положение на оси у не изменяется:

Image 4 - with the initial layout of the nodes on one line, their position on the y axis isn't changed

+0

После дальнейшего развития моих наборов тестовых данных, я узнал, что у меня есть еще одно требование. У меня нет расстояний между всеми узлами - узлы на одной стороне сети могут быть недоступны от узлов с другой стороны. Мне нужно, чтобы это можно было указать, не указывая расстояния между теми, которые находятся вне друг друга, потому что тогда расстояние между ними будет одинаковым в графе результатов. Я предпочитаю, чтобы узлы, находящиеся вне досягаемости, были далеки друг от друга, но, возможно, визуальное изображение было бы ясным, если бы я просто не рисовал связи между ними. – Roel

+0

вы можете добавить поддельное расстояние для разделения несвязанных групп (вы можете это знать, но то, что вы хотите, - это «односвязные компоненты» на графике), но, к сожалению, каждая группа может быть индивидуально отражена и повернута. я удалил свой ответ, поскольку он просто дублировал идею, которую вы уже имели. –

+0

Спасибо, я не знал этого термина, я буду исследовать в этом направлении. Re: другой ответ, ОК ясно - я просто проверял, не хватает ли я детали. Информация, которую я могу найти на эту тему, намного более плотная, чем большая часть моей обычной работы, мне нужно дважды и тройную проверку часто :) Еще раз спасибо за участие в этом вопросе ниши - я даже не мог найти теги, где это действительно принадлежит. – Roel

ответ

3

Большинство алгоритмов масштабирования эффективно установить «пружины» между узлами, где длина покоя пружины является желаемой длиной края. Затем они пытаются минимизировать энергию системы пружин. Когда вы инициализируете все узлы друг на друга, количество энергии, выделяемое при перемещении любого узла, одинаково во всех направлениях. Таким образом, градиент энергии относительно позиции каждого узла равен нулю, поэтому алгоритм покидает узел, где он находится. Аналогично, если вы начинаете их все по прямой, градиент всегда вдоль этой линии, поэтому узлы только перемещаются вдоль него.

(Это некорректный объяснение во многих отношениях, но он работает на интуиции)

Try инициализацией узлы лежат на единичной окружности, на сетке или любым другим способом, например, что не все они коллинеарный. Предполагая, что схема обновления алгоритма библиотеки детерминирована, это должно дать вам воспроизводимые визуализации и избежать условий вырождения.

Если библиотека недетерминирована, либо найдите другую библиотеку, которая является детерминированной, либо откройте исходный код и замените генератор случайности на PRNG, инициализированный фиксированным семенем. Я бы порекомендовал бывшую опцию, хотя, как и другие, более продвинутые библиотеки должны позволять вам устанавливать края, которые вы хотите «игнорировать» тоже.

+1

+1 Я не знал этого, это отличное объяснение. – Mehrdad

+0

Спасибо за ваш ответ. Поскольку я задал этот вопрос, мои исследования привели меня к тому, что MDS не подходит для моей проблемы. (Я собирался обновить вопрос, как только подтвержу это, имея рабочую альтернативу ...) Здесь может быть проблема терминологии, но то, что вы описываете, насколько я могу судить, не является алгоритмом MDS, а алгоритм компоновки графа. Это то, что я собираюсь использовать, в основном на основе этой статьи: https://www.cs.ubc.ca/~tmm/courses/533/morereadings/dejordy.pdf. В Boost.Graph реализована реализация нескольких макетов графа на основе весны. – Roel

+0

(Глупое ограничение длины комментариев ...). Одно фундаментальное свойство (то, что описано в литературе, которую я читал как), алгоритмы MDS - это то, что они требуют полной матрицы расстояния, т. Е. Должно быть притяжение или отталкивание между каждым из узлы. В то время как алгоритмы графа, такие как пружинные, не нуждаются в этом. Поэтому спасибо за ваш ответ - это то, что я собираюсь попробовать. Как я уже упоминал, я обновлю этот вопрос, какими будут мои окончательные результаты, как только я подтвержу это, имея фактическую реализацию. – Roel

0

Я прочитал коды библиотеки MDS «SimpleMatrix» и обнаружил, что для определения порядка точек используется случайная матрица перестановок.После исправления порядка перестановки (просто используйте srand (12345) вместо srand (time (0))), результат же данных не изменится.

0

Очевидно, что в этом нет точного решения; всего 4 узла ABCD и расстояния AB=BC=AC=AD=BD=1CD=10 вы не можете четко нарисовать подходящую 2D-диаграмму (и даже не трехмерную).

Что эти алгоритмы делают, просто размещая пружины между узлами, а затем имитируя отталкивание/притяжение (в зависимости от того, является ли пружина короче или длиннее предписанного расстояния), вероятно, также добавляет пространственное трение, чтобы избежать резонанса и взрыва.

Чтобы сохранить «стабильную» диаграмму, просто создайте решение, а затем обновите расстояния, повторно используя текущую позицию из предыдущего решения в качестве отправной точки. Выбор двух фиксированных узлов и их выравнивание кажется хорошей идеей для предотвращения медленного дрейфа, но я бы сказал, что весенние силы никогда не заканчивают тем, что создают вращательный импульс, и поэтому я ожидаю, что в любом случае должно быть достаточно масштабирования и центрирования решения.

Смежные вопросы