Algorithm --贪心算法

版权声明:转载请注明出处 https://blog.csdn.net/weixin_42683993/article/details/89284953

一、概念

  1. 原理:一种启发式策略,在每个决策点作出在当时看来最佳的选择,即总是遵循某种规则,做出局部最优的选择,以推导出全局最优解(局部最优解->全局最优解)
  2. 求解最优化问题的两个关键要素:贪心选择性质+最优子结构
    贪心选择性质:进行选择时,直接做出在当前问题中看来最优的选择,而不必考虑子问题的解;
    最优子结构:如果一个问题的最优解包含其子问题的最优解,则称此问题具有最优子结构性质;
  3. 解题关键:贪心策略的选择
    贪心算法不是对所有问题都能得到整体最优解的,因此选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

二. 算法步骤:

  • 1)有一个以优化方式来求解的问题。 为了构造问题的解决方案,有一个候选的对象的集合C,如活动安排问题中的活动集合E ={1,2,3,…,n}。
  • 2)随着问题求解过程的进行,这个集合将逐步被划分为两个集合: 一个包含已经被考虑过并被选择的候选对象集合S;另一个包含已经被考虑过但被丢弃的候选对象。
  • 3 )有一个函数solution(S)来检查一个所选择的对象集合是否提供了问题的解答。该函数不考虑此时的解决方法是否最优。如活动安排问题中所有活动是否已经被考察。
  • 4)还有一个函数feasible(S)检查是否一个所选对象的集合是可行的,也即是否可能往该集合上添加更多的候选对象以获得一个解。和上一个函数一样,此时不考虑解决方法的最优性。在活动安排问题中,这个函数用来判断所选出的活动之间是否相容。
  • 5)选择函数select ©用来从剩余候选对象集合中,根据当前状态选择出最有希望问题最优解的对象。在在活动安排问题中,选择函数是从剩余活动中选择最早结束的活动。
  • 6)最后,有一个目标函数给出问题解的值,如在活动安排问题中被选择安排的活动数。
    在这里插入图片描述
    其中,选择函数是贪心算法设计的关键,通常与目标函数有关。

三 . 贪心法与动态规划

  • 最优解问题大部分都可以拆分成一个个的子问题,把解空间的遍历视作对子问题树的遍历,则以某种形式对树整个的遍历一遍就可以求出最优解,大部分情况下这是不可行的。
  • 贪心算法和动态规划本质上是对子问题树的一种修剪,两种算法要求问题都具有的一个性质就是子问题最优性(组成最优解的每一个子问题的解,对于这个子问题本身肯定也是最优的)。
  • 动态规划方法代表了这一类问题的一般解法,我们自底向上构造子问题的解,对每一个子树的根,求出下面每一个叶子的值,并且以其中的最优值作为自身的值,其它的值舍弃。
  • 贪心算法是动态规划方法的一个特例,可以证明每一个子树的根的值不取决于下面叶子的值,而只取决于当前问题的状况。换句话说,不需要知道一个节点所有子树的情况,就可以求出这个节点的值。由于贪心算法的这个特性,它对解空间树的遍历不需要自底向上,而只需要自根开始,选择最优的路,一直走到底就可以了。

猜你喜欢

转载自blog.csdn.net/weixin_42683993/article/details/89284953