我有两组对象,每组由4个对象组成。目标是计算两组之间的相似程度。两个对象之间的比较产生一个int数。该数字越低,对象越相似。具有该组的这些对象的顺序与组相等无关。
所以我必须要做的是将组1的每个对象与组2的每个对象进行比较,这将给出16个对象之间的不同比较结果。我将它们存储在名为costs的4x4 int表中。
int[][] costs= new int[4][4];
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
costs[i][j]=compare(objectGroup1[i],objectGroup2[j]);
}
}
现在我有4组4个比较结果,我必须从每个组中选择一个结果,以便添加它们并计算组之间的总距离度量。这是我被卡住的地方。 我必须尝试所有四种组合并得到最小数量,但只有一次使用对象的消耗。
示例:如果要添加的四个值中的第一个是objectGroup1 [1] - objectGroup2 [1]之间的比较结果,那么我不能在这个四人组中使用任何其他使用objectGroup1 [1]和对于objectGroup2 [1]也是如此。
有效示例:group1 [1] -group2 [2],group1 [2] -group2 [1],group1 [3] -group2 [3],group1 [4] -group2 [4] ----&gt ;每个组中的每个对象只出现一次
我可以在这里使用哪种算法?
答案 0 :(得分:0)
听起来你正试图找到第1组permutation的项目,这些项目会在关闭项目时将其与组2的项目最相似。
Eric Lippert在producing permutations上有很多博客文章。因此,基本上你所要做的就是迭代它们,通过配对项目来计算得分,并返回最佳得分。基本上只是Zip-ing和MinBy-ing:
groupSimilarity =
item1.Groups
// (you have to implement Permutations)
.Permutations()
// we want to compute the best score, but we don't know which permutation will win
// so we MinBy a function computing the permutation's score
.MinBy(permutation =>
// pair up the items and combine them, using the Similarity function
permutation.Zip(item2.Groups, SimilarityFunction)
// add up the similarity scores
.Sum()
)
上面的代码是C#,用“Linqy”函数样式编写(如果你不熟悉那就很抱歉)。 MinBy是来自MoreLinq的有用函数,Zip是标准的Linq运算符。