描述:
回溯法按深度优先搜索 搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数 判断该节点是否可行。如果不可行,则跳过对该节点为根的子树搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。
剪枝函数包括两类:1.使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。
回溯法的实现——————递推和递归
1.递归。
void backtrack(int x){
if(t > n) output(x); //叶子节点,输出结果,x是可行解
else
for(int i = 1; i <= k; i++) //当前节点的所有子节点
{
x[t] = value(i);
if( ) backtrack(); //满足约束条件,则递归到下一层
}
}
2.递推法 (递推迭代法)
void iterativeBacktrack()
{
int t = 1;
while(t > 0){
if(ExistSubNode(t)){ //当前节点存在的子节点
for(int i = 1; i <= k; i++){ //遍历当前节点的所有子节点
x[t] = value(i) //每个节点的值赋给x
if( ) { //判断是否满足约束条件
if(solution(t)) output(x) //得到问题的一个可行解,输出
else t++; //没有得到解,继续向下搜索
}
}
}
else{ //不存在子节点,返回上一层
t–;
}
}
}