Я собираюсь рекомендовать против этого, теперь
Смотрите обсуждение ниже.
Оригинальные мысли
Я бы рассмотрел итеративный двухтактный метод.
- Угадай, куда поместить центр (самое простое будет среднее положение всех центров)
- Вычислить векторы до самой дальней точки на каждом круге. Они всегда в направлении к центру этого круга и имеют длину
distance_to_center_of_circle[i]+radius_of_circle[i]
и образуют векторную сумму по мере движения. Также обратите внимание, что необходимый радиус в текущем местоположении является максимальным из этих длин.
- Предложите шаг, скажем, 1/5 или 1/10 от векторной суммы из 2, и повторите вычисления из 2 для новой точки
- Если новая точка нуждается в меньшем круге, чем старая, сделайте новую точку текущей точкой, в противном случае разделите разницу, уменьшите размер предлагаемого шага (скажем, наполовину).
- Перейти к 3
Вы закончили, когда она перестает [+] сходиться.
Ники ткнула в него, пока ...
В соответствии с просьбой разъяснить второй шаг. Назовите проверяемую позицию \vec{P}
(векторная величина). [++] Назовите центры каждого круга \vec{p}_i
(также векторные величины), а радиус каждого круга равен r_i
. Сформируйте сумму \sum_i=1^n \hat{p_i - P}*|(p_i-P)|+r_i)
. [+++] Каждый элемент суммы указывает в направлении от текущей точки оценки к центру рассматриваемого круга, но длиннее на r_i
. Сама сумма это векторная величина.
Радиус R
необходимо заключить в круг от P
до max(|p_i-P|_r_i)
.
Патологический случай
Я не думаю, что конкретный случай, который поднял nikie, является проблемой, но он поставил меня в случай, когда этот алгоритм не работает. Ошибка заключается в том, что не удается улучшить решение, а не в том, что оно расходится, но все же ...
Рассмотрим четыре окружности радиуса 1, расположенные в
(-4, 1)
(-5, 0)
(-4, 1)
( 5, 0)
и начальная позиция (-1, 0)
. Симметричный дизайн, так что все расстояния лежат вдоль оси х.
Правильное решение - (0, 0)
с радиусом 6, но вектор, вычисленный на шаге 2, будет примерно :: вычислен неистово :: (-.63, 0)
, указывая в неправильном направлении, что никогда не приведет к улучшению в направлении начала координат. *
Теперь вышеприведенный алгоритм фактически выберет (-2, 0)
для начальной точки, что дает начальную векторную сумму :: яростно вычисляет :: около +1.1. Таким образом, неправильный выбор размера шага в (3) приведет к неоптимальному решению. :: вздыхать ::
Возможное решение:
- В (3) выбрасывает случайную дробь между (скажем, +1/5 и -1/5), возможно, взвешенную в сторону положительного размера.
- В (4), если шаг отклонен, просто вернитесь к шагу три без изменения пределов размера шага.
Однако на данный момент это не намного лучше, чем чисто случайное блуждание, и у вас нет простого условия, чтобы узнать, когда оно сошлось. Мех.
[+] Или замедляется, к вашему удовольствию, конечно.
[++] Использование латексной нотации.
[+++] Здесь \hat{}
означает нормализованный вектор, указывающий в том же направлении, что и аргумент.