回溯法基础知识

回溯法是一种选优搜索法,按照选优条件进行深度优先搜索(简单来讲就是遍历)。当搜索进行到某一步时,发现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术称为回溯法,而满足回溯条件的某个状态点称为“回溯点”。

1.算法思想 

 回溯法是从初始状态出发,按照深度优先搜索得到方式,根据产生子节点的条件约束,搜索问题的解。当发现当前结点不满足求解条件时,就回溯,尝试其他路径。回溯法是一种“能进则进,进不了则换,换不了则退”的搜索方法。

2.算法要素 

(1)解空间:

  • 解的组织形式:回溯法解的组织形式可以规范为一个n元组{x1,x2,x3,……,xn},例如一个有三个物品的0-1背包问题,解的组织形式就是:{x1,x2,x3}。
  • 显约束:对解分量的取值范围的限定。例如有三个物品的0-1背包问题,解的组织形式是{x1,x2,x3}。它的解分量 xi 的取值范围很简单,xi 是1 或者 0 表示一个物品是否放入背包。
  • 解空间:顾名思义,就是由所有可能解组成的空间。如图所示:

假设图中每一个点都有可能是我们要的解,这些解就组成了解空间,我们现在要根据问题的约束条件,在解空间中寻找最优解。

  • 解空间越小,搜索效率越高。

(2)解空间的组织结构:

一个解空间通常由很多可能解组成,我们不可能毫无章法,盲目搜索效率很低。我们可以以一定的组织形式表示出来,然后去寻找最优解:这种组织结构就是解空间树:

解空间树只是解空间的形象表示,有利于解题时对搜索过程形象的理解,而不是真正生成一棵树

(3)搜索解空间:

隐约束指对能否得到问题的可行解最优解做出的约束。

如果不满足隐约束,就说明得不到问题的可行解或者是最优解。那就没有必要再沿着该结点的分治继续进行搜索了,相当于把这个分支都剪掉了。因此隐函数也成为剪枝函数,实质上不是剪掉该分支,而是不再搜索该分支。

例如:3个物品的0-1背包问题,如果前2个物品放入后背包超重了,那么就没有必要再考虑第三个物品是否要放入背包了。相当于是剪枝了:

3.剪枝函数 

 隐函数:也称剪枝函数,包括约束函数和限界函数。

对于能否得到问题的可行解的约束称为约束函数,对于能否获得最优解的约束称为限界函数。有了剪枝函数,我们就可以“剪掉”得不到的可行解或者是最优解的分支,避免无效搜索,提高搜索效率。剪枝函数设计的好,搜索效率就高

解空间的大小和剪枝函数的好坏都直接影响搜索效率。

在搜索解空间时,下面几个术语需要说明:

  • 扩展结点:一个正在生成孩子的结点。
  • 活结点:一个自身已生成,但孩子还没有全部生成的结点。
  • 死结点:一个所有孩子都已经生成的结点。
  • 子孙:结点E的子树上所有结点都是E的子孙。
  • 祖宗:从结点E到树根路径上的所有结点都是E的祖宗。
发布了57 篇原创文章 · 获赞 9 · 访问量 3613

猜你喜欢

转载自blog.csdn.net/Jayphone17/article/details/102910824