Discrete Optimization (Coursera) week 2-1 贪心算法求解背包问题

在这里首先以背包问题为例子,介绍一下贪心算法。

Greedy Algorithm

贪心算法非常直观,就是每一步都 take local optimum steps。

这可能是最直觉的算法,但是其实可能也是最常用的,最实际的算法。尽管 greedy algorithm往往不能获得 global optimal solution,它却非常容易 implement。在实操中,我们遇到什么问题,不要怕,要勇敢面对它,上来就是拿Greedy一通操作——起码能跑,这就之后给我们的答案提供了一个 baseline:你看,我随便写个算法就有这个performance,之后怎么地也得比这个高才能说我们在进步吧?

不过贪婪也可以玩出花样来的——就knapsack problem为例,可以让策略为:

  1. 先拿重量最重的

  2. 先拿价值最高的

  3. 先拿拿重量小的

  4. 先拿密度最大的。

    这几种不同的策略得到的结果是迥异的。

举个例子:你来到一个宝库前面,但是你只能拿10 kg的物品。这个宝库也不大,里面有一个 8kg的物品A,价值 13亿元;一个3kg的物品B,价值7亿元;两个5kg的物品C,价值各10亿元;还有三个2kg的物品D,价值各1亿元。

在这里插入图片描述

如果优先选择最重的:拿Ax1, Dx2,最后得到总价值15亿元;

如果优先选择最贵的:拿Ax1, Dx2,最后得到总价值15亿元;

如果优先选择最轻的:拿Dx3, Bx1,最后得到总价值10亿元;

如果优先选择密度最大的:则首先进行简单的除法,那么A密度 13/8 = 1.625亿元/kg;B密度7/3=2.33亿元/kg;C密度10/5=2亿元/kg;D密度1/2=0.5亿元/kg。因此这种情况下首先选择B,则还剩7kg容量;接下来C的密度最大,选择C,还剩下2kg容量;最后A的密度更大,但是装不下,所以选择Dx2。最后得到Bx1, Cx1, Dx2,总价值18亿元!

可见,即使是贪婪算法,也是有不同的贪婪标准,进而会导致不同的结果的。

不过,贪婪算法通常不会给出最优解,在这个问题中,更优的选择(实际上,也是最优)显然是选择Cx2,得到总价值20亿元。当然,我们能够看到这样一个更好的解是因为sample size很小。在实操中,贪婪算法真的算是蛮不错的方法啦!

那么,有没有可以确定无疑找到最优解的方法呢?有的,当然是有的。不过通常来说,解的quality越高,那么当问题的sample size变大,取得解的时间将会疯狂增长;而一些很naive的方法,虽然一般得到的不会是最优解,甚至比较low quality,但是它们通常求解非常快,不太会随着sample size增大而增大很多。这大概也是 quality and speed的一个trade-off吧。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值