zoukankan      html  css  js  c++  java
  • 五大常用算法(一) 贪心算法

    一、基本概念

      所谓贪心算法是指,在对问题求解时,总是 做出在当前来看是最好的选择。也就是说,不从整体最优上加以考虑,通过贪心算法做出来的往往是在把 原问题拆分成几个小问题,分别求 每个小问题的最优解,再把这些“局部最优解”叠起来,就作为整个问题 当前 的最优解。

      贪心算法无固定的算法框架,算法设计的关键是贪心策略的选择,必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择贪心策略必须具备 无后效性(即某个状态以后的过程不会影响以前的状态,只与当前状态有关)。

      比如,求 最小生成树的Prim算法 和 Kruskal算法 都是漂亮的贪心算法。

    二、基本思路

    • 建立 数学模型 来描述问题;
    • 把求解的问题分成 若干个子问题
    • 对每个子问题求解,得到 子问题的局部最优解
    • 把子问题的局部最优解 合成 原来问题的一个解。

    三、存在的问题

    • 不能保证求得的最后解是最佳的;
    • 不能用来 求最值 的问题;
    • 只能求 满足某些约束条件 的可行解的范围。

    四、例题分析

      【背包问题】有一个背包,容量是M=150,有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

      物品:A B C D E F G
      重量:35 30 60 50 40 10 25
      价值:10 40 30 50 35 40 30

      题目分析:为了使背包总价值最大,我们可以制定三种策略:

    1. 每次挑选价值最大的物品装入背包;
    2. 每次挑选重量最小的物品装入背包;
    3. 每次挑选单位重量价值最大的物品装入背包;

      策略 1 结果:选择 D B F E 总重量 130 总价值 165;

      策略 2 结果:选择 F G B A E 总重量 140 总价值 155;

      策略 3 结果:选择 F B G D A 总重量 150 总价值 170;

      结果分析:可以看到单位重量价值最大的策略 的结果比其它更好。

      总结:由此可见,策略制定的不同,得到的解也会不同,我们只需要针对不同的问题制定不同的策略即可。

    五、算法的使用前提

    • 原问题复杂度过高;
    • 求全局最优解的数学模型难以建立;
    • 求全局最优解的计算量过大;
    • 没有太大必要一定要求出全局最优解,“比较优”就可以。

    六、分解问题方式

    • 按串行任务分

      时间串行的任务,按子任务来分解,即每一步都是在前一步的基础上再选择当前的最优解。

    • 按规模递减分

      规模较大的复杂问题,可以借助递归思想,分解成一个规模小一点点的问题,循环解决,当最后一步的求解完成后就得到了所谓的“全局最优解”。

    • 按并行任务分

      这种问题的任务不分先后,可能是并行的,可以分别求解后,再按一定的规则(比如某种配比公式)将其组合后得到最终解。

  • 相关阅读:
    年终总结 2016-08-28 22:04 422人阅读 评论(26) 收藏
    [mysql]MySQL Daemon failed to start 2016-08-14 21:27 1121人阅读 评论(18) 收藏
    solrr初步了解 2016-07-31 22:29 380人阅读 评论(4) 收藏
    基于spring-boot的测试桩设计--几种常见的controller
    利用Factory-boy和sqlalchemy来批量生成数据库表数据
    job中shell脚本异常(删除不存在容器),导致job被打断执行的问题 脚本优化方法
    利用Factory-boy来生成实例数据
    pytest相关资源收集
    pytest 用 @pytest.mark.usefixtures("fixtureName")装饰类,可以让执行每个case前,都执行一遍指定的fixture
    pytest fixture 利用 params参数实现用例集合
  • 原文地址:https://www.cnblogs.com/john1015/p/12916277.html
Copyright © 2011-2022 走看看