最小化一个点到一组点的最大曼哈顿距离

Minimize maximum manhattan distance of a point to a set of points

提问人:YAKOVM 提问时间:3/12/2013 最后编辑:moooeeeepYAKOVM 更新时间:3/12/2013 访问量:5983

问:

对于 2D 中的 3 个点:

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

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

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

将是最小的。

对算法有什么想法吗?

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

算法 几何 数学

评论

0赞 dark_prince 6/15/2021
这可能会有所帮助:cs.stackexchange.com/questions/104307/...

答:

4赞 tobias_k 3/12/2013 #1

如果近似解没问题,您可以尝试简单的优化算法。下面是一个示例,在 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 所指出的那样。

评论

0赞 Terry Li 3/12/2013
+1 表示想法。让我想起了本科数值分析课程。
17赞 thiton 3/12/2013 #2

对于这个问题,有一个精确的、非迭代的算法;正如 Knoothe 所指出的,曼哈顿距离在旋转上等于切比雪夫距离,而 P 对于切比雪夫距离作为极端坐标的平均值是可计算的。

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

如果我们将坐标系旋转 45 度,则菱形是一个正方形。因此,问题可以简化为找到点的最小封闭平方。

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

因此,以算法形式:

  1. 通过分配 x' = x/sqrt(2) - y/sqrt(2), y' = x/sqrt(2) + y/sqrt(2) 来旋转和缩放坐标系
  2. 计算 x'_c = (max(x'_i) + min(x'_i))/2, y'_c = (max(y'_i) + min(y'_i))/2
  3. 用 x_c = x'_c/sqrt(2) + y'_c/sqrt(2) 旋转,y_c = - x'_c/sqrt(2) + y'_c/sqrt(2)

然后x_c和y_c给出 P 的坐标。

评论

1赞 thiton 3/12/2013
@tobias_k:别忘了 (3) 将平均点旋转 -45。;-)感谢您的精彩总结,将对其进行编辑。
2赞 thiton 3/12/2013
@nhahtdh:你不需要明确地这样做。最小矩形的中心也是最小正方形的中心。在大多数情况下,有许多最小正方形,因为您可以沿着最小矩形的较短边缘移动中心。
3赞 Knoothe 3/12/2013
如果你有兴趣,你刚刚(重新)发现在二维中,L_{\infty} 和L_{1}范数通过 45 度旋转相关。我本来打算用这个轮换业务来补充一个答案,但你打败了我。+1.
1赞 tmyklebu 3/12/2013
我会避免使用 sqrt(2)。你可以只使用 x' = x+y;y' = x-y。
1赞 YAKOVM 3/12/2013
为什么使用 sqrt(2) 而不是 1/sqrt(2) ?(sqrt(2) 不是罪(45)