我该如何编码这个问题? (C ++)

时间:2009-10-07 09:36:00

标签: c++ matrix pattern-matching set

我正在编写一个简单的游戏,它将数据集存储在2D网格中(如棋盘)。网格中的每个单元格可以包含一个整数(0表示单元格为空)。如果单元格包含数字> 0,据说是“填充”。网格上的“已填充”单元格集称为“配置”。

我的问题是能够“识别”特定配置,无论MxN网格中的单元格配置在哪里。

问题(在我看来),分解为以下两个子问题:

  1. 以某种方式“规范化”配置的位置(例如,将其位置“重新定位”为(0,0),使得包含配置中所有单元格的最小矩形的左顶点位于(0,0) )在MxN网格中

  2. 计算某种相似性度量(或者可能只是设置差异?),以确定当前“规范化”配置是否是已知配置之一(即“已识别”)

  3. 我怀疑我需要使用std :: set(迄今为止我用过的少数几个STL容器之一,在我这些年里作为C ++编码器!)。我很感激任何以前解决过这个问题的人的想法/提示。任何代码片段,伪代码和/或链接确实非常有用。

7 个答案:

答案 0 :(得分:3)

相似度量是学术研究的一个重要领域。您需要确定任务所需的复杂程度。您可以简单地在整个棋盘上拖动“模板图案”,栅格样式,并为每个位置得分+1得分,-1得失,并对得分求和。然后找到模板获得最高分的位置。此score_max是该模板的相似度量。如果这种方法不充分,那么你可能需要更详细地了解游戏的确切性质。

答案 1 :(得分:1)

也许您可以使用一些哈希函数来识别配置。由于你需要识别模式,即使它们不在板上的相同位置,这个散列不应该取决于单元格的位置,而是取决于它们的组织方式。

如果将2D网格存储在一维数组中,则需要找到第一个填充的单元格并从此处开始计算哈希值,直到最后一个填充的单元格为止。

例如:

-----------------
|   |   |   |   |
-----------------
|   | X | X |   |
-----------------
|   |   | X |   |
-----------------
|   |   |   |   |
-----------------

----------------+---------------+---------------+----------------
|   |   |   |   |   | X | X |   |   |   | X |   |   |   |   |   |
----------------+---------------+---------------+----------------
                    |_______________________|
                                |
               Compute hash based on this part of the array

然而,有些情况下这不起作用,例如当模式跨越线移动时:

-----------------
|   |   |   | X |
-----------------
| X |   |   |   |
-----------------              Different configuration in 2D.
| X |   |   |   |
-----------------
|   |   |   |   |
-----------------

----------------+---------------+---------------+----------------
|   |   |   | X | X |   |   |   | X |   |   |   |   |   |   |   |
----------------+---------------+---------------+----------------
            |_______________________|
               Seems similar in 1D

所以你需要一些方法来处理这些案件。我还没有任何解决方案,但如果我的日程允许的话,我会尝试找一些东西!

在考虑了一下之后,也许你可以为网格使用两种不同的表示形式:一种是在一维数组中附加行,另一种是在一维数组中附加一列。哈希将使用这两个表示来计算,这将(我认为)解决上面提到的问题。

答案 2 :(得分:0)

对于小型应用程序而言,这可能有点过分,但OpenCV具有一些出色的图像识别和blob查找程序。如果将2D板视为图像,将整数视为亮度,则应该可以使用该库中的函数。

链接: http://opencv.willowgarage.com/documentation/index.html

答案 3 :(得分:0)

听起来您想要将棋盘送到经过训练以识别配置的神经网络。

这与图像分类的经典示例非常相似,唯一的复杂因素是您不知道您的配置内容在网格中的确切位置,除非您始终考虑整个网格< / strong> - 在这种情况下,经典的2层网络应该可以工作。

HTM神经网络实现解决了开箱即用的偏移问题。从here开始,您可以找到大量现成的实现。显然你不得不调整你会发现的实现,但你应该能够完全达到我要求的理解。

如果您想进一步调查此路线,Numenta forum将是一个很好的起点。

答案 4 :(得分:0)

你可以使用神经网络完成这项工作。

如果您寻找神经网络形状识别,我认为您可以找到有用的东西。你可以找到大量可以帮助你的图书馆,但如果你没有NN的经验,这可能有点难,但我认为这是最简单的方法

答案 5 :(得分:0)

这让我想起使用QuadTrees的HashLife。查看有关HashLife和Quadtrees的维基百科页面。

维基百科页面底部还有一篇关于实际实施此类算法的DrDobbs文章的链接:http://www.ddj.com/hpc-high-performance-computing/184406478

我希望这些链接有所帮助。如果没别的话,它们是有趣的读物。

答案 6 :(得分:0)

至于问题的第一部分,即贬低试试这个:

创建一个包含2个整数的结构.Declare指向该结构类型的指针。输入(或计算活动单元的数量)并分配那么多的存储空间(使用像calloc这样的例程)。输入结构中的坐标。计算最小x坐标和最小y坐标。在Universe中将[x] [y](用户给定值或当前坐标)分配给[x-minx] [y-miny]虽然从已经填充的网格中读取时虽然很昂贵但是有效且有帮助在问题的后续部分。