Вот небольшая 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}];
И это все. Функция Максимизировать возвращает точку и квадрат расстояния до ближайшей границы / точки.
НТН! Если вам нужна помощь в переводе на другой язык, оставьте комментарий.
Редактировать
Хотя я не 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()
НТН!