装箱问题的动态规划算法和渐进ptas
instance:给定n个物体,大小分别为s1,s2,…,sn,将其放进大小为m的箱子里
问,需要的最少的箱子的数目是多少。
可以将这个问题抽象成,给定n个物体都在0,1之间,将其放在大小为1的箱子里,球最少的数目。
1.firstfit
这个算法和内存分配算法类似。
把物体放在第一个能够放下的箱子里,如果前面的箱子都放不下,那么重开一个箱子。显然对于这种算法,有:除了最后一个箱子,其他的箱子都应该是超过半满的。否则,假设有两个箱子都没有半满,那么将这两个箱子倒在一起就行了。
so,we get:
opt>∑isi>(sol−1)2
then:
sol≤2opt
这是对于所有情况都成立的估计。
那么如果所有的箱子都很小呢?假设每个箱子都比γ小,那么只可能有一个箱子里面的东西是小于等于1−γ的,其余的所有箱子都应该比1−γ大,那么就有以下的估计:
opt≥∑isi>(1−γ)×(sol−1)
So:
sol<opt1−γ+1
装箱问题可以由一个NP问题:partition problem归约来,因此这个问题不存在近似度小于3/2的算法。
2.动规
assume:
|{S1,S2,…,sn}=k
which is: there are k groups of the items.
let: s(1),s(2)…,s(k)的数量分别为n1,n2,…,nk,let:N→=(n1,n2,…,nk),I→=(i1,i2,…,ik)
bin(I→)=1+minbin(X→)=1bin(I→−X→)
那么就有一个rounding的算法,将整个n个item分为K组,每组选它最大的元素作为新的问题的一个元素。
显然,如果箱子能够放下新的问题的item,它肯定能放下原来的item,因为新问题的每个item都比原问题的大。
对于新问题利用动态规划的思想可以得到一个解。
we have:
opt<sol
构造另一个问题,将item向下取,而不是向上取,这个是利用数列的知识,需要推导,最终可以得到:
sol≤opt+⌈nk⌉
如果原问题中整个集合中item最大的元素是γ,那么我们有:
opt≥n×γ
So, we have:
solopt≤1+⌈nk⌉opt≤1+2k×γ
3.渐进ptas
我们可以观察到firstfit对于物体小的话效果很好,动态规划对于item大效果很好。
那么一个很自然的算法就是:
1.将大小小于γ的item,denoted as Ismall, Ibig=I−Ismall
2.Ibigrounding to Ifinite
3.动态规划
4.使用fitstfit来装小的item
assume the solution we get is m′, the big item is m,then we have:
m′≤max{m,opt1−γ+1}
这个问题可以这样理解,我们将大的item利用动态规划求出了一个solution m,还有一些小的东西没有放,如果放这些小的item不需要重新开新的箱子,那么最后的结果就是m,如果重新开了新的箱子,那显然这m个箱子都不能放这些小的item了,那么就换另一个角度来看,也就是最多有一个箱子的东西是小于1−γ的,其余所有都是大的,那么这个估计就回到了之前的firstfit估计了。
then we have:
mopt≤1+2k×γ
and we want:
m″≤1+(1+ϵ)opt
choose γ = ε/2 and k = 4/ε2.