从一组二维点中选择“n”个最远点的最优方法

时间:2016-12-07 11:23:25

标签: php algorithm

我有(纬度,经度)坐标。

(13.0180552378288,77.6811561227539)
(12.9905166666667,77.7278116666667)
(12.9381400000000,77.7486000000000)
and so on..............there can be upto 100 point

我实际上是在需要k-means的情况下实施k initial centroids算法。

我想选择那些k点,使它们相距最远。

PS。我有一个函数,它占用两个位置并在它们之间给出距离。

提前致谢。

2 个答案:

答案 0 :(得分:0)

让我们假设你随机坐在阵列

    $random_cordinates = array();

制作另一个用于保存距离的数组,例如

    $distnce_array = array();

现在,在foreach循环中,将第一个elemnt与距离的所有其他元素进行比较。并将codinates保存到第三个数组$ distnce_array及其索引和匹配索引 比如,第一次将索引1处的值与所有其他索引进行比较,并且它与第7个元素匹配,因此它就像

    $distnce_array[0] => 7;

等等也适用于其他人,但是当移动到下一个索引时,不要比较以前的坐标,比如当你在索引5时不检查0,1,2,3,4等等而且只保存值大于储存的价值。 因为他没有在evey循环后没有比较绳索。

答案 1 :(得分:0)

我强烈怀疑,如果你的目标是

  

从集合M(| M |> = | N |)中找到一组n个点N,其中   N中点之间的距离之和最大

您可以使用以下算法解决此问题:

false

正确性的直观“证明”是由P分隔的多边形内的任何点与P的成员相比具有比其将替换的P中的点更短的Δ距离。 但是,这不是一个正式的证据。

在PHP中实现算法应该很简单。您可以使用O(n)算法find P - 也可以使用in PHP。然后在最坏的情况下你需要null来加点(案例3);或Take the bounding-polygon of the global set of points, M Call the set of points that delimit this polygon P; if 1. |P| = |N|, then you have finished. All points in P should belong to N 2. |P| > |N|, then you need to discard points from P. For each point in P, calculate its score as the delta-sum that it adds to the total. Remove the lowest-scoring point until you reach |N| 3. |P| < |N|, then you need to add points to P. For each point in M, calculate its score as the delta-sum that it would add to the total. Add the highest-scoring point until you reach |N| 如果您需要丢弃积分(案例2)。