我正在尝试实施爬山算法,以根据特定标准决定从一组位置中选择哪些位置。有多达5000个地点可供选择。
其中一个标准是地理分散,因此我需要能够为我的位置的任何子集指定一个代表色散的值。
每个位置都有纬度和经度数据。
速度是一个问题,这就是为什么我需要一些启发式算法来估计一组特定位置(即可能的解决方案)的分散程度。
我已经尝试将我潜在解决方案中每个位置的成对距离求和,但这证明太慢了。
然后我尝试了在我的潜在解决方案中距离所有位置中心的距离之和,这证明更快但不能有效地工作。使用这种方法将有利于几个位置集群。
非常感谢任何其他建议。
答案 0 :(得分:0)
首先,你能用成对的总和来重述你的意思吗?我问,因为听起来你形成了所有可能的对,而且非常缺乏。如果是这种情况,如何找到第一个1)最近的邻居,然后2)最长的路径?
1)如果我没记错,你可以在不到O(n log n)的时间内完成。 2)如果形成的树木断开连接,你必须找到树木之间的最短距离。而且由于树木,这不是NP完全问题,但实际上最短路径alg就足够了。
此时,怀疑我没有正确理解你的问题,如何对地理区域的出现次数进行某种偏差,要么在极值点之间平均划分,要么选择一些先前的启发式算法。
您能定义或进一步阐述分散概念吗?
答案 1 :(得分:0)
考虑三种情况:
您在所有成对距离上的总和很好地捕获了(1)和(2):近似聚类比大聚类产生更小的结果。它如何做(3)?此处,节点e
总数的比例N
距离很远,平均距离为D
。其他(1-e)N
个节点的聚类平均距离为d
。
现在,必须考虑多少个成对连接?对于群集节点,有((1-e)N)^2=e^2*N^2-2*e*N^2+N^2
个此类连接。对于远程节点,有e^2*N^2
个连接。
现在,将这些值乘以平均距离。这给出了(d*(e^2*N^2-2*e*N^2+N^2)+D*(e^2*N^2))/N
的总成对平均值。现在,假设e
很小,我们可以忽略包含e^2
的术语。因此,平均值为d*(N^2-2*e*N^2)/N
。
现在,考虑您的第二个指标:每个人与平均中心点的距离。这在(1)和(2)上也很好:关闭簇比较大的簇具有更小的结果。它如何做3?使用与上述相同的e
来表示异常值的比例。现在,节点与中心点的平均距离由(d*(1-e)*N+D*e*N)/N
给出。换句话说,群集节点不再像以前那样加权。
有没有一种方法可以进行轻量级计算并且仍然可以更合适地对群集节点进行加权?我想是的。
我的建议是,从列表中选择随机节点对,计算节间距离,然后对结果取平均值。对于(1)紧密簇,所有节点将靠近在一起,因此您绘制的所有随机对将接近计算得到的成对平均值。对于(2)松散的簇,同样的情况也是如此。对于(3),具有异常值的集群,您更有可能从集群内部绘制节点而不是从非集群中绘制节点,因此异常值最终会被忽略。
随着您增加采样的节点数量,群集将倾向于支配随机采样。我猜这将提供O(N)
而非O(N^2)
时间的正确准确度。