遍历图表的两种最常用方法是breadth-first search和depth-first search。这两种搜索算法都遵循一个通用模板:
在广度优先搜索中,工作清单W实现为FIFO queue,而在深度优先搜索中,它是LIFO stack。如果W是priority queue,则会得到uniform-cost search。
前一阵子我问a question about a data structure for choosing random elements out of a bag。如果您使用此随机包实现上述工作清单W,那么您将获得一个“随机优先搜索”算法,该算法从初始节点开始随机探索图中的节点。
我的问题是:是否有任何使用此类搜索的已知算法?也就是说,是否存在以这种方式生成图的随机生成树的算法?
答案 0 :(得分:6)
自动拼图生成是一种应用,随机优先搜索是一种有用的策略。
假设您希望生成像Sudoku这样的组合拼图的实例。一种方法是生成随机的,完全求解的实例,然后删除数字,只要它们仍然是唯一的解决方案。你如何首先生成随机求解的实例?您从一个空网格开始并应用随机优先求解算法。实际上,通过在 random-first 和 best-first 策略之间切换以选择下一个数字,证明在生成和解决方案中使用相同的代码相当容易尝试。
这正是我们在编写任天堂DS游戏 Zendoku 时所做的,我写了a detailed article about our approach。
另请参阅this answer使用随机Prim's algorithm讨论迷宫生成。
答案 1 :(得分:2)
这恰好是给定随机启发式的最佳优先搜索的实现。
答案 2 :(得分:1)
我不知道您所描述的特定算法是否有名称。听起来有点像simulated annealing。在优化理论中,还有random search的概念,但它确实依赖于评估函数,而您所描述的似乎并不如此。还有这个Bachelor's Thesis by Brodeur and Childs对图搜索的随机算法有一个很好的总结,包括讨论何时可以使用它们。
答案 3 :(得分:0)
听起来你正试图在BFS和DFS之间取得平衡。这出现在游戏编程中,其中使用修剪来缩小宽度,从而可以在深度上花费更多周期。一些示例是迭代加深深度优先搜索和最佳第一搜索。可在此处找到起点:http://en.wikipedia.org/wiki/Alpha-beta_pruning#Other_algorithms
答案 4 :(得分:0)
结帐A*。您可以将启发式函数调整为最适合您数据的任何内容 - 有点像moooeeeep的答案,但有更多细节和维基百科链接。如果你想要一个具有随机性的启发式,那么你可以写一个。
通常图形具有某种结构,并且以结构化方式搜索它们是有意义的(如果您正在寻找路径,那么搜索已经连接到另一个节点的节点是有意义的搜索,而不是可能断开的随机节点。)大多数时候我在有向无环图/ DAG或树上运行这些算法(连接DAG)。如果我的数据中没有任何逻辑结构,我通常不要尝试用它制作图形,然后将图论应用于它。我想这取决于你想要事物的随机性。
祝你好运!