Если приблизительное решение в порядке, вы можете попробовать простой алгоритм оптимизации. Вот пример, в Python
import random
def opt(*points):
best, dist = (0, 0), 99999999
for i in range(10000):
new = best[0] + random.gauss(0, .5), best[1] + random.gauss(0, .5)
dist_new = max(abs(new[0] - qx) + abs(new[1] - qy) for qx, qy in points)
if dist_new < dist:
best, dist = new, dist_new
print new, dist_new
return best, dist
Пояснение: Мы начинаем с точки (0, 0), или любой другой случайной точки, и изменить его в несколько тысяч раз, каждый раз сохраняя лучшее из нового и ранее лучший пункт. Постепенно это будет приближать оптимальный.
Примечание, что просто выбирая среднее или медиану трех точек, или решения по х и у независимо друг от друга делает не работу при минимизации максимальное расстояние Манхэттен. Противопоставление: рассмотрите точки (0,0), (0,20) и (10,10) или (0,0), (0,1) и (0,100). Если мы выберем среднее из наиболее разделенных точек, это даст (10,5) для первого примера, и если мы возьмем медиану, это будет (0,1) для второго примера, у которого оба имеют более высокий максимум Манхэттен расстояние, чем оптимальный.
Update: Похоже, решение для х и у независимо друг от друга и, взяв среднее из самых отдаленных точек делает на самом деле работы, при условии, что один делает некоторые пред- и постобработки, как отметил thiton.
Не будет потеряна часть точек, так как вращение на 45 градусов дает довольно много нецелочисленных чисел? – nhahtdh
Итак, просто (1) поверните на 45 ° и (2), затем возьмите среднее из самых отдаленных точек отдельно для x и y и (3) поверните назад? Все еще не могу поверить, что это так просто, но не может найти недостатка либо ... +1 –
@nhahtdh: Не делайте этого в целочисленной арифметике. Если требуется целочисленный результат, округлите результат. – thiton