Chebyshev质心,在边缘情况下显然是失​​败的

时间:2012-10-05 02:11:57

标签: algorithm debugging math testcase

我试图在Chebyshev距离下找到一组点的质心。我写了一个程序,显然适用于我尝试的案例,但显然给出了一些我无法访问的边缘案例的错误答案。 [Meta评论:我会标记这个作业,但标签已经过时了]

要进行追逐,质心是与点集之间的最小平均距离的点。二维点p和q的切比雪夫距离是

cehbyshev distance

另外,我被限制在积分坐标的点上。

这是我的代码:

sum_x=0; sum_y=0
for p in points:
    sum_x = sum_x + p[0]
    sum_y = sum_y + p[1]
center_x = int(sum_x/N)
center_y = int(sum_y/N)

directions = [(-1,-1),
     (-1,0),
     (-1,1),
     (0,-1),
     (0,0),
     (0,1),
     (1,-1),
     (1,0),
     (1,1)]

distances = [0] * len(directions)
for p in points:
    for i in range(len(directions)):
        distances[i] = distances[i] + max(abs(center_x+directions[i][0]-p[0]),abs(center_y+directions[i][1]-p[1]))

best_direction = min(range(len(directions)), key = lambda i:distances[i])

print "centroid = (", center_x+directions[best_direction][0],",", center_y+directions[best_direction][1],")"

print "total distance = ", distances[best_direction]

这是我的理由:切比雪夫指标与2维中旋转的曼哈顿距离相同。我基本上找到曼哈顿质心,它与点的常规平均值相同,然后只搜索相邻的积分点以获得实际的切比雪夫质心。但我似乎无法在我的代码中找到错误。

1 个答案:

答案 0 :(得分:1)

您的理由在一次计数中是不正确的。曼哈顿质心点的平均值。例如,取点集(0,0); (1,0); (100,0)。平均值是(33.66,0),但我们可以通过选择(1,0)来做得更好。再做几个例子,你应该很容易看到真正的答案。

另外,您提到切比雪夫指标相当于旋转时的曼哈顿距离 ,但您不会在代码中的任何位置旋转点。这似乎至少是不一致的:你不应该在旋转的空间中计算曼哈顿的质心吗?