Добрый день, коллеги.
Спасибо за интерес к заданию.
Нужно написать алгоритм объединения нескольких кластеров ультразвуковых маяков в одну группу:
- например, есть 5 ультразвуковых маяков, каждый из которых слышит другого – Кластер 1;
- маяки могут определять взаимные расстояния и формировать карту своего расположения друг относительно друга - трилатерация;
- и есть другие кластеры маяков;
- но кластера пересекаются друг с другом лишь в двух-трех маяках – они общие для этих кластеров. Иногда пересекаются в большем количестве маяков, но не менее трех. Если возможен алгоритм с двумя общими маяками – еще лучше.
Нужно написать алгоритм устойчивого объединения кластеров маяков в одну карту, учитывая физику работы ультразвуковых маяков и их ограничения по точности определения расстояния и так далее.
Высылаю скан наброска:
link text
Большинство ограничений и схема расположения маяков описаны на наброске. Если остались вопросы, пожалуйста, задавайте.
Кластера могут пытаться зеркалиться, но эта проблема может решаться двумя способами, как минимум:
1. Кластера могут объединяться в бублик, как показано на наброске. А в бублик они могут объединиться только одним путем.
2. У маяков есть компас. Он не сильно точный и подвержен помехам, иногда, когда рядом металлы, но обнаружить, слева ли восток или справа, может. А это позволит устранить зеркальность.
Все маяки общаются между собой по радио через роутер. То есть все данные (взаимные расстояния, ориентация по компасу) из одного маяка доступны центральному роутеру, который и собирает карту из кусков в единое целое. Вот этот алгоритм в роутере для устойчивой сборки карты из кластеров маяков и нужно написать.
Сейчас уже есть работающие алгоритмы, но они неустойчивы. Иногда, соберется карта, а иногда и нет.
Из известных проблем:
1. Маяки на одной прямой - проблема зеркала.
2. Чем больше маяков, тем точнее должна собираться карта, потому что больше данных и они друг друга должны дополнять и уточнять. А на практике если какой-то из маяков получает отраженный сигнал - не прямой, то он выдает данные, которые не укладываются в общую картинку. Например, маяк за стенкой от другого маяка и не должен видеть его. Но по отраженному сигналу он видит (слышит). И расстояние получается 10 метров. Но прямое расстояние между маяками через стену - 1 метр. Система получает эти данные и сходит с ума - не укладывается в алгоритм.
Но данные с маяков избыточные. И без этого маяка можно было бы построить карту. Так вот, алгоритм должен обнаруживать, что данные с какого-то маяка неточные или противоречащие данным с других маяков, и не принимать их во внимание.
Если нужно накладывать какие-то специальные ограничения, чтобы алгоритм работал, сообщайте. Обсуждаемо. Часть ограничений может быть приемлема, а часть - нет. Зависит от сути ограничений.
Готов оплатить работу, если предложенный алгоритм заработает на реальных маяках.
Спасибо.
BR,
Maxim
Задача неясно поставлена. Совершенно непонятно, по каким принципам можно объединять маяки в одну группу. Картинка тоже ничего не проясняет.
А как я могу уточнить задачу еще более?...
Маяки должны сформировать карту (группу). Карта из 4, 5, 6 маяков, видящих друг друга одновременно, уже и сейчас формируется на основе взаимных расстояний. Но другая группа (кластер) не объединяется с этой группой в единую группу устойчиво. Используемый алгоритм путается.
Вот я и прошу придумать новый алгоритм объединения.
В формулировке надо отделить нужную информацию от ненужной. Для уточнения надо ясно описать, какой существенной информацией о маяках располагает алгоритм, и по какому принципу он может объединять их в отдельные группы.
Маяки знают:
- взаимные расстояния друг до друга, когда они в одном кластере/группе. Но они не знают взаимные расстояния, когда они далеки или не видны друг другу из-за стены;
- маяки могут сообщить взаимные расстояния роутеру по радио;
- роутер, используя алгоритм, объединяет взаимные расстояния в одну карту/группу - строит из кластеров маяков одну общую группу.
Финально, роутер должен сформировать группу/карту маяков.
Стало чуточку яснее, и имеет смысл прояснить условие до конца. Я так понял, что каждый маяк видит какие-то другие маяки и сообщает роутеру их номера. При этом, судя по всему, если X видит Y, то и Y видит X. Значит, у роутера имеется симметричная матрица $%n\times n$% из нулей и единиц. Теперь осталось понять, по какому принципу роутер имеет право объединять маяки в какие-то группы. Фраза "объединяет взаимные расстояния ...", как мне кажется, не отражает принципа. Тем более, что объединяются вовсе не расстояния.
Наверное, мне имеет смысл вообще убрать слово группа. Речь идет об объединению в одну карту.
Да, каждый маяк видит маяки из своего кластера. Но многие другие маяки он не видит. Но они могут быть видимы маяками, которые видимы этому маяку. Таким образом, можно сформировать большую таблицу расстояний, а потом на ее основе построить карту и расположить все эти маяки. Это делает роутер. У него есть данные со всех маяков. Вот алгоритм для роутера и нужен. Как использую неполные сведения от каждого из маяков построить полную таблицу/карту/группу.
Да, каждый маяк уникален и имеет свой номер.
Маяк сообщает роутеру не только номера, но, в первую очередь, расстояния до маяков. И роутера скапливается таблица взаимных расстояний.
Да, таблица двойная. Потому что первый маяк видит второй, но и второй видит первый. В идеале, они должны совпадать или быть близки. Но, на практике, расстояния всегда немного различаются. Алгоритм должен это учитывать... усреднять, допускать погрешность и так далее, оставаясь при этом стабильным.
А единственный способ объединить в группу/карту - это, когда все условия расстояний выполняются верно. Там только один вариант на плоскости возможен.
Сложность возникает из-за:
1) зеркальных вариантов, когда недостаточно сведений;
2) излишних ошибочных измерений за счет отражения ультразвука от стен.
Картинки маяков на карте для простых конфигураций:
http://marvelmind.com/pics/screen_01.png
http://marvelmind.com/pics/screen_02.png
http://marvelmind.com/pics/screen_03.png
http://marvelmind.com/pics/screen_04.png