一、分枝限界法

分枝限界法广度优先搜索问题的状态空间树,用剪枝函数(往往是限界函数)进行剪枝,通常求问题的最优解

二、分枝限界法与回溯法的共同点

都是在问题的状态空间树上搜索问题解的算法,都通过活结点表实现。都用约束函数剪去不含答案结点的分枝,用限界函数剪去不含最优解的分枝。

三、分枝限界法与回溯法的区别

(1)求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有可行解;而分枝限界法的求解目标则是找出满足约束条件的一个可行解,或某种意义下的最优解

(2)搜索方式不同:回溯法以深度优先的方式搜索解空间树,而分枝限界法则以广度优先的方式搜索解空间树。

(3)对当前扩展结点的扩展方式不同:回溯法中的每个活结点可能多次成为当前扩展结点,纵深方向扩展其一个儿子,然后再回溯后扩展其他儿子;而分枝限界法中每一个活结点只有一次机会成为扩展结点,一次产生所有孩子结点,自身成为死结点,之后无需再返回该结点处。

四、根据活结点表采用的数据结构不同,分枝限界法分类:

  • 队列式(FIFO)分枝限界法:将活结点表组织成一个队列,按队列的先进先出(FIFO)原则选取下一个结点为当前扩展结点。
  • 堆栈式(LIFO)分枝限界法:将活结点表组织成一个堆栈,按堆栈的后进先出(LIFO)原则选取下一个结点为当前扩展结点。
  • 优先队列式(LC)分枝限界法:将活结点表组织成一个优先队列,并按优先队列中规定的结点优先级选取优先级最高的下一个结点为当前扩展结点。

五、检索方法

  • LC-检索(最小成本检索)

  • D-检索(LIFO检索)

  • FIFO检索

六、15谜问题(定理9-1:判定初始状态是否可以到达目标状态)

  • FIFO、LIFO、LC分枝限界法
  • LC分枝限界法中搜索代价 ^c(x)=f(x)+ ^g(x)
  • 补充题(十五谜问题的LC分支限界法求解,生成的状态空间树)

七、上、下界函数——与最优化问题的目标函数有关

  • ^c(x) 是代价函数c(X)的下界函数
  • u(x) 是代价函数c(X)的上界函数

八、如何用上、下界函数进行剪枝

①(若目标函数取最小值时为最优解)

  • 则用上界变量U记录迄今为止已知的最小代价上界(即迄今为止已知的可行解中目标函数最小值),可以确定最小代价答案结点(最优解)的代价值不会超过U。
  • 对任意结点,若 ^c(X)≥U,则X子树可以剪枝。
  • 为了不至误剪去包含最小代价答案结点的子树,若X代表部分向量,则U=min {u(X)+ε,U};若X是答案结点,则U=min {cost(X),U}。

②(若目标函数取最大值时为最优解)

  • 则用下界变量L记录迄今为止已知的最大代价下界(即迄今为止已知的可行解中目标函数最大值),最大代价答案结点(最优解)的代价值不会小于L。
  • 对任意结点,若 u(X)≤L,则X子树可以剪枝。
  • 为了不至误剪去包含最大代价答案结点的子树,若X代表部分向量,则L=max { ^c(x)-ε,L};若X是答案结点,则L=max {cost(X),L}。

九、带时限的作业排序

  • 前提:作业按时限排序,以便判断是否可行。
  • 画出JSFIFOBB算法(FIFO分枝限界法)实际生成的状态空间树(目标函数为损失最小
  • 从活结点表中选取扩展结点时,应保证扩展结点满足^c<U ,否则剪枝。
  • 扩展结点生成孩子时,应剪去不可行的孩子结点(即:子集内的作业不能在时限内完成)
  • 对于可行的孩子结点,进一步计算其损失下界c和损失上界u。当c<U时生成该结点,否则剪枝。
  • 每生成一个孩子,需同时检查是否要用u更新上界变量值U。
  • 求最优解值(最大作业收益=所有作业收益之和-最优解对应的最小损失)和最优解(入选的作业编号,可变长度解)
  • 课后习题9-2