2

我正在写一个迷宫生成算法,这篇维基百科文章引起了我的注意。我决定用java实现它,这很容易。我遇到的问题是,虽然生成了类似迷宫的图片,但迷宫通常是不可解决的,而且通常并不有趣。我所说的有趣是指有大量无法到达的地方,而且通常有很多解决方案。

我实施了 1234/3 规则(虽然它很容易改变,请参阅注释以获得解释),一开始的分布大约为 50/50。迷宫总是达到平衡,其中 t 步之间没有变化。

我的问题是,有没有办法从固定的起点和终点保证迷宫的可解性?此外,有没有办法让迷宫更有趣地解决(更少/一个解决方案和很少/没有无法到达的地方)?如果细胞自动机无法做到这一点,请告诉我。谢谢你。

4

3 回答 3

3

我认为不可能通过简单的元胞自动机来确保一个可解的、有趣的迷宫,除非有一些特定的标准可以放在起始状态上。细胞不知道整体形状的事实,因为每个细胞将无法与整个群体协调。

如果您坚持使用它们,您可以在生成完成后进行一些修改和寻路的组合,但其他方法(如维基百科文章或此问题中显示的方法)更易于实现并且不会导致墙壁它占据了整个细胞(除非你想要那个)。

于 2012-05-18T01:15:05.393 回答
1

问题的根源在于“迷宫质量”是一种全局度量,但您的自动机单元仅限于系统的非常局部的知识。

要解决此问题,您有三个选择:

  1. 从外部添加全局信息。使用自动机和随机初始数据生成迷宫,然后测量迷宫质量(例如使用洪水填充或一堆其他迷宫解决技术)并重复,直到得到你喜欢的结果。

  2. 使用一组更复杂的显式规则和状态。您可以制定一组规则/单元格值,这些规则/单元格值对墙壁的存在和路径的长度/质量进行编码。例如,-1 将是一堵墙,正值将是上方和左侧所有邻居的总和。然后正值大致编码从左上角的路径距离。这还不够,但它显示了总体思路……您需要在系统规则中“直接”编码关于迷宫的算法。

  3. 使用不太复杂但仍然完整的规则集,并对初始状态下的迷宫生成规则进行编码。例如,您可以使用康威的生命并构建一个初始状态,该状态是一个“程序”,通过滑翔机等实现迷宫生成。

如果它对您有帮助,您可以在上述内容和以下内容之间进行比较:

  1. 机器中的幽灵/外部用户
  2. FPGA
  3. 对通用 CPU 进行编程
于 2012-05-18T01:00:38.977 回答
0

在其上运行寻路算法。Dijkstra 会给你一个可靠的方法来计算所有的解决方案。A* 会给你一个很好的解决方案。

迷宫的难度可以通过这些算法解决它的速度来衡量。

您可以添加一些死胡同以关闭某些解决方案。

于 2012-05-18T01:09:10.523 回答