《算法专题》

搜索问题:

问题的种类:(1)完全可观察的,确定性的;

                                    例如:单一信念状态问题

                         (2)不可观测的的问题;

                                     例如:无传感器(一致性)问题

                         (3)部分可观察/不确定;

                                      例如:应急问题;交错搜索和执行

                           (4)未知状态空间:

                                       例如:勘探问题;执行先行


一、Uninformed search (盲目式搜索):1、Depth-first;/以及相应的迭代加深算法

                                                                     2、Breadth-first;/以及相应的迭代加深算法

                                                                     3、Uniform cost Search(一致代价); 

                                                                    4、Search graphs(搜索图);

二、Informed search(启发式搜索):     1、Greedy search;

                                                                    2、A* search;

                                                                    3、Heuristics(启发式);

                                                                    4、admissibility(可接受性);

(1)BFS(Bread First Search):广度优先搜索;

           描述:是一种最简便的图的搜索算法之一;属于盲目搜索;系统地展开并检查图中的所有节点,换句。话说,该算法不考虑结果可能出现的位置,彻底地搜索整张图,以便找到结果。

           实现:使用数据结构:队列来实现这种搜索方式。

(2)DFS(Depth First Search):深度优先搜索;

            描述:深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

           实现:使用数据结构:栈(stack)来实现这种搜索方式。

  (3)UCS(Uniform Cost Search):一致代价搜索;是完整的和最优的。但是没有关于目标位置的信息。

            描述:在BFS的基础上,一致代价搜索不在扩展深度最浅的节点,而是通过比较路径消耗,并选择当前代价最小的节点进行扩展,因此可以保证无论每一步代价是否一致,都能够找到最优解。

(4)迭代加深搜索:

          基本原理:迭代加深搜索是以DFS为基础的,它限制DFS递归的层数。迭代加深搜索的基本步骤是:1、设置一个固定的深度depth,通常是depth = 1,即只搜索初始状态;2、DFS进行搜索,限制层数为depth,如果找到答案,则结束,如果没有找到答案 则继续下一步;3、如果DFS途中遇到过更深的层,则++depth,并重复2;如果没有遇到,说明搜 索已经结束,没有答案。


(5)Greedy algorithm:贪婪算法;

        基本原理:贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。

贪婪算法所得到的结果往往不是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果。

贪婪算法并没有固定的算法解决框架,算法的关键是贪婪策略的选择,根据不同的问题选择不同的策略。

必须注意的是策略的选择必须具备无后效性,即某个状态的选择不会影响到之前的状态,只与当前状态有关,所以对采用的贪婪的策略一定要仔细分析其是否满足无后效性。

比如前边介绍的最短路径问题(广度优先、狄克斯特拉)都属于贪婪算法,只是在其问题策略的选择上,刚好可以得到最优解。

(6)A*(A-star)算法:Combining UCS and Greedy algorithm;

         基本原理:公式表示为: f(n)=g(n)+h(n),其中 f(n) 是从初始点经由节点n到目标点的估价函数,g(n) 是在状态空间中从初始节点到n节点的实际代价;h(n) 是从n到目标节点最佳路径的估计代价,是启发式函数,很关键,尽量小,A-star最优

保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取:

首先将起始结点S放入OPEN表,CLOSE表置空,算法开始时:      

1、如果OPEN表不为空,从表头取一个结点n,如果为空算法失败。      

2、n是目标解吗?是,找到一个解(继续寻找,或终止算法)。      

3、将n的所有后继结点展开,就是从n可以直接关联的结点(子结点),如果不在CLOSE表中,就将它们放入OPEN表,并把S放入CLOSE表,同时计算每一个后继结点的估价值f(n),将OPEN表按f(x)排序,最小的放在表头,重复算法,回到1。

你可能感兴趣的:(《算法专题》)