设为一个对象数组[a,b,c,d,...]和一个函数距离(x,y),它给出一个数值,显示对象x和y的“不同”。
我正在寻找一种算法来查找长度为n的数组的子集,以最大化该子集元素之间的最小差异。
当然,我不能简单地按照与其他元素的最小差异对数组进行排序,并且取n个最高条目,因为删除元素可以很好地改变距离。例如,如果a = b,则删除a表示b与另一个元素的最小距离将发生显着变化。
到目前为止,我能找到的唯一解决办法是迭代删除最小距离最小的元素并重新计算每次迭代的距离,直到只剩下n个元素,反之亦然,迭代选择新元素,重新计算距离,添加新选择或根据距离最小值替换现有选择。
有没有人知道如果没有这些迭代我会得到相同的结果?
PS:这是一个例子,矩阵显示每个元素之间的“距离”......
a b c d a - 1 3 2 b 1 - 4 2 c 3 4 - 5 d 2 2 5 -
如果我们只保留2个元素,那就是c和d;如果我们保留3,那将是a或b,c和d。
答案 0 :(得分:3)
这个问题是NP-hard,所以没有人知道解决它的有效(多项式时间)算法。
这是一个快速草图,它是NP难的,从CLIQUE缩小。
假设我们有一个以图表G和数字 n 形式的CLIQUE实例,我们想知道G中是否有一个大小 n 的团队构造距离矩阵 d ,使 d ( i , j )= 1,如果顶点 i 和 j 以G连接,如果不连接则为0。然后找到大小为 n 的G顶点的子集,它最大化元素之间的最小距离(您的问题)。如果此子集中顶点之间的最小距离为1,则G具有大小为 n 的clique;否则它没有。
答案 1 :(得分:1)
正如加雷斯所说,这是一个NP难问题,但是已经有很多研究来解决这类问题,因此找到了比蛮力更好的方法。不幸的是,这是一个如此大的领域,你可以永远花在研究解决方案的可能实现上。
但是,如果您对解决此问题的启发式方法感兴趣,我建议您研究一下Ant Colony Optimization(ACO),它已经证明在图表中找到最佳路径非常有效。