在网格上随机生成有向图


11

我试图随机生成一个有向图,目的是制作类似于口袋妖怪的滑冰拼图游戏的拼图游戏。
本质上,这就是我希望能够随机生成的内容:http : //bulbanews.bulbagarden.net/wiki/Crunching_the_numbers : _Graph_theory

我需要能够在x和y维度上限制图形的大小。在链接中给出的示例中,它将限于8x4网格。
我遇到的问题不是随机生成图,而是随机生成图,我可以在2d空间中正确地绘制它,因为我需要在节点的另一侧做一些事情(例如岩石)来制作它停止滑动时在视觉上有意义。这样做的问题是,岩石有时会终止于两个其他节点之间或可能位于另一个节点本身的路径中,这会导致整个图形损坏。

与几个我认识的人讨论了这个问题之后,我们得出了两个结论,可能会得出一个解决方案。

  • 构造网格时,将网格中的障碍物包括在图中。
  • 从一个完全填充的网格开始,然后绘制一条随机路径并删除将使该路径起作用的块。

然后问题就变成了要删除哪些,以避免引入额外的较短路径。我们还认为动态规划算法可能是有益的,尽管我们每个人都不擅长从零开始创建动态规划算法。关于此问题被正式称为(如果是官方图形问题)的任何想法或参考将是最有帮助的。

这是到目前为止我已经完成的一些示例,仅通过随机放置块并从选定的开始/结束位置生成导航图即可。想法(如上一链接所述)是从绿色S开始并想要到达绿色F。您可以通过向上/向下/向左/向右移动来实现此目的,并继续沿选定的方向移动,直到碰到一个壁。在这些图片中,灰色是墙,白色是地板,紫色线是从头到尾的最小长度,黑色线和灰色点表示可能的路径。

以下是一些随机生成图的不良示例:

在此处输入图片说明

以下是随机生成(或手动调整)图的一些好示例:

在此处输入图片说明

我似乎还注意到,实际上在玩拼图游戏时更具挑战性的是那些在最小路径上具有很多高次节点的游戏。


1
您可以生成一组完全随机的岩石,然后检查相应的图是否有解,如果没有,则将其丢弃并重新开始。使用8x4网格,这不会花那么长时间。我确信有更清洁的解决方案。
2012年

这是我的第一个方法,但是我需要做一个更大的规模,并且强行强制执行它似乎需要一段时间,并且正试图找到一个更好的方法。
Talon876

Answers:


2
  • 是冰,除非碰到石头,否则您将移动。
  • 改变方向的唯一方法就是砸石头。
  • 如果您撞到岩石,则必须更改方向。
  • 由于明显的原因,周期是好的。
  • 可以有多个起点和多个终点。

更高级的属性:

  • 没有相邻岩石的细胞是无法到达的(某些可以被遍历)
  • 墙壁也是岩石,如果您将其移除,则可以决定环绕。
  • 您可以将子网格用作模式(“平铺” 3x3、3x4、5x5等)
  • 您可以在不可遍历的MxN区域上覆盖一个拼图MxN磁贴,并添加一块岩石以重定向进/出该区域。
  • 瓷砖的旋转或对称可能会很有趣
  • 您可以通过插入冰冷的行/列来扩展图块

例:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

组合图块的示例:

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

您可能会喜欢Tsuro游戏,它使用图块生成随机棋盘。


0

如果您愿意,逆向工程可能会为您提供帮助。

如果每个问题只有一个解决方案,则可能可以根据唯一答案生成图。这不需要您进行动态编程,甚至不需要跳过蛮力就可以选择有条不紊的进行。

您可以通过以下方式进行处理:

  1. 准备好MxN图
  2. 创建一个/多个解决方案
  3. 围绕它提出一个问题,如果它是一个奇异的解决问题
  4. 如果有多个解决方案,则可以某种方式重复上述过程,以使当前的迭代不会禁止其他解决方案。

尽管您将需要根据问题的复杂性和问题的大小来选择一种方式来为您生成该问题。不要只是蛮力。请尝试一些随机算法。可以帮助您。


我知道我会后悔去年卖掉那本书,但是我想我的一个朋友在某处有这本书。我应该在其中寻找任何特定的算法吗?或者只是查看所有带有图形的图形,看看是否可以找到一个有用的图形?哦,有一个最佳解决方案(尽管我想可能会有一个联系)和其他无限解决方案,因为您可以在两个节点之间来回任意次数,然后再解决它。
Talon876

0

那另一种方法呢?从一个空的迷宫开始,并添加如下所示的块:

  1. 随机开始和结束块。
  2. 沿随机(但不返回)方向和随机长度(*)进行1-3个“滑动”步骤。在每个步骤之后放置一个块(以停止幻灯片)。
  3. 找到通往出口的最短路径。如果段太少(低难度),请随机选择路径段并用块将其分割。否则,请按照步骤1中的步骤放置一个块并退出。
  4. 谨慎地重复1(*):选择滑动步长时,请确保其长度不会使您放置的块关闭前一条路径。

最后一点:使用您提供的算法找到最短路径。记下所有已使用的单元格,并开始随机填充其余单元格,每次都要确保最短路径不会变短。

在第二步中有一个警告,当您不能放置最后一个块以使它不会越过使用的路径时,但我看到了两种解决方案:更早地移动结尾的块或撤消一些步骤,然后重试。

还有一个关于滑动步长随机长度的想法-您可能希望选择它,以便在路径不重叠的情况下重用放置在前面的块。


@ Talon876这是我正在谈论的一种随机算法。
c0da 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.