动态规划(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. 优先队列式分支限界法:优先队列式分支限界法将活结点表组织成一个优先队列,交按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。
分享到:
相关推荐
本文将深入探讨标题"matlab 经典算法集合"所提及的几个重要算法,包括模拟退火、汉密尔顿回路、随机数生成、网络流、线性规划、解方程以及数据分析。 1. **模拟退火算法**:模拟退火是基于物理退火过程的全局优化...
在这个“数据结构几个经典算法及课件及上机作业”压缩包中,我们可以期待找到与数据结构相关的教学材料和实践练习,帮助我们深入理解这个领域的关键概念。 1. **链表**:链表是一种线性数据结构,它的元素在内存中...
【算法赏析:几个经典的算法问题】 在计算机科学中,算法是解决问题的核心工具,它们通过一系列精确的步骤来解决特定的问题。本篇文章将深入探讨五个经典算法:匈牙利算法、八皇后问题、二叉树遍历、希尔排序以及...
在本实验指导书中,我们将探讨以下几个关键的计算机操作系统概念及其实现: 1. **批处理系统的作业调度**: 批处理系统处理一系列预先提交的作业,而非交互式用户请求。在实验二中,学生需要理解作业控制块(JCB)...
学习算法主要包括以下几个方面: - **设计算法**:掌握设计算法的基本策略,这些策略不仅应用于计算机科学,也在其他领域如运筹学、电气工程等中有着广泛的应用。 - **表示算法**:选择适当的表示方法,例如结构化...
本文将围绕“JAVA经典算法30题”这一主题,详细解读其中几个算法的实现逻辑和应用场景,希望能对读者有所启发。 首先,让我们来看第一个经典问题——兔子繁殖问题。这个问题是著名的斐波那契数列问题,即从第三个月...
整体上,《经典算法大全PDF》覆盖了计算机科学中算法的众多领域,从简单的递归问题到复杂的优化算法,每一个算法都有其独特之处和适用场景。了解这些算法不仅有助于提升算法设计能力,而且对于解决实际问题具有非常...
算法中考虑了闰年对天数的影响,通过累加前几个月的天数来得到结果。这个问题考察了日期计算和条件判断的应用。 从这些内容我们可以看出,《C语言经典算法100例》将会涵盖C语言中的各种基本算法,包括循环控制、...
在这个压缩包中,"算法题.doc"很可能包含了各种算法的题目和解题思路,可能包括排序、搜索、图论、动态规划、贪心策略、回溯、分治等经典算法。例如: 1. **排序算法**:包括冒泡排序、选择排序、插入排序、快速...
贪心算法概念 贪心算法概念是指在解决某些优化问题时,使用的一种更简单、更快速的设计技术。这种算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况。 贪心...
本文将深入解析C语言经典算法的几个精选案例,并讨论其在实际编程中的应用价值。 **程序1** 通过一个简单但具有教育意义的问题,向我们展示了如何在C语言中实现基本的排列组合算法。题目要求我们找出所有由数字1、2...
在编程领域,排序算法是计算机科学中的核心概念,尤其是在C#这样的高级编程语言中。排序算法的目的是将一组数据按照特定顺序排列,如升序或降序。本资源"**C#经典排序算法集**"提供了多种已实现并成功运行的经典排序...
描述中提到了几个关键的算法:PageRank、K-Means算法、CART(分类与回归树)以及C4.5和最大期望(EM)算法。这些算法在机器学习领域具有广泛的应用,下面将逐一详细阐述。 1. **PageRank**:这是Google创始人拉里·...
在提供的文件内容中,我们可以识别出几个C语言的算法题目,并提炼出相关的知识点。以下是针对每个算法题目的知识点详细说明: 1. 三个数不重复输出问题: 此题目的要点是编写一个程序,输出1到4之间所有不重复的三...
本文将深入探讨Java编程语言中几个广为流传的算法案例,并分析它们在实际应用中的价值和意义。 首先,让我们聚焦于斐波那契数列,这个数列以数学家莱昂纳多·斐波那契的名字命名,因其在自然界中的广泛分布而闻名。...
设计方案主要分为以下几个部分: 1) 输入/输出模块:设计用户界面,收集用户输入的参数和选择的算法。 2) 算法库:包含各种经典算法的C函数实现,如冒泡排序、快速排序、二分查找等。 3) 执行引擎:调用合适的算法...
在本课程中,你将学习到以下几个方面的内容: 1. 算法分析基础:理解算法与程序的区别和联系,掌握算法实例,并通过数学表述理解算法的渐近性态,包括时间复杂性和空间复杂性。 2. 算法设计技术:包括归纳法...