回溯和暴力搜索之间的差异

时间:2017-05-22 18:21:40

标签: algorithm search artificial-intelligence backtracking

我目前正在学习算法课程,而且我很难理解蛮力搜索和回溯的确切定义。据我了解,以下情况属实:

  • 强力搜索 BFS )是一种算法,可以计算问题的每个可能解决方案,然后选择满足要求的解决方案。
  • 显式约束为每个选项提供了可能的值(例如,选项1-3仅限于{1, 2},选项4仅限于{3, 4, 5}等),它决定了搜索的“执行树”的形状。
  • 隐式约束将不同的选择与彼此联系起来(例如,选项2必须大于选择1等),这在BFS中用于删除潜在的解决方案。
  • 回溯是BFS的扩展,其中隐式约束在每次选择后进行评估(与之后 生成所有解决方案相反) ),这意味着潜在的解决方案可以在“完成”之前被丢弃。

基本上,我只是想知道这是否准确,如果不是,我真的很感激一些澄清。提前谢谢。

1 个答案:

答案 0 :(得分:7)

简短回答:如果我正确阅读了问题,那么正确

好像你说 显式约束 是每个变量的的约束所以 x i ∈S<子> I 的。请注意, S i 不必声明为集合。例如,您可以声明 S 0 是小于25的所有素数的集合。

另一方面,

隐式约束 是在两个或更多变量上定义的谓词 P(x 1 中,x <子> 2 ,...,X <子>名词。例如 x 2 &lt; x 3 。但它也可以在更多变量上定义(例如三个)。

暴力搜索 仅考虑显式约束:它从 S i <分配所有可能的值/ sub> 到变量 x i ,这个用于所有变量。在构建了这样的配置之后,它会验证是否满足所有隐式约束

另一方面,

Bactracking 旨在优化此流程。从指定了定义隐式约束的所有变量的那一刻起,它就会验证该约束。如果约束失败,则它立即为其中一个变量分配不同的值。优点是,例如,如果蛮力已将2分配给 x 1 = 2 且5分配给 x 2 = 5 ,以及隐式约束 x 1 &gt; x 2 失败,然后它不会将值赋给 x 3 ,x 4 ,... 只是发现对于这些值的所有配置都失败了。

当然,回溯中涉及一些簿记:你需要找出哪些约束&#34; fire&#34;当设置某个值时。但是对于许多约束编程问题(例如SAT),存在有效的算法(使用监视文字等)。此外, Gecode 等约束编程库也具有高级排队机制,以便首先评估快速约束,等等。