【问题标题】:Comparing boolean matrices比较布尔矩阵
【发布时间】:2012-02-15 14:50:56
【问题描述】:

我有一个小问题。我需要将一个填充有 1 和 0 的二维数组(我们称之为矩阵 A - 零实际上代表空白点,而 1 是足球运动员在球场上的位置)与许多其他填充不同的矩阵(但同样,只是一个和零),结果应该表明哪个矩阵与矩阵 A 最相似。通过相似性,我指的是场上球员分布(或位置)的相似性 - 所以与球员位置最相似的矩阵矩阵 A 将被选择用于进一步的东西。

有人可以帮忙解决这个算法问题吗?

我是用 C++ 编写的,但伪代码就足够了。问题只是一个比较算法。最好的情况是比较函数的输出类似于similarity coefficient,我可以将其存储在一个数组中,然后使用它选择最相似的矩阵。但我只是想不出一些用于相似性比较的算法。

编辑:从下面我的 cmets 复制的关于相似性和算法的一些说明 -

矩阵 A - Matrix A ,矩阵 1 - Matrix1 ,矩阵 2 - Matrix2,与矩阵 A 相比,两者都有 1 个变化,但对我来说 - 矩阵 2 必须“更相似” - 因为玩家是更接近它在矩阵 A 中的位置

矩阵被认为是大约 8x6 或类似的大小,它需要相当快 - 它将在每个游戏周期(因此每 20 毫秒左右......)计算一次,并且每边将有 5 名玩家。

【问题讨论】:

  • 如果你想提出一个算法,你需要比上面模糊的描述更可靠地定义“相似性”
  • 好吧,最相似的矩阵应该是玩家站在矩阵 A 中最接近位置(或在某些情况下正好在位置上)的矩阵。
  • 如果您在问题中添加一些示例以及您在每种情况下期望的所需“相似性”度量,也许会有所帮助?
  • 我真的不知道如何解释相似度度量,我认为它在某种程度上很明显:) 但我会尝试一些例子:Matrix A - wolframalpha.com/input/… Matrix 1 - wolframalpha.com/input/… Matrix 2 - wolframalpha.com/input/… Matrix 1 会有更好的相似系数。你明白基本概念了吗?
  • 有一个明显的衡量标准:让玩家四处走动将一个矩阵转换为另一个矩阵需要多少步。但是,这将很难计算。

标签: c++ algorithm matrix pseudocode


【解决方案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)(在你的情况下,规范是不变的。)

【讨论】:

  • 你好,玩家数量是固定的。
  • @Jam,在这种情况下,它更简单。已更新。
  • 所以你是在建议这样的事情? - 像你建议的那样制作两种游戏状态的矩阵表示,然后计算每对向量的余弦相似度(对于两个矩阵中的每两个“行”) - 然后也许......对结果求和?对不起,如果我不太明白,我的英语不太好。
  • @Jam,您写的内容是可能的,但效率较低。您不必单独处理每一行,您可以将矩阵视为平面向量以提高计算效率。如果你使用余弦相似度,这两种方法会给出不同的结果,但两者都可能很好。如果使用欧几里得距离,这两种方法在数学上是等价的。
  • 所以我应该将矩阵重写为一维数组?还有 - 是否有一些 C++ 库等价于您发布的那些距离测量函数?
【解决方案2】:

一个可能的简单算法的想法,虽然不是很健壮,但在你的情况下就足够了:

  1. 对两个矩阵中的相应单元格执行 XOR 以获得一个布尔矩阵,其中1 表示两个原始矩阵之间存在差异0表示单元在两个矩阵中相同
  2. 求和结果矩阵中的所有单元格。分数(总和)越低,原始矩阵越相似。

这将为您提供每两个矩阵更改的单元格数量。

在您在评论中提供的示例中,根据此算法,矩阵 1 的得分为 2,矩阵 2 的得分为 8,这意味着矩阵 1 与A 比矩阵 2。

【讨论】:

  • 您好,感谢您的回答,但我忘了提及一件重要的事情 - 这个解决方案无法正确解决我的问题,因为例如一个变化的矩阵(玩家的一个位置不同)会得分为 2,但它没有考虑玩家与矩阵 A 中位置的距离——这意味着玩家站在哪里并不重要——它总是得分为 2……嗯,这就是考虑到距离,这确实是个问题。 - 抱歉,我的问题没有说清楚。
  • 我的意思是:矩阵 A - www2.wolframalpha.com/input/… 矩阵 1 - www2.wolframalpha.com/input/… 矩阵 2 - www2.wolframalpha.com/input/… 与矩阵 A 相比,两者都有 1 个变化,但对我来说 - 矩阵 2 必须是“更多相似” - 因为玩家在矩阵 A 中的位置更接近其位置
  • @Jam,是的,你是对的。我的解决方案确实没有考虑到这一点,但我不会删除它仅供参考。
【解决方案3】:

如果您想检查 1 秒之间的距离,这将是一项小工作。
AND 两个数组,然后求和 - 这给出了两个 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

【讨论】:

  • 您好,感谢您的回复,但我不确定我是否理解正确 - 请您详细描述一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多