贪心算法 待续

核心思想

假设一个问题比较复杂,暂时找不到全局最优解,那么我们可以考虑把原问题拆分成几个小问题(分而治之思想),分别求每个小问题的最优解,将这些局部最优解当作原问题的解,注意: 这样得到的解不一定是原问题全局的最优解
总的来说,可以分为三步
第一步

明确到底什么是最优解

第二步

明确什么是子问题的最优解

第三步

分别求出子问题的最优解再堆叠出全局最优解

例子

有一个背包,最多能承载150斤的重量,现在有7个物品
重量依次为 35,30,60,50,40,10,25
价值依次为 10,40,30,50,35,40,30
应该怎么选择才能使得我们的背包背走最大价值的物品?
我们按照上面的三步来分析:
第一步

问题的最优解是:在重量限制范围内,选择价值最大的物品

第二步
子问题的定义有很多种 ,以下列举三种:
一:认为的局部最优解是:每次都选择当前价值最多的物品
二:认为的局部最优解是:每次都选择当前重量最小的物品
三:认为的局部最优解是:每次都选择当前价值密度最大的物品,也就是物品单位重量的价值:价值/重量

第三步
按照制订的规则(价值最大)进行计算,顺序是:4 2 6 5
最终的总重量是:130
最终的总价值是:165

按照制订的规则(重量最小)进行计算,顺序是:6 7 2 1 5
最终的总重量是:140
最终的总价值是:155

按照制订的规则(单位密度最大)进行计算,顺序是:6 2 7 4 1
最终的总重量是:150
最终的总价值是:170

可以看到,单位密度这个策略比之前的价值策略和重量策略都要好。

贪心算法三个核心问题

一:为什么不直接求原问题的最优解
因为原问题过于复杂,无法直接计算全局最优解

这里总结一下使用贪心算法的前提:

1、原问题复杂度过高,求全局最优解的数学模型难以建立;

2、求全局最优解的计算量过大;没有太大必要一定要求出全局最优解,“比较优”就可以。那么几乎都可以使用贪心算法的思想来解决问题。

二:怎么将原问题分解成小问题

按串行任务分

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

按规模递减分

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

按并行任务分

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

三:怎么判断贪心算法结果是否接近最优解
这个其实没有绝对的判断标准,因为正是因为全局最优解难以计算,所以才选择的贪心算法去求局部最优解,根据计算局部最优解的规则不同,所求的结果也可能有所不同,只能在程序能接受的范围内、以及不同计算规则所得结果来进行取舍

你是故意找茬儿是不是?你要不要吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Janthrven

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值