我目前正在学习算法课程,而且我很难理解蛮力搜索和回溯的确切定义。据我了解,以下情况属实:
{1, 2}
,选项4仅限于{3, 4, 5}
等),它决定了搜索的“执行树”的形状。基本上,我只是想知道这是否准确,如果不是,我真的很感激一些澄清。提前谢谢。
答案 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 等约束编程库也具有高级排队机制,以便首先评估快速约束,等等。