`
eriol
  • 浏览: 400567 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

几个经典算法的概念

阅读更多

动态规划(Dynamic Programming)

 

一、动态规划的基本思想:

      动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。

 

二、设计动态规划法的步骤:

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

2. 递归地定义最优值(写出动态规划方程);

3. 以自底向上的方式计算出最优值;

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

 

      步骤1-3是动态规划算法的基本步骤。在只需要求出最优值的情形,步骤4可以省略,步骤3中记录的信息也较少;若需要求出问题的一个最优解,则必须执行步骤4,步骤3中记录的信息必须足够多以便构造最优解。

 

三、动态规划问题的特征:

     动态规划算法的有效性依赖于问题本身所具有的两个重要性质:最优子结构性质和子问题重叠性质。

1. 最优子结构:当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。

2. 重叠子问题:在用递归算法自顶向下解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。

 

 

回溯法(Backtracking)

 

一、算法思想

      回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。

 

二、算法框架:

1. 问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。

2. 回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。换句话说,这个结点不再是一个活结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。

     运用回溯法解题通常包含以下三个步骤:

(1) 针对所给问题,定义问题的解空间;

(2) 确定易于搜索的解空间结构;

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

3. 递归回溯:由于回溯法是对解空间的深度优先搜索,因此在一般情况下可用递归函数来实现回溯法。

 

 

分治策略(Divide and Conquer)

 

一、算法思想

  任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题规模越小,解题所需的计算时间往往也越少,从而也越容易计算。想解决一个较大的问题,有时是相当困难的。分治法的思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

  分治的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。找出各部分的解,然后把各部分的解组合成整个问题的解。 

 

 

分支限界

 

一、分支限界法:

      分支限界法类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使用某一目标函数值达到极大或极小的解,即在某种意义下的最优解。

      由于求解目标不同,导致分支限界法与回溯法在解空间树T上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。分支限界法的搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。

 

二、分支限界法的基本思想:

      分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有 子集树和 排列树。在搜索问题的解空间树时,分支限界法与回溯法对当前扩展结点所使用的扩展方式不同。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,那些导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。

 

三、选择下一扩展结点的不同方式:

    从活结点表中选择下一扩展结点的不同方式导致不同的分支限界法。最常见的有以下两种方式:

1. 队列式(FIFO)分支限界法:队列式分支限界法将活结点表组织成一个队列,并按队列的先进先出原则选取下一个结点为当前扩展结点。

2. 优先队列式分支限界法:优先队列式分支限界法将活结点表组织成一个优先队列,交按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。 

分享到:
评论

相关推荐

    几个比较著名的哈希算法

    几个比较著名的哈希算法,还有哈希算法的概念以及如何优化哈希值的分布,在日常软件开发中十分有用

    算法特性和基本概念、五个重要的特征、复杂性、六种常用多项式时间算法、各种排序算法比较选择、算法优化的几种常用方法和常用算法分析

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则。通俗点说,就是计算机解题的过程。在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法。前者是推理实现的算法,后者是操作实现的算法。

    排序算法 各种算法的综合

    算法因为涉及树与堆的概念,所以这里不于讨论。 第三部分类似动脑筋。这里的两种算法并不是最好的(甚至有最慢的),但是算法本身比较 奇特,值得参考(编程的角度)。同时也可以让我们从另外的角度来认识这个...

    非数值并行算法- 模拟退火算法9.9.pdf

    
本章介绍组合优化问题和计算复杂性理论的基本概念,并结合几个组合优化的 NP 完全问题实例,介绍其近似算法。 最后,在引入邻域结构概念的基础上,介绍一种通用的近似算法——局部搜索算法。


    数据结构算法

    天籁数学——数列篇(1) 图形图像(1)玩玩图形图像——第一篇:图片灰度化 小爬虫系列(4)玩玩小爬虫——抓取时的几个小细节 玩玩小爬虫——抓取动态页面 玩玩小爬虫——试搭小架构 玩玩小爬虫——入门

    1_2.rar_多峰_多样性 算法_局部寻优算法

    某些实际问题的优化目标是求所有的局部最优解,即求解多峰寻优问题,...仿真实验表明该算法概念清楚,计算简单,具有很好的局部寻优特性,可应用求解于多峰寻优问题.另外还给出了几 个运算实例和与其它优化算法的比较

    组合数学及其算法

    6.2 几个典型的递归关系.. 6.3 用母函数方法求解递归关系 6.4 常系数线性齐次递归关系的求解 6.5 常系数线性非齐次递归关系的求解 6.6 非常系数非线性递归关系的求解 6.7 差分表法 6.8 stirling数 习 ...

    Java常用算法手册源代码

    1.5 一个算法实例 1.5.1 查找数字 1.5.2 创建项目 1.5.3 编译执行 1.6 Java程序的基本结构 1.6.1 类是一个基本单元 1.6.2 main方法 1.6.3 自定义方法 1.6.4 System.out.println的使用 1.6.5 一个简单而完整的程序 ...

    论文研究-基于Pareto最优概念的多目标进化算法研究.pdf

    基于Pareto最优概念的多目标进化算法已成为多目标...详细介绍了该领域的经典算法,重点阐述了各种算法在种群快速收敛并均匀分布于问题的非劣最优域上所采取的策略,并归纳了算法性能评估中需要进一步研究的几个问题。

    算法基础.打开算法之门.[美]托马斯 H.科尔曼(带详细书签)

    如果你能看懂提纲的内容,就应该能够理解我是如何表达每一步算法,以及如何将这些步骤合并在一起组合成一个完整的算法的。如果你听到过如下笑话,那么你已经是在通往算法世界了: 你听说过被困在淋浴中的计算机专家...

    回溯算法介绍与基本实例

    一篇介绍回溯算法概念,思想的文章,并给出了几个基于C的基本实例。

    排序算法是计算机科学中的一个基本且重要的概念

    排序算法是计算机科学中的一个基本且重要的概念,用于将一组数据元素(或记录)按照某种顺序排列。以下是几种常见的排序算法以及它们在C语言中的实现例程: 1.冒泡排序 (Bubble Sort) 冒泡排序是一种简单的排序算法...

    毕业论文算法实现

    虽然毕业多年,但是还有不少关注粗糙集的博友经常交流粗糙集方面的知识和C++代码,特把我毕业论文完整代码上传给大家,希望对...我的论文不是针对算法改进提高效率的,而是提出了几个新的概念,并在此基础上进行推演。

    使用动态优先权的进程调度算法的模拟

    通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。 2、实验内容 (1)用C语言来实现对N个进程采用动态优先算法的进程调度; (2)每个用来标识进程的进程控制块 PCB用结构来描述,包括以下字段: 进程...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    《C/C++常用算法手册》对每一个知识点都给出了相应的算法及应用示例。虽然这些例子都是以C语言来编写的,但是算法并不局限于C语言。如果读者采用其他编程语言,例如C++、C#、VB、Java等,根据其语法格式进行适当的...

    《数据结构》经典算法代码.zip

    相关书籍推荐:为了更深入地理解数据结构,我们推荐了几本经典的教材和参考书籍。这些书籍将帮助你建立完整的数据结构知识体系。 适用人群: 这份学习资料适用于所有大学计算机相关专业的学生,无论你是初学者还是...

    算法导论(part1)

    书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算法、一...

    数据与算法JS描述(高清版).pdf

    在移动浪潮到来之后,用户体验要求越来越高,对前端提出了更高的要求,前端这 个职能,必须提高自身才能继续发展,未来的网页 UI,绝对不是靠几个选择器操作加超链 接就能应付的。越来越复杂的产品和基础库,需要...

    经典遗传算法的Java实现以及遗传算法实现自动组卷.zip

    Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了...

    粒子群优化算法源码下载

    主要体现在以下几个方面:第一、介绍了有关粒子群优化算法的背景知识,阐述了算法产生的基础。 接着讨论了粒子群优化算法的发展和基本原理,并给出了算法的流程。通过对算法公式和参数设置进行的综合分析以及和其它...

Global site tag (gtag.js) - Google Analytics