我正在编写一个迷宫生成算法,这篇维基百科文章引起了我的注意。我决定在java中实现它,这很简单。我遇到的问题是,当生成类似迷宫的图片时,迷宫通常是不可解决的,并且通常不是很有趣。我的意思是有趣的是,有大量无法到达的地方,往往有很多解决方案。
我实施了1234/3规则(尽管可以轻松更改,请参阅注释的说明),开头的分布大致为50/50。迷宫总是达到平衡,在t阶段之间没有变化。
我的问题是,有没有办法保证固定起点和终点的迷宫可解决性?另外,有没有办法让迷宫更有趣解决(更少/一个解决方案和几个/没有无法到达的地方)?如果细胞自动机无法做到这一点,请告诉我。谢谢。
答案 0 :(得分:3)
我不认为通过简单的细胞自动机可以确保一个可解决的,有趣的迷宫,除非有一些特定的标准可以置于起始状态。细胞不了解整体形状的事实,因为每个细胞不能与整个细胞群协调。
如果您坚持使用它们,您可以在生成完成后进行修改和路径查找的某种组合,但其他方法(如维基百科文章或this question中显示的方法)更容易实现,不会导致占据整个细胞的墙壁(除非你想要那样)。
答案 1 :(得分:1)
问题的根源在于“迷宫质量”是一种全局衡量标准,但您的自动机细胞仅限于对系统的本地知识。
要解决此问题,您有三个选择:
从外部添加全局信息。使用自动机和随机初始数据生成迷宫,然后测量迷宫质量(例如使用洪水填充或bunch of other maze solving techniques)并重复直到获得您喜欢的结果。
使用更复杂的一组显式规则和状态。你可以计算出一组规则/单元格值,它们既可以编码墙的存在,也可以编码路径的长度/质量。例如,-1将是墙,正值将是上方和左侧的所有邻居的总和。然后正值粗略地编码左上角的路径距离。这还不够,但它显示了一般的想法......你需要在系统规则中“直接”编码关于迷宫的算法。
使用一个不那么复杂但仍然很完整的规则集,并在初始状态下编码迷宫生成规则。例如,您可以使用conway's life并构建一个初始状态,该状态是通过滑翔机等实现迷宫生成的“程序”。
如果它可以帮助您在上面和之间绘制一个平行线:
答案 2 :(得分:0)
在其上运行路径查找算法。 Dijkstra会为您提供计算所有解决方案的可靠方法。 A *会给你一个很好的解决方案。
迷宫的难度可以通过这些算法解决它的速度来衡量。
你可以添加一些死胡同来关闭一些解决方案。