货箱装船问题的简化:
目标函数:装载的集装箱数目
极大化目标函数。
贪心标准:在还没装船的集装箱中选择重量最小的集装箱。
按上述策略,重量最小的集装箱先装,依此类推。
算法:首先按重量从小到大对集装箱排序并依次装入直到超过船的载重量。
上述贪心法产生的解是最优解, 证明如下:
假设所有箱子已经按照重量由轻到重进行排序。
设货箱装船问题的贪心解Z为(z1,…,zn),是(1,1,…,1,0,0,…0)的形式;最优解为(y1,…,yn),其初始形式不是(1,1,…,1,0,0,…0)的形式。
设x是第一个满足“zx = 1且yx = 0”的箱子, 则从Y中选取箱子w,满足w > x且yw=1, 令yx = 1,yw = 0,即从最优解中扔出一个较重的箱子w,放入一个较轻的箱子x,易知这个变化不会使船上箱子的重量之和超过船的载重量。
继续遍历寻找满足“zx=1且yx=0”的箱子x,反复进行上述步骤有限次,将得到贪心解,说明贪心解与最优解等价。
Q:这个操作使得得到的新解真的与之前等价吗,他只是满足不超载的限制而已。
A:等价,因为货箱装船问题只要求得到箱子的总数目最大,上述操作不改变最优解中箱子的总数目,所以每次操作完得到的解从某种意义上说是等价的= =;但在01背包里要求总价值最大。货箱装船是特殊的01背包问题,每个箱子的价值都是1.
而在真正的非连续01背包中,贪心法往往得不到最优解,而选择退而求其次,使用K阶优化算法得到一个误差值有限(100/(k+1)%)的近似解。算法的时间复杂度为O(n^(k+1))。对于连续背包问题,可以证明,按照价值密度排序的贪心算法得到的解是最优解。
证明:
假设所有物品已按价值密度按从大到小进行排序。
最优解X为(x1,x2,x3,…xk,…xn);贪心解Y为(y1,y2,y3,…yk,…yn),其形式为(1,1,1…,1,k,0,…0,0,0),其中0 <= k <= 1.
假设m是满足xi != yi 的最小下标,可知m < k且xm > ym
此时令ym = xm,用X的后面部分等体积地与之交换,因为后面部分物体的价值密度一定更小,所以交换后得到的是一个更优的解,这与X是最优解矛盾,所以不存在任何一个i,使得xi != yi ,也就是说对每一个i,xi == yi 恒成立。即最优解是且只能是贪心解。