合并图形的相邻顶点,直到可以在尽可能少的步骤中留下单个顶点

时间:2017-05-19 19:15:52

标签: algorithm data-structures graph graph-theory

我有一个游戏系统,可以表示为无向,未加权的图形,其中每个顶点都有一个(相关)属性:一种颜色。游戏在图形表示方面的目标是将其减少到最少的一个顶点"步骤"可能。在每个步骤中,玩家可以改变任何一个顶点的颜色,并且相同颜色的所有相邻顶点都与其合并。 (请注意,在下面的示例中,我恰好向用户显示仅在整个游戏中更改一个特定顶点,但用户可以在每个步骤中选择任何顶点。)

graph diagram

我所追求的是一种计算所需步数最少的方法,以及#34; beat"根据上述过程给出的给定图形,并且还提供了这样做所需的特定动作。我熟悉路径寻找的基础知识,BFS以及那种性质的东西,但我很难用最快的路径来解决这个问题。"解。

我无法在Google上的任何地方找到同样的问题,甚至是一个封装问题的图论理论术语。有没有人知道如何开始接近这个问题?有人能指出我正确的方向吗?

编辑由于这个问题似乎很难有效解决,或许我可以改变我的问题的目标。有人可以描述我甚至会设置一个蛮力,广泛的第一次搜索? (蛮力可能没问题,因为实际上这些图形最多只有20个顶点。)我知道如何为普通的链接图形数据结构编写BFS ...但在这种情况下,由于每个顶点看起来很奇怪必须在其自身内包含整个图形,并且必须基于在顶点内的图形中进行的可能移动来生成搜索图形中的下一个顶点。如何设置数据结构和搜索算法来实现这一目标?

编辑2 这是一个老问题,但我认为直接说明游戏是什么可能会有所帮助。该游戏基本上是Kami 2 for iOS的剽窃,除了我的自定义拼图编辑器会自动找出解决你的拼图的最快方法,而不是自己通过反复试验找到最短的移动数字。我不确定Kami是否是一个完全原创的游戏概念,或者是否有类似的游戏类似于" flood-fill"我不知道的机械师。如果这是一种常见类型的游戏,也许知道它的名称可以让我找到更多关于我寻求的算法的文献。

编辑3 This Stack Overflow question似乎可能会有一些相关的见解。

3 个答案:

答案 0 :(得分:2)

直观地说,解决方案似乎是全球性的。例如,如果你选择一个更大的图形,你首先选择哪个点会对直接邻居产生影响,这会对邻居产生影响,等等。

听起来好像它与地图着色问题有同样的问题。不是因为颜色,而是因为本地选择对图表另一端的影响。在地图着色中,您必须决定绘制国家及其邻国的颜色,以便触摸的两个国家/地区具有相同的颜色。第一组选择会影响后续迭代中是否存在解决方案。

答案 1 :(得分:2)

只是为了表明问题是多么复杂。

让我们检查更简单的问题,其中用树改变图形,只有根顶点可以改变颜色。在那种情况下,叶子的路径可以表示为该路径上的顶点颜色序列。如果叶子的序列是A的子序列,则颜色变化的序列A会折叠叶子。

问题可以说明,对于给定的序列集,问题是找到最小长度序列(S),以便每个初始序列包含在S中。这称为shortest common supersequence problem,它是NP-complete

你的问题肯定比这个更复杂: - /

修改* 这是对问题编辑的评论。查看此page以获取条款。

最小可能移动的数量是> =而不是图形半径。有了它,这似乎是一个好的策略:

  • 使用中心顶点进行移动
  • 使用减少图形半径的移动,或者至少减少从中心顶点到“大”的距离。顶点集。

我会采用一种策略来跟踪中心顶点和所有图形顶点到这些中心顶点的距离。步骤是检查所有有意义的移动,并选择一个最小化半径或距中心顶点的距离。我认为BFS可用于距离计算以及移动如何影响它们。有一些棘手的部分,比如中心顶点在移动后会发生变化。也许最好不仅要使用中心顶点,还要使用靠近中心的顶点。

答案 2 :(得分:1)

我认为您要查找的图形术语是图形的“效价”,它是节点连接的边数。看起来您想要根据具有最高效价的节点来更改颜色。然后在结果图中更改具有最高价的节点的颜色等,直到您只剩下一个节点。