我有一组N个点(特别是二进制字符串),对于每个点,我都有一个离散度量(汉明距离),即给定两个点i和j,Dij是第i个点和第j个点之间的距离。我想找到一个k元素的子集(当然k< N),使得这k个点之间的距离尽可能大。换句话说,我想找到一种“边界点”,它覆盖了点空间中最大的区域。如果k=2,答案显然是可以在距离矩阵中查找两个最远的元素,但是如果k>2,我该如何推广这个问题呢?有什么建议吗?这是一个NP难问题吗?谢谢回答
根据这些距离,我发现v3离v1太远了,但是离v2很近,而v4则与v2相距太远,但却靠近v1。因此,我更倾向于将顶点v5添加到我的子图中,因为它与其他两个顶点的距离更加均匀。希望现在我的问题已经清楚了。您认为您的表述已经正确了吗?
我声称找到k个点,使得这些点之间的最小距离或这些点之间距离的总和尽可能大的问题是NP完全问题,因此没有多项式时间的确切答案。这表明我们应该寻找某种启发式解决方案,因此这里有一个基于聚类思想的解决方案。我将描述如何最大化总距离。我认为它也可以用于最大化最小距离以及其他目标。
选择k个任意点,并记录每个点到其他点的距离之和。对于数据中的每个其他点,查看到k个选定点的距离之和,并查看是否用该点替换任何选定点会增加距离之和。如果是,则替换增加距离之和最多的点并继续。不断尝试,直到没有点可用于增加距离之和。这只是局部最优解,因此请使用另一组k个任意/随机点重复操作,以期找到更好的解决方案,直到您感到厌倦。
这继承了其聚类祖先的以下属性,对于测试至少可能有用:如果可以将点分成k类,使得同一类中任意两点之间的距离始终小于不同类中任意两点之间的距离,则当您找到k个点时,其中没有局部改进是可能的,这k个点应该都来自不同的类别(因为如果不是这样,从同一类中一对点中交换一个点会增加它们之间距离的总和)。