背包问题模型求解


1.模型

设有 n n n 种物品,每种物品数量无限。第 i i i 种物品每件重量为 w i w_i wi ,每件价值 为 c i c_i ci 。现有一只可装载重量为 w w w 的背包,求各种物品应各取多少件放入背包,使背包中物品的价值最高。这个问题可以用整数规划模型来描述。设第 i i i 种物品取 x i x_i xi 件( i = 1 , 2 , … , n i =1, 2, …, n i=1,2,,n x i x_i xi 为非负整数),背包中物品的价值为 z z z ,则
M a x z = c 1 x 1 + c 2 x 2 + ⋯ + c n x n s . t .   w 1 x 1 + w 2 x 2 + ⋯ + w n x n ≤ w x 1 , x 2 , ⋯   , x n 为正整数 Max z=c_1x_1+c_2x_2+\cdots +c_nx_n\\ s.t.\ w_1x_1+w_2x_2+\cdots+w_nx_n\leq w\\ x_1,x_2,\cdots,x_n为正整数 Maxz=c1x1+c2x2++cnxns.t. w1x1+w2x2++wnxnwx1,x2,,xn为正整数
(1)状态变量 x k x_k xk:第 k k k次装载时背包还可以装载的重量。
(2)阶段 k k k:第 k k k次装载第 k k k种物品( k = 1 , 2 , … , n k=1,2,…,n k=1,2,,n)。
(3)决策变量 d k d_k dk:第 k k k次装载第 k k k种物品的件数。
(4)决策允许集合: D k ( x k ) = { d k ∣ 0 ≤ d k ≤ x k / w k , d k 为整数 } D_k(x_k)= \left\{d_k|0\leq d_k\leq x_k/w_k,d_k为整数\right\} Dk(xk)={dk∣0dkxk/wkdk为整数}
(5)状态转移方程: x k + 1 = x k − w k d k x_{k+1}=x_k-w_kd_k xk+1=xkwkdk
(6)阶段指标: v k = c k d k v_k=c_kd_k vk=ckdk
(7)递推方程: f k ( x k ) = m a x   { c k d k + f k + 1 ( x k + 1 ) } = m a x { c k d k + f k + 1 ( x k − w k d k ) } f_k(x_k) = max\ \left\{c_kd_k+f_{k+1}(x_{k+1})\right\}= max \left\{c_kd_k+f_{k+1}(x_k-w_kd_k)\right\} fk(xk)=max {ckdk+fk+1(xk+1)}=max{ckdk+fk+1(xkwkdk)}
(8)终端条件: f n + 1 ( x n + 1 ) = 0 f_{n+1}(x_{n+1})=0 fn+1(xn+1)=0

2.示例

在这里插入图片描述
f 3 ( x 3 ) = max ⁡ 0 ≤ d 3 ≤ x 3 / w 3 { c 3 d 3 + f 4 ( x 4 ) } = max ⁡ 0 ≤ d 3 ≤ x 3 / w 3 { 30 d 3 } f_3\left(x_3\right)=\max _{0 \leq d_3 \leq x_3 / w_3}\left\{c_3 d_3+f_4\left(x_4\right)\right\}=\max_{0\leq d_3\leq x_3/w_3}\left\{30d_3\right\} f3(x3)=0d3x3/w3max{c3d3+f4(x4)}=0d3x3/w3max{30d3}
列出 f 3 ( x 3 ) f_3(x_3) f3(x3)的数值表:
在这里插入图片描述
对于 k = 2 k=2 k=2
f 2 ( x 2 ) = max ⁡ 0 ≤ d 2 ≤ x 2 / w 2 { c 2 d 2 + f 3 ( x 3 ) } = max ⁡ 0 ≤ d 2 ≤ x 2 / 3 { 80 d 2 + f 3 ( x 2 − 3 d 2 ) } \begin{aligned} f_2\left(x_2\right) & =\max _{0 \leq d_2 \leq x_2 / w_2}\left\{c_2 d_2+f_3\left(x_3\right)\right\} \\ & =\max _{0 \leq d_2 \leq x_2 / 3}\left\{80 d_2+f_3\left(x_2-3 d_2\right)\right\} \end{aligned} f2(x2)=0d2x2/w2max{c2d2+f3(x3)}=0d2x2/3max{80d2+f3(x23d2)}
列出 f 2 ( x 2 ) f_2(x_2) f2(x2)的数值表
在这里插入图片描述
对于 k = 1 k=1 k=1
f 1 ( x 1 ) = max ⁡ 0 ≤ d 1 ≤ x 1 / w 1 { c 1 d 1 + f 2 ( x 2 ) } = max ⁡ 0 ≤ d 1 ≤ x 1 / 2 { 65 d 1 + f 2 ( x 1 − 2 d 1 ) } \begin{aligned} f_1\left(x_1\right) & =\max _{0 \leq d_1 \leq x_1 / w_1}\left\{c_1 d_1+f_2\left(x_2\right)\right\} \\ & =\max _{0 \leq d_1 \leq x_1 / 2}\left\{65 d_1+f_2\left(x_1-2 d_1\right)\right\} \end{aligned} f1(x1)=0d1x1/w1max{c1d1+f2(x2)}=0d1x1/2max{65d1+f2(x12d1)}
在这里插入图片描述
由于 x 1 = 5 x_1= 5 x1=5,由 f 1 ( x 1 ) f_1(x_1) f1(x1) f 2 ( x 2 ) f_2(x_2) f2(x2) f 3 ( x 3 ) f_3(x_3) f3(x3)
经回溯可得: d 1 ∗ = 2 , x 2 = x 1 − 2 d 1 = 1 , d 2 ∗ = 0 , x 3 = x 2 − 3 d 2 = 1 , d 3 ∗ = 1 , x 4 = x 3 − d 3 = 0 d_1^* = 2,\\ x_2 = x_1-2d_1 = 1,d_2^* = 0,\\ x_3 = x_2-3d_2 = 1,d_3^* = 1,\\ x_4 = x_3- d_3 = 0 d1=2x2=x12d1=1d2=0x3=x23d2=1d3=1x4=x3d3=0
即应取第1种物品2件,第3种物品1件,最高价值为160元,背包无余量。
注: 由 f 1 ( x 1 ) f_1(x_1) f1(x1)的列表可知,若背包容量 w w w 为4、3、2、1时,相应的最优解立即可以得到。

3.用连续变量方法求解

直接用公式求解,注意整数的要求
k = 3 k=3 k=3
f 3 ( x 3 ) = max ⁡ 0 ≤ d 3 ≤ x 3 / w 3 { c 3 d 3 + f 4 ( x 4 ) } = max ⁡ 0 ≤ d 3 ≤ x 3 / w 3 { 30 d 3 } = 30 x 3 d 3 ∗ = x 3 \begin{aligned} f_3\left(x_3\right) & =\max _{0 \leq d_3 \leq x_3 / w_3}\left\{c_3 d_3+f_4\left(x_4\right)\right\} \\ & =\max _{0 \leq d_3 \leq x_3 / w_3}\left\{30 d_3\right\} \\ & =30 x_3 \quad d_3^*=x_3 \end{aligned} f3(x3)=0d3x3/w3max{c3d3+f4(x4)}=0d3x3/w3max{30d3}=30x3d3=x3
注:这里 w 3 = 1 w_3=1 w3=1, x 3 x_3 x3 是整数
k = 2 k=2 k=2
f 2 ( x 2 ) = max ⁡ 0 ≤ d 2 ≤ x 2 / w 2 { c 2 d 2 + f 3 ( x 3 ) } = max ⁡ 0 ≤ d 2 ≤ x 2 / 3 { 80 d 2 + f 3 ( x 2 − 3 d 2 ) } = max ⁡ 0 ≤ d 2 ≤ x 2 / 3 { 80 d 2 + 30 ( x 2 − 3 d 2 ) } = 30 x 2 d 2 ∗ = 0 \begin{aligned} f_2\left(x_2\right) & =\max _{0 \leq d_2 \leq x_2 / w_2}\left\{c_2 d_2+f_3\left(x_3\right)\right\} \\ & =\max _{0 \leq d_2 \leq x_2 / 3}\left\{80 d_2+f_3(x_2-3d_2)\right\} \\ &=\max_{0\leq d_2\leq x_2/3}\left\{80d_2+30(x_2-3d_2)\right\}\\ & =30 x_2 \quad d_2^*=0 \end{aligned} f2(x2)=0d2x2/w2max{c2d2+f3(x3)}=0d2x2/3max{80d2+f3(x23d2)}=0d2x2/3max{80d2+30(x23d2)}=30x2d2=0
注:这里 w 2 = 3 w_2=3 w2=3, x 2 x_2 x2 是整数
k = 1 k=1 k=1
f 1 ( x 1 ) = max ⁡ 0 ≤ d 1 ≤ x 1 / w 1 { c 1 d 1 + f 2 ( x 2 ) } = max ⁡ 0 ≤ d 1 ≤ x 1 / 2 { 65 d 1 + f 2 ( x 1 − 2 d 1 ) } = max ⁡ 0 ≤ d 1 ≤ x 1 / 2 { 65 d 1 + 30 ( x 1 − 2 d 1 ) } = 160 d 1 ∗ = [ x 1 2 ] = 2 \begin{aligned} f_1\left(x_1\right) & =\max _{0 \leq d_1 \leq x_1 / w_1}\left\{c_1 d_1+f_2\left(x_2\right)\right\} \\ & =\max _{0 \leq d_1 \leq x_1 / 2}\left\{65 d_1+f_2\left(x_1-2 d_1\right)\right\} \\ & =\max _{0 \leq d_1 \leq x_1 / 2}\left\{65 d_1+30\left(x_1-2 d_1\right)\right\} \\ & =160 \quad d_1^*=\left[\frac{x_1}{2}\right]=2 \end{aligned} f1(x1)=0d1x1/w1max{c1d1+f2(x2)}=0d1x1/2max{65d1+f2(x12d1)}=0d1x1/2max{65d1+30(x12d1)}=160d1=[2x1]=2
注:这里 w 1 = 2 , x 1 = 5 w_1=2, x_1 = 5 w1=2,x1=5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古道西风瘦码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值