algorithm - 回溯和暴力搜索之间的区别

标签 algorithm search artificial-intelligence backtracking

我目前正在学习算法类(class),但我在理解暴力搜索和回溯的确切定义时遇到了一些困难。据我了解,以下内容是正确的:

  • 蛮力搜索 (BFS) 是一种算法,它计算问题的所有可能解决方案,然后选择满足要求的解决方案。
  • 显式约束给出每个选择的可能值(例如,选择 1-3 限于 {1, 2},选择 4 限于 {3, 4, 5}, etc.),这决定了搜索的“执行树”是如何形成的。
  • 隐式约束将不同的选择相互关联(例如,选择 2 必须大于选择 1,等等),这在 BFS 中用于删除潜在的解决方案。
  • 回溯 是 BFS 的扩展,其中在每个选择之后评估隐式约束(而不是生成所有解决方案之后) ),这意味着潜在的解决方案可以在“完成”之前被丢弃。

基本上,我想知道的是这是否准确,如果不准确,我将非常感谢您的澄清。提前致谢。

最佳答案

简答:如果我没看错问题,那么你是正确的

就像你说的那样,显式约束 是对每个变量的 的约束,所以xi∈Si。请注意,Si 不必声明为集合。例如,您可以声明 S0 是所有小于 25 的素数的集合。

隐式约束另一方面,是在两个或多个变量上定义的谓词 P(x 1,x2,...,xn)。例如 x23。但它也可以在更多变量(例如三个)上定义。

蛮力搜索 仅考虑显式约束:它分配Si< 中的所有可能值/sub> 到变量 xi 并且这适用于所有 变量。在构建了这样一个配置之后,它会验证是否满足所有隐式约束

另一方面,

回溯 旨在优化此过程。从分配了定义了隐式约束 的所有变量的那一刻起,它就会验证该约束。如果约束失败,则它会立即为其中一个变量分配一个不同的值。优点是,如果例如蛮力已将 2 分配给 x1=2 并将 5 分配给 x2=5,而隐式约束x1> x2失败,则不会给x3赋值,x4,... 只是为了发现这些值的所有配置都失败了。

当然,回溯涉及一些簿记工作:您需要找出在设置特定值时“触发”哪些约束。但是对于很多约束编程问题(例如 SAT),存在有效的算法来做到这一点(使用监视文字等)。此外,像 Gecode 这样的约束编程库也有先进的排队机制,例如首先评估快速约束等。

关于algorithm - 回溯和暴力搜索之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44119627/

相关文章:

javascript - 延迟加载带过滤的项目

algorithm - 伪代码解释器?

android - 在移动平台上使用 SVM 或神经网络哪个更​​有效?

c++ - 跳转到最后一个元素的最大方式数

php - 有什么方法可以更快地提取字符串?

arrays - 如何在 m 排序数组中找到一个元素,其中数组的其余部分为零且未给出 m

lisp - AI中的Lisp: self 修改代码和特定领域的抽象级别

c++ - 有效地随机改组单词序列的位

c - 如何实现Christofides算法中的shortcutting步骤?

正则表达式浏览器搜索?