基本概念
回溯算法是具有限界函数的深度优先搜索。具有系统性、跳跃性。
常用的两种剪枝函数:约束函数、限界函数
解的表现形式
一般回溯算法,可以作为一种系统的搜索方法应用到一类搜索问题当中,这类问题的解由满足事先定义好的某个约束的向量(x1, x2, . . . , xi)组成。这里i是0到n之间的某个整数,其中n是一个取决于问题阐述的常量。在已经提到的两种算法—-3着色和8皇后问题中,i是固定不变的。
基本思想
在回溯法中,解向量中每个xi都属于一个有限的线序集Xi; 因此,回溯算法按词典序考虑笛卡儿积X1×X2 × … × Xn的元素。
算法最初从空向量开始,然后选择X1中最小元素作为x1 ,如果(x1)是一个部分解,算法通过从X2中选择最小的元素作为x2 继续,如果(x1,x2)是一个部分解,那么就包括X3中最小的元素。
一般地,假定算法已经检测到部分解为(x1,x2,…,xj),它然后再去考虑向量v=(x1,x2,…,xj,xj+1)。我们有下面的情况:
1、如果v表示问题的最后解,算法记录下它作为一个解,在仅希望获得一个解时终止或者继续去找出其他解。
2、(向前步骤)。如果v表示一个部分解,算法通过选择集合Xj+2中的最小元素向前。
3、如果v既不是最终的解,也不是部分解,则有两种子情况:
如果从集合Xj+1中还有其他的元素可选择,算法将xj+1置为Xj+1中的下一个
(回溯步骤)。
(1)如果从集合Xj+1中没有更多的元素可选择,算法通过将xj置为Xj中的下一个元素回溯;
(2)如果从集合Xj中仍然没有其他的元素可以选择,算法通过将xj-1置为Xj-1中的下一个元素回溯,依次类推。
必背公式
输入:集合X1,X2,…,Xn.的清楚的或隐含的描述。
输出:解向量v=(x1,x2,…,xi), 0 <= i <= n.
1.v<-()
2.flag<-false
3.advance(1)
4.if flag then output v
5.else output “no solution”
过程 advance(k)
1.for each x ∈Xk
2. xk<-x; 将 xk 加入 v
3. if v为最终解then set flag<-true and exit
4. else if v是部分解then advance(k+1)
5. end for
输入:集合X1,X2,…,Xn.的清楚的或隐含的描述。
输出:解向量v=(x1,x2,…,xi), 0 <=i <= n.
1.v<-()
2.flag<-false
3.k<-1
4.while k >=1
5. while Xk没有被穷举
6. xk<-Xk中的下一个元素;将 xk 加入 v
7. if v 为最终解then set flag<-true
且两个while循环退出
8 else if v 是部分解 then