算法设计思想(2)— 贪婪法

1. 贪婪法定义

贪婪法,又称贪心算法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好的或最优的选择(局部最有利的选择),并以此希望最后堆叠出的结果也是最好或最优的解。

贪婪法的每次决策都以当前情况为基础并根据某个最优原则进行选择,不从整体上考虑其他各种可能的情况。

2. 贪婪法劣势

贪婪法与其他方法最大的不同在于,贪婪法每一步选择完局部最优解之后就确定了,不再进行回溯处理,也就是说,每一个步骤的局部最优解确定以后,就不再修改,直到算法结束。

因为不进行回溯处理,贪婪法只在很少的情况下可以得到真正的最优解,比如最短路径问题、图的最小生成树问题。在大多数情况下,由于选择策略的“短视”,贪婪法会错过真正的最优解,而得不到问题的真正答案。

但是贪婪法简单、高效,省去了为找最优解可能需要的穷举操作,可以得到与最优解比较接近的近似最优解,通常作为其他算法的辅助算法来使用。

3. 设计步骤

贪婪法的基本设计思想有以下三个步骤:

  • 建立对问题精确描述的数学模型,包括定义最优解的模型;
  • 将问题分解为一系列的子问题,同时定义子问题的最优解结构;
  • 应用贪心原则确定每个子问题的局部最优解,并根据最优解的模型,用子问题的局部最优解堆叠出全局最优解。

举个例子:某国发行的货币有 25 分、10 分、5 分和 1 分四种硬币,如果你是售货员且要找给客户 41 分钱的硬币,如何安排才能找给客人的钱既正确且硬币的个数又最少?

这个问题的子问题定义就是从四种币值的硬币中选择一枚,使这个硬币的币值和其他已经选择的硬币的币值总和不超过 41 分钱。

子问题的最优解结构就是在之前的步骤已经选择的硬币再加上当前选择的一枚硬币,当然,选择的策略是贪婪策略,即在币值总和不超过 41 的前提下选择币值最大的那种硬币。按照这个策略,第一步会选择 25 分的硬币一枚,第二步会选择 10 分的硬币一枚,第三步会选择 5 分的硬币一枚,第四步会选择 1 分的硬币一枚,总共需要 4 枚硬币。

上面的例子得到的确实是一个最优解,但是很多情况下贪婪法都不能得到最优解。同样以找零钱为例,假如,某国货币发行为 25 分、20 分、5 分和 1 分四种硬币,这时候找 41 分钱的最优策略是 2 枚 20 分的硬币加上 1 枚 1 分硬币,一共 3 枚硬币,但是用贪婪法得到的结果却是 1 枚 25 分硬币、3 枚 5 分硬币和 1 枚 1 分硬币,一共 5 枚硬币。

4. 实例

贪婪法的经典例子—— 0-1 背包问题:有 N 件物品和一个承重为 C 的背包(也可定义为体积),每件物品的重量是 wi,价值是 pi,求解将哪几件物品装入背包可使这些物品在重量总和不超过 C 的情况下价值总和最大。

背包问题(Knapsack Problem)是此类组合优化的 NP 完全问题的统称,如货箱装载问题、货船载物问题等,因问题最初来源于如何选择最合适的物品装在背包中而得名,这个问题隐含了一个条件,每个物品只有一件,也就是限定每件物品只能选择 0 个或 1 个,因此又被称为 0-1 背包问题。

来看一个具体的例子,有一个背包,最多能承载重量为 C=150 的物品,现在有 7 个物品(物品不能分割成任意大小),编号为 1~7,重量分别是 wi=[35,30,60,50,40,10,25],价值分别是 pi=[10,40,30,50,35,40,30],现在从这 7 个物品中选择一个或多个装入背包,要求在物品总重量不超过 C 的前提下,所装入的物品总价值最高。

常见的贪婪策略:

  1. 根据物品价值选择,每次都选价值最高的物品;
  2. 根据物品重量选择,每次都选择重量最轻的物品;
  3. 定义一个价值密度的概念,每次选择都选价值密度最高的物品,物品的价值密度 si 定义为 pi/wi;
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值