我有一个 (m*n) 矩阵,其中包含 3 个不同的点。我必须找到最小的移动次数,以使所有 3 个点在矩阵内的一个点处收敛。
到目前为止我尝试过的解决方案:
- 蛮力解决方案:尝试矩阵中的所有点,从给定的 3 个点中找到需要最小移动的点。
- 将三个点绑定为一个三角形,并尝试该区域中的点。这更有可能是这个三角形的质心。
我想了解针对此问题的其他优化解决方案。谢谢。
我有一个 (m*n) 矩阵,其中包含 3 个不同的点。我必须找到最小的移动次数,以使所有 3 个点在矩阵内的一个点处收敛。
到目前为止我尝试过的解决方案:
我想了解针对此问题的其他优化解决方案。谢谢。
每次移动都会将 x 或 y 坐标更改 +/- 1。垂直和水平距离是独立的。因此,首先将点引到一个 x 坐标,然后是 y 坐标。最优化的方法是将具有最小和最大 x 的点移动到第三个点的 x 位置。对 y 重复同样的操作,你就完成了。
这样,最终点的坐标是 x 轴上中点的 x 坐标和 y 轴上中点的 y 坐标(虽然可以有很多这样的点,但这必须是最小化集之一)。(如果它们重叠,显然任何一个重叠坐标都将是中间坐标)。
以编程方式获取一组 x 值,删除最大值和最小值,与 y 相同,您将得到最接近的点。
我认为这是 http://en.wikipedia.org/wiki/Steiner_tree_problem 的变体之一-可能是http://en.wikipedia.org/wiki/Rectilinear_Steiner_tree问题。这看起来很吓人,我会坚持尝试三角形内的所有点。
实际上,只有一点会聚在一个点上,我认为 sashkello 是正确的
只需将 3 个点的中间 x 坐标和中间 y 坐标作为目标。中间我的意思是排序坐标的中位数。
例子:
输入:(1,5), (2,4), (3,6)
x 点是1
,2
和3
(排序到1
, 2
, 3
)。中间的是2
.
y 点是5
,4
和6
(排序到4
, 5
, 6
)。中间的是5
.
因此,最小化距离的点是(2,5)
。
证明:
如果我们从上述点开始向任何方向移动,到我们要移动的点的距离会减少,到其他两个点的距离会增加,因此每移动 1 会导致总减少1 但总共增加 2。一旦我们移过最后一个点,所有 3 个距离都会增加,因此总增加将是 3,没有减少。因此,任何移动都会导致距离增加,因此上述点是最佳的。
(我现在意识到你说的是最小移动,因此这可能不是你想要的)
这有点复杂。它涉及最小化这个方程:
sqrt((x-x1)^2 + (y-y1)^2) + sqrt((x-x2)^2 + (y-y2)^2) + sqrt((x-x3)^2 + (y-y3)^2)
由于sqrt
's,不能通过说x
和y
是不同的来简化等式。
但是,贪婪的方法可能会奏效: