重复做这样的转换,可以将最初的最优解转化为贪心解,并且不会降低背包的价值,因此这种贪心算法总能获得最优解。5. /1/2 Knapsack problem:具有权重(w1,w2,...wn)及效益值(p1,p2,...pn)的n个物品,
放入到容量为c的背包中,使得放入背包中的物品效益值最大,即max(并满足下面约束条件:
ni1ix*pi)
ni1ix*wic,and xi{0,1,2}1in。
(1) 证明0/1/2背包问题满足最优子结构性质 (7分)。 (2) 定义最优值函数(3)
(3) 给出用动态规划算法求解最优值的递归方程 (5)。
解: (1)权重(w1,w2,...wn)及效益值(p1,p2,...pn)的n个物品,放入到容量为c的背包中。假设(x1,x2,...xn)(xi(0,1,2))是该问题的最优解,
不失一般性,对于子问题(w1,w2,...wn1)及(p1,p2,...pn1)的n-1个物品,及容量
cxnwn,则(x1,x2,...xn1)(xi(0,1,2))是该子问题的最优解。因为:
1)
x*wcxw 即(x,x,...x)为子问题的可行解,由于: x*wx*wxwc x*wcxwi1iinnn112n1nn1i1in1i1ii1iinniinn2)(x1,x2,...xn1)也是该子问题的最优解。否则,假设(y1,y2,...yn1)是该子问题的最优解,那么:
n1i1n1i1n1i1yi*pii1xi*pi,因而
yi*pixnpni1xi*pixnpn,同时,
yi*wixnwnc即(y1,y2,...yn1,xn)是原问题的可行解,这与
n1n1(x1,x2,...xn)是原问题的最优解相矛盾。
所以,0/1/2背包问题满足最优子结构性质,即最优解包含的子问题的解也是最优的
(2) 定义f(i,y)为物品从i到n,背包容量为y时最优装箱方案对应的效益值 (3) 最优值的递归方程:
0ifwnyf(n,y)pnifwny2wn
2*pify2wnn
f(i1,y)ifwiyf(i,y)max{f(i1,y),f(i1,ywi)pi}ifwiy2wi
max{f(i1,y),f(i1,yw)p,f(i1,y2w)2p}ify2wiiiin
6. 装配线调度问题: 如下图所示,有2个装配线,每一个装配线上有n个装配站,
site[i,j]表示i个装配线上的j个装配站。两个装配线上相同位置的转配站有相同的功能。 在装配站site[i,j]上花费时间为Cost[i,j]。进入和退出装配线i,j的时间分别为in[i,j]和out[i,j]. 从一个装配站到相同装配线的下一个的时间忽略不计,到不同的装配站的时间为transfer[i][j]。利用动态规划算法给出时间最少的装配方案。要求: (1) 定义最优值函数(3) (2) 给出最优值的递归方程 (6) (3) 写出实现递归方程的伪代码 (6)
In(1,i)1,11,21,i-1Cost(1,4)1,iout(1,i)1 n-11nanTr1s((,i)2,12,22,i-1In(2,i)Trans(2,i)S……e2.iCost(2,4)out(2,i)2 n-12n
解: (1) 定义f(i,j)为从初始状态到第i条装配线第j个装配站的所用的最少时间,则初始状态:f(1,1)in(1,1)cost(1,1),
f(1,1)in(2,1)cost(2,1)最终完成时间fmin{f(1,n)out(1,n),f(2,n)out(2,n)}。 下面的结果也同样得满分:
由于从一个装配站到相同装配线的下一个的时间忽略不计,因此只需考虑从初始状态进入装配线的时间及退出装配线的时间,故对所有in[i,j]中j只能为1,对于所有out[i,j],j只能为n,所以上式也可以记为:
f(1,1)in(1)cost(1,1) fmin{f(1,n)out(1),f(2,n)out(2)} f(1,1)in(2)cost(2,1)(2)递归关系:
f(1,j)min{f(1,j1)cost(1,j),f(2,j1)trans(2,j)cost(1,j)}f(2,j)min{f(2,j1)cost(2,j),f(1,j1)trans(1,j)cost(2,j)}
(3)伪代码
f(1,1)in(1)cost(1,1) f(2,1)in(2)cost(2,1)
for j=2 to n do
f(1,j)min{f(1,j1)cost(1,j),f(2,j1)trans(2,j)cost(1,j)} f(2,j)min{f(2,j1)cost(2,j),f(1,j1)trans(1,j)cost(2,j)} End for
Return min{f(1,n)out(1),f(2,n)out(2)}
7. 子集和数问题: 已知n+1个正数:wi, 1in, 和M。要求找出{wi }的所有子集使得子集
内元素之和等于M,用n元组的方法表示解向量,要求: (1) 给出回溯方法求解该问题的两种限界方法(6) (2) 给出利用上述限界条件的回溯法伪代码(9)。
解:用定长元组的方法表示解向量,即(x1,x2,...xn)(xi{0,1})
(1) 两种限界条件分别为: a)
W(i)X(i)W(i)M
i1ik1knb) 将wi按非递减排序
W(i)X(i)W(k1)M
i1k(2)伪代码表示如下:
1) Let s=w(1)x(1)+…+w(k-1)x(k-1)
r=w(k)+…+w(n), assume s+r≥M
2) Expanding left child node
a) If S+W(k)+W(k+1)>M then i.
stop expanding
ii. iii. b) Else i. ii. iii.
r←r-w(k),
Expanding right child node; X(k)←1 , s←s+w(k),
r←r-w(k),let (x(1),…,x(k)) be E-Node;
3) Expanding right child node :
a) If s+rM then stop expanding ; i.Else ,X(k)←0