回溯算法: 它可以系统的搜索一个问题的所有解或任意解。它的关键点在于处理空间树问题。空间树中对不符合的节点要进行“剪枝”处理 。
回溯思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树。当探索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该结点出发继续探索下去,如果该结点不包含问题的解,则逐层向其祖先结点回溯。(其实回溯法就是对隐式图的深度优先搜索算法)。 若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。 而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。
解空间树: 主要分为子集树与排列树。子集树(局部性):就是对某一集合对象中选取一部分元素构造问题的最优解。排列树(整体性):对含多个任务的作业进行调度。选出相应的排列顺序,从而构造最优解 。
子集树框架:
void Backpack(int t){ /*x集合元素个数*/
if(t>n){
output(x); /*到达叶子节点,记录状态或输出最终结果*/
}else{
for(int i = 0;i<=1;i++){
x[t] = i; /*二叉树排列*/
}
/*constraint约束函数Bound上界函数*/
if(constraint(t)&&Bound(t)){
Backpack(t+1);
}
}
}
排列树框架:
void Backpack(int t){ /*x作业个数*/
if(t>n){
output(x); /*到达叶子节点,记录状态或输出最终结果*/
}else{
for(int i = t;i<=n;i++){
if(constraint(t)&&Bound(t)){
swap(x[t],x[i]);
Backpack(t+1);
swap(x[i],x[t]);
}
}
}
作业调度:
<