回溯算法--简单了解

来源:互联网 发布:现代汉语知乎 编辑:程序博客网 时间:2024/06/16 08:35

概念:

        一个大的问题可能有很多小的决策构成,这些小的决策构成的序列就可以称之为一个决策序列。所有的决策序列构成的空间可以称之为解空间。在解空间中满足条件的解称之为可行解,满足最优化条件的解称之为最优解。

        其实就是找出所有的可能的解,然后找出所有满足条件的解。

    

解空间树分为两类树:子集和树,即从一组元素中挑选元素,比如顶和子集问题,那么解空间就是2^n;还有一类就是对元素进行排序,如旅行商问题和4皇后问题。

 回溯法的解题步骤:

1、  确定解空间树

2、  确定易于搜索的解空间结构。

3、  以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效的搜索。

为了提高搜索效率,其一是使用约束函数,剪去不能满足条件的子树;其二是使用限界函数,剪去不能达到最优解的子树。

        约束函数主要用于每一步都有条件的上面;限界函数往往会考虑某种操作的和是否满足条件。比如4皇后问题只有约束条件,因为过程中没有权值的累加等。而旅行商问题就有限界条件,因为涉及到旅行商的花费问题。

因为解空间是一棵树,所以求解的过程中肯定会递归的解决问题,深度优先搜索。

1、旅行商问题

        给出一个带权图,图中的节点表示城市,连线的权值代表从一个城市到另一个城市的代价。一个旅行商选择什么样子的路线才能只经过每个城市一遍,而且所花费的代价最小。这个的解决方案就可以采用回溯法,因为可以列举出所有的路径。比如一共四个城市ABCD,原点城市是A,那么第二个可选择的城市有三种可能,然后依次类推,最终方案有3! = 6种。

有约束函数和限界函数。

 

2、定和子集问题

 给定一个正实数的集合S和一个正实数M,在S中挑出的数字的和能够等于给出的M值。这个的解空间,便是每一个元素出现不出现的组合数。共有2^n次方个元素。

增加了约束条件,即在搜索过程中能否继续下去,要看当前已选择的元素之和加上后面所有元素的和是否能大于M,如果不能,那么继续搜索下去也没有意义。如果能,还要判断当前选择元素的和加上下一个元素的值是否超过了给定的M。要不搜索下去也是在范围之外的。

         函数有三个参数:

         SumSubSet(s,k,r)  s:当前已经选择了的元素之和   k:目前到达的元素序号  r:后面所剩元素的总和。通过不断的递归调用,最终便可以给出所有的可行解。

        

3、4皇后问题/N皇后问题

在4*4的格子里面放四个跳棋,保证每一个棋子都不在同一行,同一列,同一个对角线。求出所有的可能。

最原始的想法就是每一个跳棋都是16种可能的放置方法,然后找出可行解,这种解序列一共有16^4个,数量非常大。

现在缩小一下解空间范围,增加潜在约束条件不在同一行。那么现在每个棋子的放置方式就有四种方式(棋子都是一样的,假设第K个棋子在第K行),那么每一个棋子都有四种可以选择的放置方法。现在解空间大小为4^4个。

如果再把不在同一列作为潜在的解空间限制条件,那么第一个棋子的选择方式有4种,第二个为3中,。。。。。。。现在解空间大小为4!

 

主要是约束条件。N皇后问题的约束条件就是两个点的斜率绝对值不能为1. 然后通过一个while循环,本质上是最外层循环的是行坐标,然后调整列坐标,当行达到最后为n的时候,输出结果。

    
0 0
原创粉丝点击