用于找到移动成本最小化的点的算法

时间:2012-06-14 14:48:26

标签: java algorithm

在2d网格中有n个点。要求是将所有这些点(n-1个点)中的一个项目移动到单个点(在n个点的集合中),以便将所有项目移动到该点的成本将是最小的。如果有多个这样的点,那么我们可以随机选择任意点。移动成本计算如下。

费用计算公式

  

如果(x,y)中有一个点,那么将对象从(x,y)移动到所有8个相邻点{(x+1,y),(x+1,y+1),(x,y+1),(x-1,y+1),(x,y-1),(x-1,y-1),(x,y-1),(x+1,y-1)}所需的成本是1个单位

有人可以为此建议任何O(N)算法吗?我已经尝试过O(N2)算法(比如拿每对并计算成本)。

3 个答案:

答案 0 :(得分:2)

听起来您想要将所有点移动到“中心”,其中中心被定义为具有最小总成本值的点。对于三点,我认为答案是靠近三角形的质心。质心是我们通过简单地平均所有3个x值和所有三个y值得到的点。

扩展超过三点,我认为平均得分是正确答案或接近正确答案。如果你在点之间使用欧几里德距离公式,那么我相当肯定你寻求的点只是平均值。但是你正在使用一些改进的出租车驾驶室几何形状,这使得45度角度比它应该的“更少”。根据您的定义,从(0,0)到(5,5)的成本是5,而不是使用标准几何的5 sqrt(5)(大约多40%)。但对于水平或垂直移动,指标是相同的。那么从我的快速猜测中找到正确答案的距离是多远?如果你可以在半径上获得一些合法性,那么我建议使用这个算法:

  • 计算机平均点数(在O(n)时间内运行)
    C = new Point(average(xVals), average(yVals))
  • 计算机半径 - 从快速的欧几里德答案中得出真正答案的距离。
  • 考虑该半径中的所有点,看看它们的总成本是否低于C.

这最后一项在O(r ^ 2)中运行,只要你能证明r远小于n,你就有了一个很好的解决方案。

答案 1 :(得分:0)

我认为您可以在线性时间内计算n个点的质心,然后在线性时间内计算到质量中心的最近点。

获得群众中心:

center = points[0];
for (int i=1; i<points.length; ++i) {
  center = massCenter(center, i+1, points[i]);
}

Point massCenter(Point currCent, int weight, Point p) {
  double x = (currCent.x * weight + p.x)/(weight+1);
  double y = (currCent.y * weight + p.y)/(weight+1);
  return new Point(x, y);
}

为了正确计算中心,我假设了一个双坐标。

答案 2 :(得分:0)

我的猜测是O(n)解决方案是不可能的。如果输入数据集的所有点都接近圆形,那么算法似乎必须检查每个点以查看它是否是最佳解决方案。

现在,可能有很好的算法来处理与n成比例的“正常”情况 用于排序最佳优先搜索点的O(N log N)启发式算法似乎很可能。 A-star甚至可能成为可能,但似乎更难。