一,贪心算法的设计思想
•从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解。当达到某算法中的某一步不需要再继续前进时,算法停止。
二,贪心算法的基本性质
1)贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心法与动态规划法的主要区别。
2)最优子结构性质
该问题解的整体最优性依赖于其局部子问题解的最优性。这种性质是可以采用贪心算法解决问题的关键特征。例如,活动安排问题,在选择了一项活动后,它必须是最优的,否则不能得到全局的最优。
三,贪心算法的适用性
•贪心算法对问题只需考虑当前局部信息就要做出决策,也就是说使用贪心算法的前提是“局部最优策略能导致产生全局最优解”。
•该算法的适用范围较小,若应用不当,不能保证求得问题的最佳解。更准确的方法是通过数学方法证明问题对贪心策略的选用性。
四,绝对贪心问题
例一:Dijkstra单源最短路径问题(有向图)
(Dijkstra)算法思想
按路径长度递增次序产生最短路径算法:
把V分成两组:
(1)S:已求出最短路径的顶点的集合
(2)V-S=T:尚未确定最短路径的顶点集合
将T中顶点按最短路径递增的次序加入到S中
保证:1)从源点V0到S中各顶点的最短路径长度都不大于从V0到T中任何顶点的最短路径长度
2)每个顶点对应一个距离值
S中顶点:从V0到此顶点的最短路径长度
T中顶点:从V0到此顶点的只包括S中顶点作中间顶点的最短路径长度
依据:可以证明V0到T中顶点Vk的最短路径,或是从V0到Vk的直接路径的权值;或是从V0经S中顶点到Vk的路径权值之和
求最短路径步骤
算法步骤如下:
1. 初使时令 S={V0},T={其余顶点},T中顶点对应的距离值
若存在<V0,Vi>,d(V0,Vi)为<V0,Vi>弧上的权值
若不存在<V0,Vi>,d(V0,Vi)为∝
2. 从T中选取一个其距离值为最小的顶点W且不在S中,加入S
3. 对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值
重复上述步骤2、3,直到S中包含所有顶点,即S=T为止
辅助数组:dist[ ] 存放V0到T中点距离
path[ ]存放已经加入S中点到V0最短路径
例二:Kruskal最小生成树问题(每次选权值最小边,直到生成一个最小生成树)
算法的运行时间为O(nlogn)。
源码:
五,相对贪心问题
例一,取数游戏。
•问题描述
有2个人轮流取2n个数中的n个数,取数之和大者为胜。设计算法,让先取数者获胜,模拟取数过程。
•问题分析
这个游戏一般假设取数者只能看到2n个数中两边的数(第一次取时,能看到6,5则取6),用贪心算法的情况:
•例如
若一组数据为:6,16,27,6,12,9,2,11,6,5
用贪心策略每次两人都取两边的数中较大的一个数,先取者胜.以A先取为例:
取数结果为:
A6,27,12,5,11=61胜
B16,6,9,6,2=39
•但若选另一组数据:16,27,7,12,9,2,11,6
仍都用贪心算法,先取者A败。
取数结果为:
A16,7,9,11=43
B 27,12,6,2=47胜
其实,若我们只能看到两边的数据,则此题无论先取还是后取都无必胜的策略。这时一般的策略是用近似贪心算法。
但若取数者能看到全部2n个数,则此问题可有一些简单的方法,有的虽不能保证所取数的和是最大,但确是一个先取者必胜的策略。
六,动态规划(各个问题包含公共子问题)
1)最优决策原理:要求问题具有最优子结构(即最优解包含子问题的最优解),是一种自底向上的求解思路,与递归正好相反,每次求解到一个阶段时,该阶段求解所依赖的子问题已经完全求解完毕,因此每一步的求解都是在直到全部所需信息的情况下进行的,因此可以得到全局最优解。
2)动态规划的决策过程:最优决策是在最后阶段形成的,然后向前倒推,直到初始阶段;而决策的具体结果及所产生的状态转移,却是由初始阶段开始进行计算的,然后向后递归或迭代,直到最终结果。
3)适用条件
任何思想方法都有一定的局限性,超出了特定条件,它就失去了作用。同样,动态规划也并不是万能的。适用动态规划的问题必须满足最优化原理和无后效性。
1.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。一个问题满足最优化原理又称其具有最优子结构性质。
2.无后效性:将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。
3.子问题的重叠性:动态规划将原来具有指数级复杂度的搜索算法改进成了具有多项式时间的算法。其中的关键在于解决冗余,这是动态规划算法的根本目的。 动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其它的算法
例题:著名的货郎担(旅行售货商)问题
详细解答参见博文------货郎担(旅行售货商)
七,回溯
1)设计思想
回溯与分支限界技术实际上都是基于穷举方法的,即按照一定规律,把问题所有可能的解组织成某种树结构,形成可能的解空间树或状态空间树。然后按照具体问题的约束条件,通过各种搜索策略,遍历可能的解空间树。从而得到满足问题条件的解或最优解。两种算法设计思路相近、本质一致。
2)回溯与分支限界法解决实际问题,大致可分为四个环节:
(1)确定问题的可能解空间,相当于找出进行穷举的搜索范围。
(2)以一种便于搜索的方式组织所有的可能解,一般是生成可能解空间树。
(3)以某种方式搜索可能的解空间树,有两种基本搜索方式。即:深度优先搜索方式和,这就是回溯技术;广度优先搜索,就是分支限界技术。
(4)在搜索过程中利用判定函数,也称为限界函数,通过“剪枝”来加速搜索过程。
3)回溯法的设计原理
按照深度优先搜索的方式,从根结点出发搜索状态空间树。
• 每搜索到达状态空间树的一个扩展结点,总是先判断以该结点为根的子树是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的进一步搜索,该结点成为一个死结点,同时应向上层回溯至最近的一个活动结点。再以该活动结点作为当前新的扩展结点。以这种方式递归地在解空间中搜索,直至找到问题的解,或者解空间中已无活动结点为止,即此问题无解。
• 在回溯法中,为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数来处死那些实际上不可能产生所需解的活动结点,以减少问题的计算量。所以,回溯法应是具有限界函数的深度优先搜索法。
用回溯法解题时,常遇到两类典型的解空间树,子集树与排列树。
例题:著名的八皇后问题
详细解答参见博文------八皇后问题
八,分支限界(求问题在某种意义下的最优解)
1)分支限界法的设计原理
分支限界法类似于回溯法,也是一种在问题的状态空间树上搜索解的算法。但是,分支限界法与回溯法有不同的求解目标。回溯法的求解目标是找出状态空间树中的所有回答结点或任一回答结点,分支限界法的求解目标则是找出使得某一目标函数达到极小或极大的一个问题结点。
2)分支限界法与回溯法有两点不同:
(1)求解目标不同。回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解或最优解。
(2)搜索方式不同。回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。
3)常见的两种分支限界法
(1)队列式(FIFO)分支限界法
按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。
(2)优先队列式分支限界法
按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。
4)常见问题
装箱问题、布线问题、单源最短路径问题、最大团问题、0-1背包问题、旅行售货问题
分享到:
相关推荐
在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...
下面将详细讲解标题和描述中提及的八种算法设计方法:蛮力法、分治法、动态规划、贪心算法、分支限界法、回溯法、近似算法以及减制法。 1. **蛮力法(Brute Force)**: 蛮力法是最直观的解决问题的方法,通常通过...
这个问题可以使用多种算法来解决,包括动态规划法、贪心算法、回溯法和分支限界法。下面分别详细介绍这四种方法。 1. **动态规划法**: 动态规划法是解决0-1背包问题的常用方法。基本思想是通过构建一个二维数组`c...
本资源包含了0-1背包问题的最佳所有解法,其中包括动态规划算法,回溯法算法,分支限界算法和贪心算法。包含源代码。
在本实验报告中,我们探讨了三种主要的算法——贪心算法、回溯法和分支限界法,并通过具体的实例展示了它们的应用。首先,我们关注的是0-1背包问题和背包问题,这两种都是经典的组合优化问题,旨在找到最大化价值的...
基于深度优先算法、广度优先算法、动态规划、分支限界法、回溯法、贪心算法解决TSP问题python源码.zip基于深度优先算法、广度优先算法、动态规划、分支限界法、回溯法、贪心算法解决TSP问题python源码.zip基于深度...
本实验的主要任务是使用蛮力法、动态规划法、回溯法以及分支限界法这四种算法来求解0/1背包问题,并对比它们之间的差异。 #### 二、所用算法的基本思想及复杂度分析 ##### 1. 蛮力法求解0/1背包问题 **基本思想:...
在算法设计中很经典的几个算法 包括分支限界法 分治法 动态规划 贪心算法 回溯法 其中包括算法的应用 代码实现 如马踏棋盘、迷宫问题、八皇后问题、0—1背包问题,其中实现了0—1背包问题的各个算法的实现
本资料包涵盖了六种重要的高级算法:拓扑排序、分支限界法、回溯法、基数算法、贪心算法以及图的基本算法。下面将逐一详细阐述这些算法的核心思想及其应用。 1. **拓扑排序**:拓扑排序是一种对有向无环图(DAG)...
基于多种常见算法实现动态规划项目c++源码+详细注释(回溯、贪心、递归、分支限界、分治等算法).zip基于多种常见算法实现动态规划项目c++源码+详细注释(回溯、贪心、递归、分支限界、分治等算法).zip基于多种常见算法...
其次,动态规划是一种通过构建模型和状态转移方程来解决问题的方法。它通常用于优化问题,如最短路径、背包问题和最长公共子序列等。动态规划的核心思想是记忆化,避免重复计算,通过存储之前计算过的结果来提高效率...
本文为博主基于课堂ppt以及自行编写的代码整理的研究生《算法设计与分析》课程笔记,涉及分治算法、动态规划算法、贪心算法、回溯算法、分支限界法。总结了各类算法的思想和基本解题思路,以及对应的经典题目,适合...
动态规划通过构建一个二维数组,其中的每个元素表示在当前背包容量下能够获得的最大价值。状态转移方程可以表示为:`dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])`,其中`i`表示考虑第`i`个物品,`j`表示...
本文主要总结了五大常用算法,包括分治法、回溯法、分治限界法、贪心算法以及动态规划法。 1. 分治法(Recurrence and Divide-Conquer) 分治法是一种将大问题分解为小问题进行解决的策略。它适用于可以分解成独立...
用贪心法、回溯法、分支限界法对比分析装载问题。分析各算法的特性。
回溯法、分支界限法和贪心法是计算机科学中解决优化问题的三种重要策略,它们在算法设计和复杂问题求解中占有重要地位。下面将详细介绍这些算法及其应用场景。 一、回溯法 回溯法是一种试探性的解决问题的方法,...
实验二 用动态规划法求解0/1背包问题 实验三 用贪心算法求解Prim算法 实验四 用回溯法求解N后问题 实验五 用分支限界法实现旅行售货员问题 这些实验的大部分源代码都是书上的, 我用的是WindowsXP SP2 VisualC++6.0...
分支限界法、回溯法、贪心算法求解01背包python源码.zip分支限界法、回溯法、贪心算法求解01背包python源码.zip分支限界法、回溯法、贪心算法求解01背包python源码.zip分支限界法、回溯法、贪心算法求解01背包python...
动态规划 贪心算法 回溯法 分支限界法动态规划 贪心算法 回溯法 分支限界法动态规划 贪心算法 回溯法 分支限界法
本资源汇集了动态规划、分治法、贪心法、回溯法四种算法的练习题,涵盖了矩阵连乘、最长公共子序列、背包问题、最大子段和、递归与分治法、Fibonacci 数列、全排列问题、棋盘覆盖问题、线性时间选择和循环赛日程表等...