WedX - журнал о программировании и компьютерных науках

найти (почти) минимальное покрывающее множество дисков на двумерной плоскости

Хорошо, скажем, у меня есть куча дисков, лежащих на плоскости в фиксированных известных местах. Каждый диск имеет радиус 1 единицу. Самолет полностью покрыт набором дисков, на самом деле он значительно перекрыт набором дисков, на порядок или два в некоторых областях. Я хотел бы найти подмножество дисков, которые по-прежнему полностью покрывают плоскость. Оптимальный — это хорошо, но не обязательно.

Вот иллюстрация до:

toomanydiscs

А вот и после иллюстрации:

справедливо

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

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

О, и приложение, если вы еще не догадались, находит подвыборку центроидов почтовых индексов для покрытия карты при выполнении запросов, поэтому n составляет около 50 000.


  • Возможно, это лучше подходит для cstheory.stackexchange.com? 01.11.2010
  • Вы можете найти дополнительную помощь по такого рода вещам на mathoverflow.com, учитывая характер вопроса. 01.11.2010
  • Может быть. Здесь также много других вопросов по вычислительной геометрии. Но если я не получу ответ, я опубликую его. Спасибо! 01.11.2010

Ответы:


1

План игры

Следующее в основном просто более точное изложение вашей проблемы, но это может помочь:

  1. Перечислите каждую связанную область на плоскости, которая получается, когда нарисованы границы всех дисков. По предположению, каждая из этих областей покрыта 1 или более дисками.
  2. Каждый регион — это «вещь, которую нужно покрыть», и каждый диск — это «вещь, которую нужно покрыть». Найдите минимальное покрытие набора для этого набора регионов. К сожалению, это NP-сложно.

Это может не использовать всю структуру, доступную в задаче, но определенно даст вам оптимальный ответ.

Перечисление регионов

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

Забудьте о фактическом расположении каждого региона и определяйте регион только с точки зрения того, какие диски находятся внутри, а какие снаружи. т.е. область определяется вектором длины n из значений 0/1, каждое из которых указывает, должна ли область внутри или снаружи этого диска быть включена в пересечение — рассматриваемая область формируется путем пересечения всех этих n областей. Таким образом, в принципе у вас может быть до 2 ^ n областей, но на практике некоторые (большинство) векторов создают пустые области, потому что они влекут за собой пересечение двух дисков, которые не имеют пересечения - к счастью, это легко проверить. Должно быть просто рекурсивно генерировать все непустые регионы, за исключением того, что...

Плохие новости

К сожалению, теперь я понимаю, что необходимо выполнить полное тестирование пересечения, потому что не всегда можно сказать, когда область будет пустой. Критический контрпример состоит в том, что для двух дисков A и B, которые имеют небольшой участок перекрытия, и еще одного диска C, который перекрывает каждый из дисков A и B, в зависимости от положения всех трех дисков пересечение всех трех может быть или не быть. быть непустым. (Чтобы увидеть это, нарисуйте 3 диска разных цветов с непрозрачностью 50% в программе для рисования и перемещайте их.)

Работающий хак

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

Чтобы убедиться, что пробелов нет, выполните повторный запуск несколько раз, каждый раз случайным образом меняя координаты точек выборки. Увеличивайте плотность точек выборки до тех пор, пока конечный результат не изменится.

01.11.2010
  • Вау, отличный ответ. Я потрачу некоторое время на размышления/работу над этим и предложу вам решение, если оно в конечном итоге сработает хорошо. 01.11.2010
  • Я закончил тем, что сделал что-то похожее на это. Я использовал более 40 000 дисковых центров в качестве точек для покрытия, сгенерировал наборы покрытия (медленно... O (n ^ 2)), затем использовал жадное приближение к минимальному набору покрытия, чтобы выбрать диски, которые покрывают множество точек, пока не останется ни одного. больше дисков с непокрытыми точками (быстрее, O (n * m) с m, уменьшающимся с итерациями). Количество дисков увеличилось с 40 000 до чуть более 200! Визуально не совсем оптимально, но точно достаточно близко! 17.11.2010
  • @Harlan: А, хорошо. Сейчас это спорно, но вы можете уменьшить этот O (n ^ 2) поиск покрывающих дисков, отсортировав центры дисков и точки (в этом случае они одинаковы) по самой длинной координате (скажем, y): тогда, когда вы ищите круги, охватывающие точку i в (Xi, Yi), вам нужно только проверить те круги, координата центра y которых равна ›= Yi - r. Это означает, что начальная точка в списке кругов, с которой вам нужно начать проверку, только увеличивается по мере того, как вы переходите от проверки одной точки к другой. 18.11.2010
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]