Как найти точку, наиболее удаленную от заданного набора и его ограничивающей рамки

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

Есть ли общее решение для такого рода вещей? Спасибо!


person Josh Santangelo    schedule 24.11.2010    source источник
comment
Можно подробнее о требованиях? Только как далеко? Конечно, вы не хотите просто добавить 1e6,1e6(,1e6) к случайной точке? Кроме того, зачем проверять точки и ребра? Поскольку точки находятся внутри прямоугольника, почему бы просто не использовать края?   -  person EboMike    schedule 24.11.2010
comment
эта проблема неоднозначна. нет никакого смысла в том, насколько далеко от краев коробки измеряется максимальное расстояние от любых ранее добавленных точек. есть ли функция, которую вы можете записать, чтобы свести к минимуму?   -  person lijie    schedule 24.11.2010
comment
2D. Как далеко должно быть как можно дальше от всего остального. Возможно, это противоречивые цели.   -  person Josh Santangelo    schedule 24.11.2010
comment
На самом деле они противоречат друг другу. Я предполагаю, что вы хотите, чтобы помещенная точка также находилась внутри поля (в противном случае подойдет точка в бесконечности). Предположим, что все точки находятся очень близко к центру прямоугольника (это самая дальняя точка от краев прямоугольника). Затем, в зависимости от того, насколько важно быть вдали от краев ящика и насколько важно быть далеко от других точек, оптимальная точка для добавления может быть размещена на разных расстояниях от центра ящика.   -  person lijie    schedule 24.11.2010
comment
@lijie Один из способов (я так и сделал, см. Мои графики ниже) - присвоить одинаковый вес обоим ограничениям (находясь вдали от границ И от точек)   -  person Dr. belisarius    schedule 24.11.2010
comment
@belisarius: на самом деле не меняет того факта, что проблема все еще довольно неясна. ваша интерпретация максимизирует минимальное расстояние до любой точки/ребра. Моя первоначальная интерпретация заключалась в максимизации суммы расстояний до каждой точки и края (но тогда это не имеет смысла для краев). Все же лучше иметь некоторую целевую функцию, записанную в математической форме для ясности. :)   -  person lijie    schedule 25.11.2010
comment
@lijie Я ни на что не претендую. Это просто возможная интерпретация наибольшего удаления от других точек и краев. Как я уже сказал выше Один из способов. Это хорошо с недоопределенными проблемами: они позволяют взаимодействовать между людьми :)   -  person Dr. belisarius    schedule 25.11.2010
comment
@belisarius: да, я согласен :) Я не утверждал, что ты что-то утверждал; вот почему я использовал интерпретацию. Постановка задачи достаточно открытая.   -  person lijie    schedule 25.11.2010


Ответы (2)


Вот небольшая программа Mathematica.

Хотя это всего две строки кода (!), вам, вероятно, понадобится больше на обычном языке, а также математическая библиотека, способная найти максимум функций.

Я предполагаю, что вы не владеете Mathematica, поэтому я объясню и прокомментирую построчно.

Сначала мы создаем таблицу с 10 случайными точками в {0,1}x{0,1} и называем ее p.

p = Table[{RandomReal[], RandomReal[]}, {10}];

Теперь мы создаем функцию для максимизации:

f[x_, y_] = Min[ x^2, 
                 y^2, 
                 (1 - x)^2, 
                 (1 -  y)^2, 
                 ((x - #[[1]])^2 + (y - #[[2]])^2) & /@ p];  

Ха! Синтаксис стал хитрым! Давайте объясним:

Функция дает вам для любой точки в {0,1}x{0,1} минимальное расстояние от этой точки до нашего набора p И ребер. Первые четыре члена — это расстояния до краев, а последний (трудно читать, я знаю) — это множество, содержащее расстояния до всех точек.

Далее мы будем максимизировать эту функцию, чтобы получить ТОЧКУ, в которой минимальное расстояние до наших целей максимально.

Но сначала давайте посмотрим на f[]. Если вы посмотрите на это критически, вы увидите, что на самом деле это не расстояние, а расстояние в квадрате. Я определил это так, потому что таким образом функцию намного проще максимизировать, а результаты будут такими же.

Также обратите внимание, что f[] не является «красивой» функцией. Если мы построим это в {0,1}, мы получим что-то вроде:

альтернативный текст

Вот почему вам понадобится хороший математический пакет, чтобы найти максимум.

Mathematica — такой хороший пакет, что мы можем просто максимизировать его:

max = Maximize[{f[x, y], {0 <= x <= 1, 0 <= y <= 1}}, {x, y}];

И это все. Функция Maximize возвращает точку и квадрат расстояния до ее ближайшей границы/точки.

альтернативный текст

ХТХ! Если вам нужна помощь в переводе на другой язык, оставьте комментарий.

Изменить

Хотя я не человек С#, после поиска ссылок в SO и поиска в Google пришел к следующему:

Одним из пакетов-кандидатов является DotNumerics.

Вы должны следовать следующему примеру, представленному в пакете:

 file: \DotNumerics Samples\Samples\Optimization.cs
 Example header:

  [Category("Constrained Minimization")]
  [Title("Simplex method")]
  [Description("The Nelder-Mead Simplex method. ")]
  public void OptimizationSimplexConstrained()

ХТХ!

person Dr. belisarius    schedule 24.11.2010
comment
Бит «наиболее удаленный от границ» означает, что если алгоритм запускается без точек в поле, он должен обнаружить, что точка в центре поля является идеальной точкой, потому что это самая дальняя возможная точка от границ. - person Josh Santangelo; 24.11.2010
comment
@Josh У вас есть тестовый пример, чтобы попробовать алгоритм? - person Dr. belisarius; 24.11.2010
comment
Привет, Велисарий! Большое спасибо за ваши полезные ответы. Приведенные выше изображения выглядят так, как будто они решают мою проблему, и я, безусловно, хотел бы изучить логику, стоящую за ними. - person Josh Santangelo; 24.11.2010
comment
Спасибо, это выглядит довольно удивительно и, кажется, как раз то, что нужно. Как вы уже догадались, я не особо разбираюсь в Mathematica и буду пытаться реализовать на C#/.NET. Если у вас есть какие-либо указатели, это было бы очень полезно. - person Josh Santangelo; 24.11.2010
comment
@Джош, просто напиши комментарий, если тебе нужна помощь - person Dr. belisarius; 24.11.2010
comment
@Dr.belisarius: Было бы здорово иметь простую python реализацию этого - person Hassan Baig; 18.05.2019

Задача, которую вы решаете, называется задача о самой большой пустой сфере.

Его можно легко решить за время O (n ^ 4) в плоскости. Просто рассмотрите все O(n^3) троек точек и вычислите их центр описанной окружности. Одна из этих точек является вашей желаемой точкой. (Ну, в вашем случае вы также должны рассматривать «сторону» как одну из ваших трех точек, поэтому вы не только найдете центры описанной окружности, но и немного более общие точки, например, равноудаленные от двух точек и стороны.)

Как видно из приведенной выше ссылки на Википедию, задача также может быть решена за время O(n log n) путем вычисления диаграммы Вороного. Более конкретно, тогда ваша желаемая точка является центром описанной окружности одного из треугольников в триангуляции Делоне ваших точек (которая является двойственной диаграмме Вороного), которых всего O (n). (Опять же, чтобы точно адаптироваться к вашей проблеме, вам придется учитывать влияние сторон коробки.)

person A. Rex    schedule 24.11.2010
comment
@А. Рекс. Я опубликовал и удалил ответ, основанный на диаграммах Вороного, потому что не смог обобщить ребра. Не могли бы вы попытаться описать, как обобщить решение алгоритма Вороного D для ребер? - person Dr. belisarius; 25.11.2010
comment
@belisarius: Конечно. Максимальный радиус исходит либо из радиуса описанной окружности треугольника Делоне, либо из двух точек на выпуклой оболочке и одной стороне, либо из одной точки на оболочке и двух сторонах, либо (если точек нет) из половины длины стороны квадрата. Случаи, отличные от первого, легко реализуются путем решения некоторых квадратичных уравнений. Мне было бы интересно увидеть ваше решение Вороного. Я хотел опубликовать полный ответ, но мне не хотелось кодировать Вороного или искать библиотеки С#. - person A. Rex; 25.11.2010
comment
@А. Рекс Спасибо за ответ. Я действительно не очень далеко продвинулся с предложением диаграммы Вороного, потому что нашел такие конфигурации, как {{1, 15}, {15, 1}, {15, 15}, {1, 1}, {8, 8} } на {0,16}x{0,16}, чьи решения нелегко связать (или я так думаю) с разложением Вороного или триангуляцией Делоне. Но, возможно, вы правы и заслуживаете более глубокого изучения. Кстати, все, что я написал об этом, находится в истории редактирования моего ответа (хотя это не более чем предложение) - person Dr. belisarius; 25.11.2010
comment
Таким образом, чтобы решить задачу в рамке (трехмерной вместо плоскости), вы бы рассмотрели все комбинации четырех точек и вычислили описанную сферу каждого набора? И тогда, я думаю, вам нужно убедиться, что в этой сфере нет других точек. - person Nick; 05.06.2013