一、状态空间树——描述问题解空间的树形结构

  • 问题状态:树中每个结点
  • 解状态:若从根到树中某个状态的路径代表一个候选解元组,则该状态为解状态。
  • 答案状态:若从根到某个解状态的路径代表一个可行解元组,则该解状态为答案状态。
  • 最优答案结点:如果求解的是最优化问题,还要用目标函数衡量每个答案结点,找出其中目标函数取最优值的最优答案结点。

二、穷举法

  • 使用深度优先广度优先搜索方法,检查状态空间树中每个问题状态
  • 如果是解状态则用判定函数判定它是否是答案结点;
  • 对于最优化问题,搜索过程中还需对每个答案结点计算其目标函数值,记录下其中最优者

——这种遍历状态空间树的求解方法是问题求解的穷举法

回溯法与穷举搜索不同:回溯法使用约束函数,剪去那些可以断定不含答案状态的子树,从而提高算法效率。回溯法适用于解一些组合数相当大的问题

三、回溯法

采用深度优先产生状态空间树的结点,并使用剪枝函数的方法称为——回溯法。

  • 在求解的过程中,以深度优先方式逐个生成状态空间树中结点,求问题的可行解最优解
  • 为提高搜索效率,在搜索过程中用约束函数限界函数(统称剪枝函数)来剪去不必要搜索的子树,减少问题求解所需实际生成的状态空间树结点数,从而避免无效搜索。

剪枝函数(约束函数、限界函数)——可以剪去不必要搜索的子树,压缩问题求解所需要实际生成的状态空间树的结点。

  • 约束函数——剪去不含答案状态(可行解)的子树
  • 限界函数——剪去不含最优答案结点(最优解)的子树

约束函数(显式约束、隐式约束)

  • 显示约束——规定了所有可能的元组,组成问题的候选解集(解空间)

    • 排列树——用于确定n个元素的排列满足某些性质的状态空间树,一般有n!个叶结点(解状态)。
    • 子集树——从n个元素的集合中找出满足某些性质的子集的状态空间树,一般有2^n个解状态。
  • 隐式约束——给出了判定一个候选解是否为可行解的条件。

回溯法和分支限界法都是通过搜索问题的状态空间树求解。

四、蒙特卡洛方法

用蒙特卡罗(Monte Carlo)方法估计回溯法处理实例时,实际生成的结点数:

  • 在状态空间树中,从根开始随机选择一条路径(x0,x1,…,xn-1);
  • 假定搜索树中这条随机选出的路径上,代表部分向量(x0,x1,…,xk-1)的结点X处不受限制的孩子数目,和其他路径上与X同层的的结点不受限制的孩子数目一样,都是mk;
  • 则可以估计整个状态空间树上实际生成的结点数为: m=1+m0+m0m1+m0m1m2+…

五、n-皇后问题

  • 算法思想和程序实现
  • 显式约束、隐式约束条件,显式约束对应的状态空间树
  • Monte Carlo算法估计实际生成的状态空间树结点数
  • 补充题(蒙特卡罗方法)

六、子集和数(画出状态空间树)

  • (可变长度解、固定长度解)对应的状态空间树不同(P183-184)
  • 约束函数定义
  • 课后习题8-2(固定长度解元组)

七、图的着色——四色定理(四种颜色可对地图着色)

  • 以深度优先方式生成状态空间树中的结点,寻找所有答案结点,即m-着色方案。
  • 搜索中使用约束函数剪去不可能包含答案结点的分枝。
  • 对给定的无向图G和m,列出图中结点所有可能的m-着色方案。

总时间复杂度O(nm^n)

八、哈密顿环——课后习题8-10

连通图G=(V,E)中的一个回路,经过图中每个顶点,且只经过一次。

一个哈密顿环就是从某个结点v0开始,沿着图G的n条边环行的一条路径(v0,v1,…,vn-1,vn)。

  • 除v0=vn外,路径上其余结点各不相同。
  • (vi,vi+1) ∈E (0≤i<n)。
  • 它访问图中每个结点且仅访问一次,最后返回开始结点。