将点的最大曼哈顿距离最小化为一组点

时间:2013-03-11 18:48:22

标签: algorithm math geometry mathematical-optimization

2D中的3分:

P1(x1,y1), 
P2(x2,y2), 
P3(x3,y3) 

我需要找到一个点P(x,y),以便达到曼哈顿距离的最大值

max(dist(P,P1), 
    dist(P,P2), 
    dist(P,P3))

将是最小的。

关于算法的任何想法?

我真的更喜欢精确的算法。

2 个答案:

答案 0 :(得分:15)

这个问题有一个确切的非迭代算法;正如Knoothe所指出的那样,the Manhattan distance is rotationally equivalent to the Chebyshev distance和P对Chebyshev距离的计算是极端坐标的平均值。

从曼哈顿距离x内的P可到达的点形成围绕P的钻石。因此,我们需要找到包围所有点的最小钻石,其中心将是P.

如果我们将坐标系旋转45度,则钻石是正方形。因此,问题可以减少到找到点的最小封闭平方。

可以找到最小的包围正方形的中心作为最小包围矩形的中心(通常以坐标的最大值和最小值计算)。有无数个最小的包围正方形,因为您可以沿着最小矩形的较短边移动中心,并且仍然具有最小的封闭正方形。出于我们的目的,我们可以简单地使用中心与包围矩形重合的那个。

所以,以算法形式:

  1. 通过指定x'= x / sqrt(2) - y / sqrt(2),y'= x / sqrt(2)+ y / sqrt(2)
  2. 来旋转和缩放坐标系
  3. 计算x'_c =(max(x'_i)+ min(x'_i))/ 2,y'_c =(max(y'_i)+ min(y'_i))/ 2
  4. 向后旋转x_c = x'_c / sqrt(2)+ y'_c / sqrt(2),y_c = - x'_c / sqrt(2)+ y'_c / sqrt(2)
  5. 然后x_c和y_c给出P的坐标

答案 1 :(得分:4)

如果近似解决方案没问题,您可以尝试一种简单的优化算法。这是一个例子,在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)或任何其他随机点开始,并将其修改几千次,每次都保持新的和先前最佳点的更好。渐渐地,这将接近最佳值。

注意简单地选择三个点的均值或中位数,或者单独求解x和y,在最小化最大值时 不起作用 >曼哈顿距离。反例:考虑点(0,0),(0,20)和(10,10),或(0,0),(0,1)和(0,100)。如果我们选择分离得最多的点的平均值,那么第一个例子就会产生(10,5),如果我们取中值,那么对于第二个例子,这将是(0,1),它们都具有更高的最大曼哈顿距离比最佳值。

更新:看起来像是单独解决x和y并且取最远点 的平均值实际上是可行的,只要做一些预处理和后处理,正如thiton所指出的那样。

相关问题