在m * n矩阵中在3个点之间收敛所需的最小移动次数

时间:2013-07-03 03:14:51

标签: algorithm matrix dynamic-programming minimum

我有一个(m * n)矩阵,其中有3个不同的点。我必须找到最小移动次数,使得所有3个点都收敛于矩阵内的一个点。

我迄今为止尝试过的解决方案:

  • 蛮力解决方案:尝试矩阵中的所有点,找到 从3个给定点开始需要最小移动的点。
  • 将三个点绑定为三角形并尝试在此区域中的点。这更可能是这个三角形的质心。

我想知道有关此问题的其他优化解决方案。感谢。

3 个答案:

答案 0 :(得分:1)

每次移动都可以将x或y坐标改变+/- 1.垂直和水平距离都是独立的。因此,首先将引导点指向一个x坐标,然后指向y坐标。最佳的做法是将具有最小和最大x的点移动到第三点的x位置。对y重复相同,你就完成了。

这样最终点的坐标是x轴中间点的x坐标和y轴中间点的y坐标(虽然可以有很多这样的点,但这必须是最小化集之一) 。 (如果它们重叠,显然任何一个重叠坐标都是中间的坐标。)

以编程方式获取x值的数组,删除最大值和最小值,与y相同,并且您将保留最接近所有点。

答案 1 :(得分:0)

我认为这是http://en.wikipedia.org/wiki/Steiner_tree_problem的变体之一 - 可能是http://en.wikipedia.org/wiki/Rectilinear_Steiner_tree问题。这看起来足够令人生畏,我会坚持尝试三角形内的所有点。

实际上只有点聚合在一个点上我认为sashkello是对的

答案 2 :(得分:0)

适用于Manhattan distance

简单地将3个点的中间x坐标和中间y坐标作为目标。中间我指的是排序坐标的中位数。

示例:

输入:(1,5), (2,4), (3,6)

x分为123(排序为123)。中间的是2

y分为546(排序为456)。中间的是5

因此,最小化距离的点是(2,5)

<强>证明:

如果我们从上面提到的点开始向任何方向移动,到我们移动的点的距离会减小,到其他2点的距离会增加,因此每次移动1会导致总减少1但总增加2.一旦我们超过最后一点,所有3个距离将增加,因此总增加将是3而没有减少。因此,任何移动都会导致距离增加,因此上述点是最佳的。

适用于Euclidean distance

(我现在意识到你说的最小动作,因此这可能不是你想要的)

这有点复杂。它涉及最小化这个等式:

sqrt((x-x1)^2 + (y-y1)^2) + sqrt((x-x2)^2 + (y-y2)^2) + sqrt((x-x3)^2 + (y-y3)^2)

由于sqrt,我们不能通过说xy是不同的来简化等式。

然而,贪婪的方法可能有效:

  • 选择任何一点(也许最小化曼哈顿距离的点是一个好的开始)。
  • 虽然拾取点的一个相邻点导致欧氏距离较低,但选择该点。