典型算法概略

递归法

递归中是将原问题分解为一层层的子问题,与分治相似

递归一般需要定义边界条件,即递归的出口,一般为n=1的时候,当满足边界条件时,立即返回结果;当不满足时,层层递归

典型应用:

1.本身是按照递归的方式来定义的,比如某种函数

2.回朔算法本身可以用递归实现的

3.数据结构,如树、图的遍历

分治法

分治法是将问题分解为规模大致相同的子问题,求解子问题,合并子问题的解,最终得原问题的解。

一般都会用到递归算法,典型问题:.二/四分 搜索技术

问题特征:

1.该问题缩小到一定程度就可以很简单的解决   

2.分解出的子问题具有相同的特征         前提

3.可以合并为原问题的解,                    如果不满足,考虑贪心法和动态规划

4.不包含公共子问题                               如果包含,效率会不高

动态规划

a.常常用于求解最优性质问题; 需要具有最优子结构,即原问题的最优解包含子问题的最优解

b.与分治法一部分相似,都是将问题分解为若干子问题,但子问题不是互相独立的。具有重叠,若单纯的递归,部分子问题会被多次计算

c.结果子问题重叠的方法:用一张表保存被计算过的子问题的解,在需要时取出

算法步骤:

1.找出最优解的性质,刻画他的结构特征

2.递归方法定义最优值,写出动态规划的方程

3.以自底向上的方式计算最优值         其中,备忘录方法采用自顶向下法

4.根据计算最优值时得到的信息,构造最优解

典型应用:

最长公共子序列:找出两个序列中的最长公共子序列

0-1背包问题:物品重量w,价值v,背包容量为W,如何选定物品,使背包总价值最大

贪心算法

在每一步选择中都选择采取在当前状态下最好或最优的选择;希望通过问题的局部最优解来得到全局最优解

与动态规划法的比较:

a.动态规划中,每一步的选择依赖于子问题的解,因此是在解出相关子问题之后再做出选择;自底向上求解子问题;    可回退, 一般用于高维问题

b.贪心算法中。仅在当前算法中做出最好选择,自顶向下,一步步缩小问题规模,可得近似值;每一步都直接影响结果,不可回退,一般用于一维问题

算法步骤:

1.构造候选集A,包含问题所有的可能解

2.构造解集S,不断扩大,直到找到最优解

3.检查函数f。检查解集S是否已经是问题的完整解

4.贪心策略select,从候选集A中选择解,通常与目标函数有关

典型应用:

单源最短路径:带权有向图中,求解源到其他各顶点的最短路径长度

最小生成树:无向全通带权图,即一个网络,包含G的所有顶点的树称为生成树,各边权值最小的生成树称为最小生成树。 prim算法、Kruskal算法

回朔算法

a.是一种搜索的一般策略,一般用于遍历,如深度优先搜索

b.需要明确定义一个问题的解空间,确定易于搜索的解空间结构,如一棵怎样的树

c.以深度优先方式搜索,并且使用剪枝函数避免无效搜索

提高搜索效率的优化方法(剪枝策略):

1.用约束函数,在生成扩展结点时就剪去(生成时)

2.限界函数剪去经计算得不到最优解的子树(,搜索时比如部分结点和的费用已经大于当前最优了)

典型应用:

1.树的深度优先搜索

2.旅行商(TSP)问题:有n个城市,商人从某一个城市出发,经过每个城市且只有一次,最后回到出发点,求出最短路径

3.n皇后问题:在n*n的棋盘上,放置n个不可以互相攻击的皇后(不在同一行,同一列,同一斜线),

4.流水作业调度:作业、工序、机器、求时间最短

分支限界算法

以广度优先或最小耗费优先的方式搜索问题的解空间。用队列或优先队列存储活结点。

算法策略:

1.每个活结点只有一次机会成为扩展结点,即只扩展一次
2.在子结点中,判断舍弃不可行解和非最优解,其余的加入活结点列表      使用剪枝策略:限界函数
3.在活结点中取下一结点作为扩展结点,并重复以上过程      选择方式有:先进先出(FIFO);最小耗费/最大收益

与回溯算法比较

a.求解目标不同:回溯算法求解所有满足约束条件的解;                             分支限界算法找出最优解
b.搜索方法:       深度优先                                                                            广度优先
c.存储                  动态产生问题的子空间,保存根节点到扩展结点的路径    队列、优先队列,每个结点只有一次扩展机会

图的搜索算法

深度优先、广度优先



你可能感兴趣的:(人工智能)