我有一个(m * n)矩阵,其中有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)
简单地将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)
。
<强>证明:强>
如果我们从上面提到的点开始向任何方向移动,到我们移动的点的距离会减小,到其他2点的距离会增加,因此每次移动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
,我们不能通过说x
和y
是不同的来简化等式。
然而,贪婪的方法可能有效: