# Discrete Optimization (Coursera) week 2-1 贪心算法求解背包问题
在这里首先以背包问题为例子,介绍一下贪心算法。
Greedy Algorithm
贪心算法非常直观,就是每一步都 take local optimum steps。
这可能是最直觉的算法,但是其实可能也是最常用的,最实际的算法。尽管 greedy algorithm往往不能获得 global optimal solution,它却非常容易 implement。在实操中,我们遇到什么问题,不要怕,要勇敢面对它,上来就是拿Greedy一通操作——起码能跑,这就之后给我们的答案提供了一个 baseline:你看,我随便写个算法就有这个performance,之后怎么地也得比这个高才能说我们在进步吧?
不过贪婪也可以玩出花样来的——就knapsack problem为例,可以让策略为:
-
先拿重量最重的
-
先拿价值最高的
-
先拿拿重量小的
-
先拿密度最大的。
这几种不同的策略得到的结果是迥异的。
举个例子:你来到一个宝库前面,但是你只能拿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吧。