【问题标题】:Random-first search?随机优先搜索?
【发布时间】:2012-01-16 20:34:35
【问题描述】:

遍历图的两种最常用方法是breadth-first searchdepth-first search。这两种搜索算法都遵循一个共同的模板:

  • 创建工作列表 W,以起始节点 s 为种子。
  • 当工作清单不为空时:
    • 删除工作清单的第一个元素;称之为 v.
    • 如果 v 未被访问:
      • 将 v 标记为已访问。
      • 对于每个直接连接到 v 的节点 u,将 u 添加到 W。

在广度优先搜索中,工作列表 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,那么您将获得一个“随机优先搜索”算法,该算法从初始节点开始随机探索图中的节点。

我的问题是:是否有任何已知算法使用这种类型的搜索?也就是说,是否有算法可以通过以这种方式生成图的随机生成树来工作? p>

【问题讨论】:

  • Maze generation algorithm 上的维基百科文章提到了 DFS 的随机版本。
  • 我很想知道是什么导致你想出这个方案。

标签: algorithm random graph depth-first-search breadth-first-search


【解决方案1】:

自动拼图生成是一种应用程序,其中随机优先搜索是一种有用的策略。

假设您希望生成像Sudoku 这样的组合谜题的实例。一种方法是生成一个随机的、完全解决的实例,然后只要仍有唯一的解决方案就删除数字。您如何首先生成随机解决的实例?您从一个空网格开始并应用 随机优先 求解算法。事实上,通过在 random-firstbest-first 策略之间切换来选择下一个数字,使用相同的代码来生成和求解是相当容易的试试看。

这正是我们在编写 Nintendo DS 游戏时所做的Zendoku,我写了a detailed article about our approach

另请参阅 this answer 讨论使用随机 Prim's algorithm 生成迷宫。

【讨论】:

    【解决方案2】:

    这正是给定随机启发式的最佳优先搜索的实现。

    【讨论】:

      【解决方案3】:

      我不知道您描述的特定算法是否有名称。听起来有点像simulated annealing。在优化理论中,还有random search 的概念,但它确实依赖于评估函数,而您所描述的似乎并不依赖于此。还有这个Bachelor's Thesis by Brodeur and Childs 很好地总结了图搜索的随机算法,包括讨论何时可以使用它们。

      【讨论】:

      • 虽然不错,但这些搜索算法都有些知情,即使是您链接的论文中的算法。我主要对随机且完全不知情的搜索感兴趣。不过谢谢!
      • @templatetypedef - 也许你发现了一种新的搜索算法。这给了你命名权!我可以建议“Bumble around 算法”吗? :)
      【解决方案4】:

      听起来您正试图在 BFS 和 DFS 之间取得平衡。这出现在游戏编程中,其中使用修剪来缩小广度,以便可以在深度上花费更多周期。一些例子是迭代加深深度优先搜索和最佳优先搜索。可以在这里找到起点:http://en.wikipedia.org/wiki/Alpha-beta_pruning#Other_algorithms

      【讨论】:

        【解决方案5】:

        查看A*。您可以将启发式函数调整为最适合您的数据的任何内容 - 有点像 moooeeeep 的答案,但有更多细节和维基百科链接。如果您想要一个具有随机性的启发式,那么您可以编写一个。

        通常,图对它们具有某种结构,以结构化方式搜索它们是有意义的(如果您正在寻找路径,那么搜索连接到您已经连接到另一个节点的节点是有意义的搜索,而不是可能断开连接的随机节点。)大多数时候,我在有向无环图 / DAG 或树(连接 DAG)上运行这些算法。如果我的数据中确实没有任何逻辑结构,我通常不要尝试用它制作图表,然后将图论应用于它。我想这取决于你希望事情有多随机。

        祝你好运!

        【讨论】:

          猜你喜欢
          • 2020-12-27
          • 1970-01-01
          • 2011-01-31
          • 1970-01-01
          • 2021-06-02
          • 1970-01-01
          • 2016-02-16
          • 2012-05-23
          • 1970-01-01
          相关资源
          最近更新 更多