贪心算法的适用的问题

贪心算法适用的问题必须满足两个属性:

(1)   贪心性质:整体的最优解可通过一系列局部最优解达到,并且每次的选择可以依赖以前做出的选择,但不能依赖于以后的选择。

(2)   最优子结构:问题的整体最优解包含着它的子问题的最优解。

贪心算法的基本步骤

(1)   分解:将原问题分解为若干相互独立的阶段。

(2)   解决:对于每一个阶段求局部的最优解。

(3)   合并:将各个阶段的解合并为原问题的解。

适用范围:

贪心算法并不能总求得问题的整体最优解。但对于某些问题,却总能求得整体最优解,这要看问题时什么了。只要能满足贪心算法的两个性质:贪心选择性质和最优子结构性质,贪心算法就可以出色地求出问题的整体最优解。即使某些问题,贪心算法不能求得整体的最优解,贪心算法也能求出大概的整体最优解。如果你的要求不是太高,贪心算法是一个很好的选择。最优子结构性质是比较容易看出来的,但是贪心选择性质就没那么容易了,这个时候需要证明。证明往往使用数学归纳法。

一、贪心算法之汽车加油问题

(一) 问题描述

一辆汽车加满油后可以行驶N千米。旅途中有若干个加油站。指出若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。 给出N,并以数组的形式给出加油站的个数及相邻距离,指出若要使沿途的加油次数最少,设计一个有效的算法,指出应在那些加油站停靠加油。要求:算法执行的速度越快越好。

(二) 问题分析(前提行驶前车里加满油)

对于这个问题我们有以下几种情况:设加油次数为k,每个加油站间距离为a[i];i=0,1,2,3……n

1.始点到终点的距离小于N,则加油次数k=0;

2.始点到终点的距离大于N,

A  加油站间的距离相等,即a[i]=a[j]=L=N,则加油次数最少k=n;

B  加油站间的距离相等,即a[i]=a[j]=L>N,则不可能到达终点;

C  加油站间的距离相等,即a[i]=a[j]=L

D  加油站间的距离不相等,即a[i]!=a[j],则加油次数k通过以下算法求解。

(三)算法描述

贪心算法的基本思想

该题目求加油最少次数,即求最优解的问题,可分成几个步骤,一般来说,每个步骤的最优解不一定是整个问题的最优解,然而对于有些问题,局部贪心可以得到全局的最优解。贪心算法将问题的求解过程看作是一系列选择,从问题的某一个初始解出发,向给定目标推进。推进的每一阶段不是依据某一个固定的递推式,而是在每一个阶段都看上去是一个最优的决策(在一定的标准下)。不断地将问题实例归纳为更小的相似的子问题,并期望做出的局部最优的选择产生一个全局得最优解。

[问题分析]

由于汽车是由始向终点方向开的,我们最大的麻烦就是不知道在哪个加油站加油,可以使我们既可以到达终点又可以使我们加油次数最少。 提出问题是解决的开始.为了着手解决遇到的困难,取得最优方案。我们可以假设不到万不得已我们不加油,即除非我们油箱里的油不足以开到下一个加油站,我们才加一次油。在局部找到一个最优的解。却每加一次油我们可以看作是一个新的起点,用相同的递归方法进行下去。最终将各个阶段的最优解合并为原问题的解得到我们原问题的求解。

二、背包问题

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

物品 A  B  C D E F G

重量 35  30  60  50  40  10  25

价值  10  40  30 50  35  40  30

分析如下

目标函数: ∑pi最大

约束条件是装入的物品总重量不超过背包容量:∑wi<=M( M=150)。

(1)根据贪心的策略,每次挑选价值最大的物品装入背包,得到的结果是否最优?

(2)每次挑选所占重量最小的物品装入是否能得到最优解?

(3)每次选取单位重量价值最大的物品,成为解本题的策略。

值得注意的是,贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法。

贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。

可惜的是,它需要证明后才能真正运用到题目的算法中。

一般来说,贪心算法的证明围绕着:整个问题的最优解一定由在贪心策略中存在的子问题的最优解得来的。

对于背包问题中的3种贪心策略,都是无法成立(无法被证明)的,解释如下:

贪心策略:选取价值最大者。反例:

W=30

物品:A  B  C

重量:28 12 12

价值:30 20 20

根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。

(2)贪心策略:选取重量最小。它的反例与第一种策略的反例差不多。

(3)贪心策略:选取单位重量价值最大的物品。反例:

W=30

物品:A  B  C

重量:28 20 10

价值:28 20 10

根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断,如果选择A,则答案错误。

所以需要说明的是,贪心算法可以与随机化算法一起使用,具体的例子就不再多举了。(因为这一类算法普及性不高,而且技术含量是非常高的,需要通过一些反例确定随机的对象是什么,随机程度如何,但也是不能保证完全正确,只能是极大的几率正确)

贪心算法适用条件_贪心算法问题相关推荐

  1. 贪心算法适用条件_【算法】贪心算法

    概念&&介绍 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解.所以说只有证明局部最优解在全局最优解 ...

  2. 贪心算法适用条件_五大常用算法之三:贪心算法

    一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解. 贪心算法没有固定的算法框架,算法设计的关键 ...

  3. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  4. prim算法适用条件_内部排序算法的比较及应用

    "内部排序包括        插入排序(直接插入排序.折半插入排序.希尔排序),        交换排序(冒泡排序.快速排序),        选择排序(简单选择排序.堆排序),       ...

  5. 匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)

    匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法.换句话说就是,在可以接受的时间内去做匹配. 1. 描述问题 给定2个集合A和B,然后将AB中的元素完成一个连线.(这不就是小时候的连线题么 ...

  6. 算法的优缺点_机器学习算法优缺点 amp; 如何选择

    (点击上方公众号,可快速关注) 转自: 算法与数学之美 主要回顾下几个常用算法的适应场景及其优缺点! 机器学习算法太多了,分类.回归.聚类.推荐.图像识别领域等等,要想找到一个合适算法真的不容易,所以 ...

  7. labuladong 的算法小抄_关于算法笔试的几个套路,一点就透

    以下文章来源于labuladong ,作者labuladong 我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略. 避实就虚 大家也知道,大部分笔试 ...

  8. 银行家算法例题讲解_银行家算法

    死锁常见的题目 定义 所谓死锁,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面.死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用, ...

  9. l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法

    一.BFGS算法 BFGS算法的校正公式: 利用Sherman-Morrison公式可对上式进行变换,得到 令 ,则得到: 二.BGFS算法存在的问题 在BFGS算法中.每次都要存储近似Hesse矩阵 ...

  10. 排序算法java源代码_排序算法汇总(java实现,附源代码)

    整理系统的时候发现了原来写的各种算法的总结,看了一下,大吃一惊,那时候的我还如此用心,具体的算法,有的已经模糊甚至忘记了,看的时候就把内容整理出来,顺便在熟悉一下,以后需要的时候就可以直接过来摘抄了. ...

最新文章

  1. 基本电路元件和特性(1)电阻基础(R)
  2. Spring Cloud Stream 学习小清单
  3. Android为TV端助力 最详细的动画大全,包括如何在代码和在XML中使用
  4. Nginx 日志文件切割
  5. ruby mysql 驱动_windows下Rails安装MySql驱动的配置
  6. .net 页面之间传值的几种方法!(转)
  7. git 修改已提交的 commit
  8. python判断网页密码加密方式_Python模拟网页中javascript加密与验证的相关处理
  9. 光纤收发器的原理及应用_光纤收发器的应用与讲解
  10. MATLAB常用日期和时间函数
  11. 工业富联灯塔工厂白皮书:智能制造里程碑.pdf(附下载链接)
  12. 4个常用的计算机应用软件,信息技术应用--常用计算机工具软件4常用工具软件单元四.pdf...
  13. 解决 sql server 2005 2000 导出 script 脚本 附近有语法错误
  14. java影院座位订票代码_基于jsp的影院订票-JavaEE实现影院订票 - java项目源码
  15. java医疗报销_医疗保险报销流程图(修改后)
  16. 【百度一键分享功能】百度一键分享插件
  17. 卡尔曼滤波估计导弹位置Python代码
  18. 北京某牧场管理企业——牧场智慧管理项目
  19. LeetCode 91~95
  20. 操作系统进程调度算法——吸烟者问题

热门文章

  1. 【SequoiaDB|巨杉数据库】巨杉数据库快速入门
  2. android 打印机 万能驱动,万能打印机驱动专家
  3. 利用MDTools和Hydraw设计专业的液压阀块
  4. 微信小程序解析php,微信小程序解析H5文件方法
  5. wo-mic ,audioRelay设置
  6. c语言system.h头文件下载,c语言头文件大全
  7. iOS 10越狱设备终于有越狱移除工具了!
  8. StarUML3.0.2——超好用的UML画图工具推荐
  9. Flash 第十一章 引导层和遮罩层动画
  10. 海康rtsp视频流媒体服务器搭建(去除flash插件):rtsp > nginx-rtmp > http-flv > flv.js