我有点问题。我需要比较一个填充了1和0的二维数组(我们称之为矩阵A - 零实际上代表空白点,其中一个是球场上足球运动员的位置),而不是填充不同的许多其他矩阵(但同样只是并且结果应该是某些矩阵与矩阵A最相似的一些指示。相似度我指的是球场上球员的分布(或定位)的相似性 - 所以与球员的矩阵最相似的矩阵将选择矩阵A用于进一步的东西。
有人可以帮助解决这个算法问题吗?
我用c ++编写它,但伪代码就足够了。问题只是比较算法。最好的情况是比较函数的输出是similarity coefficient
,我可以存储在数组中,然后使用它选择最相似的矩阵。但是我不能为这种相似性比较提出一些算法。
矩阵A - Matrix A,矩阵1 - Matrix1,矩阵2 - Matrix2,与矩阵A相比,两者都有1个变化,但对我来说 - 矩阵2必须“更多”类似的“ - 因为玩家站在矩阵A中的位置更接近
矩阵被认为是大约8x6或类似的东西,它需要相当快 - 它将在每个游戏周期计算(所以每20ms左右......),并且每侧将有5个玩家。
答案 0 :(得分:1)
零/一矩阵不可以很好地满足您的需求。
您关心总玩家displacement 。由于玩家的数量是恒定的,因此可以将游戏状态表示为矩阵,其行对应于玩家并且列对应于场坐标。因此,例如,对于两个玩家{{1,0,0},{0,0,0},{0,0,1}}将为{{1,1},{3,3}}。给定两个游戏状态矩阵A,B,您可以将它们视为向量并使用任何距离度量计算向量相似度(like these,另见C++ library)。一个简单的选项是cosine similarity:dot(A,B)
(在您的情况下,规范是常量。)
答案 1 :(得分:0)
一个可能的简单算法的想法,虽然不是非常强大,但在你的情况下可能就足够了:
1
表示两个原始矩阵之间存在差异,{ {1}}表示两个矩阵中的单元格相同。这将为每两个矩阵提供更改的单元格数。
在评论中提供的示例中,根据此算法,Matrix 1得分为0
,Matrix 2得分为2
,这意味着Matrix 1是比Matrix 2更像8
。
答案 2 :(得分:0)
如果你想检查1秒之间的距离,这将是一个小工作 和两个数组,然后求和 - 这给出了两个1的距离= 0的位置数 现在通过在所有4个方向上移动原件来生成掩模,或者将它们放在一起以产生MASK1 AND MASK1然后求和以给出距离= 1的位置数 您可以为对角线移位再生成4个蒙版 您可以对不同距离的总和进行加权。
例如,如果您的原始数组是
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
然后MASK1将是
0 0 0 0 0
0 0 1 0 0
0 1 0 1 0
0 0 1 0 0
0 0 0 0 0