Как найти точку, наиболее удаленную от заданного множества и его ограничительной рамки - PullRequest
7 голосов
/ 24 ноября 2010

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

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

Ответы [ 2 ]

11 голосов
/ 24 ноября 2010

Вот небольшая 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}, мы получим что-то вроде:

alt text

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

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

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

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

alt text

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

Редактировать

Хотя я не C # человек, после поиска ссылок в 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()

НТН!

4 голосов
/ 25 ноября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...