斯坦福 算法2 第六周笔记

来自斯坦福网站的Algorithms: Design and Analysis,与目前coursera上的版本内容没有变化,不过时间安排略有不同。

1. Approximation Algorithms For NP-Complete Problems

1.1 A Greedy Knapsack Heuristic

之前讲到如果需要强解npc问题一般有三种策略:解特殊情况,启发式解法与优化后的指数解法。今天来讲解背包问题的启发式解法。启发式解法在理想情况下也需要保证一定程度的算法正确性。
在这里插入图片描述
第一步:计算每个item的value与weight的比值。
第二步:按比值降序将item装进背包,直到遇到第一个无法继续的item就停止。

但是如果仅有这两步,结果可能会非常差,如下面的例子:
在这里插入图片描述
因此我们还有个第三步,那就是比较第二步的结果与价值最大的item这两个方案,选更好的一个。这三步得到的结果能够保证至少能够得到最优解50%的结果。

为了证明这一点,我们先做一个假设,那就是装作能够将第一个装不进背包的item一部分填进背包,将背包填满。能够先证明在这个假设下得到的结果是大于等于最优结果的。
在这里插入图片描述
上面的例子就是将第一个装不进背包的item的50%也当做能够装进。得到的value是4。对于其大于等于最优结果的证明过程如下:
在这里插入图片描述
大致过程就是先抵消掉此假设的结果与最优的结果下共有的item,剩下的空间内装的item显然是greedy假设下的item密度更高,有更大的总value。

在这个假设得到的贪心结果大于等于最优结果被证明的基础上,来证明刚开始的三步得到的结果大于等于最优解的50%,直接根据连续的不等式即可得到:
在这里插入图片描述
这个方法只能证明至少得到最优解一半的value,而这个一半的结果其实是很贴近的,比如下面的例子就只能得到略大于50%的结果:
在这里插入图片描述
因此如果想要得到不同的上限结果,那么要么就更改算法,要么就对算法的执行做一些限制。如果限制每个item的w都小于总上限的10%,那么就能够得到更高的分析结果:
在这里插入图片描述

1.2 A Dynamic Programming Heuristic for Knapsack

1.2.1 Algorithm

用上面的启发式算法,如果想要得到特定的精度,就需要对item做相应的要求。但是很多时候item没法满足要求,因此我们可以考虑一个能够得到任意精度的近似算法:
在这里插入图片描述
在这个算法之前可以回忆最优的动态规划解法,它的复杂度是 O ( n W ) O(nW) O(nW)。而我们这里希望能够得到一个可以有一点偏差但是更简单的背包问题解法。

相对的,我们可以考虑从每个item的v值出发,最大的value值叫做 v m a x v_{max} vmax,实现一个复杂度为 O ( n 2 v m a x ) O(n^{2}v_{max}) O(n2vmax)的近似动态规划解法。这里如果每个v值是一个较小的整数,那么我们就得到了一个多项式时间的解法。

这里的做法是抛弃掉每个v值的较低位的值(咋想出来的??)。这个解法思路如下:
在这里插入图片描述
这里使用了一个与最优解法不同的问题表现形式,得到了一个不同的递推关系:
在这里插入图片描述
把subproblem表示成只用前i个item时得到大于x的总value需要的最少weight和。接着得到了下面的算法伪代码:
在这里插入图片描述
(总觉得这个思路不太自然。。。)

1.2.2 Analysis

下面证明这个算法能够得到任意精度的解。因为在抛弃v的低位信息时候整除了一个常数m,因此分析的目标就是1)目标精度 ( 1 − ϵ ) (1-\epsilon) (1ϵ)与m之间的关系以及2)将m这个量写到时间复杂度的表示中。

首先用m整除后的结果 v ^ i \widehat{v}_{i} v i

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值