- 回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。
具有限界函数的深度优先生成法称为回溯法
- 显性约束:就是对于解空间的分量 x i x_i xi的限定,就是有一定的取值范围
- 隐性约束:对于最终的解空间的剪枝
基本思想
递归回溯
迭代回溯
子集树以及排列树
- 如何理解子集树以及排列树?
- 子集树:就是像0-1背包问题一样,对于每一种物品有选择与不选择两种策略
- 排列树:每一个决策的选择会随着树的深度的增加,逐步-1,也就是选择数目是 n , n − 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ 2 , 1 n,n-1······2,1 n,n−1⋅⋅⋅⋅⋅⋅2,1
0-1背包问题
装载问题(子集树)
- 分析:
- 不剪枝的情况下: O ( n ∗ 2 n ) O(n*2^n) O(n∗2n)
- 对于子集树:搜索右子树是不会超出范围的,但是可能会得不到最优解(得不到当前最优解的就不用继续搜索),对于左子树,要判断是否超出总的空间
批处理作业调度(排列树)
- 分析:
- 代码的重点: x [ i ] x[i] x[i]只会记录当前的最优的排列,关键点还有两个 s w a p ( x [ i ] , x [ j ] ) swap(x[i],x[j]) swap(x[i],x[j])操作