Knapsack Problem ( 背包 问题 )

48
Knapsack Problem ( 背背背背 ) 戴戴戴 20090427

description

戴红伟 20090427. Knapsack Problem ( 背包 问题 ). The Knapsack Problem. Def: 有 N 个物品和一个背包,其中 : 物品具有重量 (w 1 , w 2 , … , w n ) 和价值 (p 1 , p 2 , … , p n ) 背包的最大重量承受限制为 W 如何放置物品可得最高价值 ? 此问题可以表示为如下 :. Knapsack Problem 问题类型. Fractional Knapsack Problem: 物品可以被任意分割 一般采用贪婪算法 (Greedy Approach) - PowerPoint PPT Presentation

Transcript of Knapsack Problem ( 背包 问题 )

Page 1: Knapsack Problem  ( 背包 问题 )

Knapsack Problem ( 背包问题 )

戴红伟20090427

Page 2: Knapsack Problem  ( 背包 问题 )

2

The Knapsack Problem Def: 有 N 个物品和一个背包,其中 :

物品具有重量 (w1, w2, …, wn) 和价值 (p1, p2, …, pn)

背包的最大重量承受限制为 W

如何放置物品可得最高价值 ?

此问题可以表示为如下 :

Page 3: Knapsack Problem  ( 背包 问题 )

3

Fractional Knapsack Problem: 物品可以被任意分割 一般采用贪婪算法 (Greedy Approach)

0/1 Knapsack Problem: 物品不可分割 一般采用动态规划法 (Dynamic Programming)

参考:《算法设计与分析》王红梅 P150

Knapsack Problem 问题类型

Page 4: Knapsack Problem  ( 背包 问题 )

4

其他类型背包问题完全背包问题 (0/1) :

有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。第 i 种物品的费用是 c[i] ,价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

多重背包问题 有 N 种物品和一个容量为 V 的背包。第 i 种物品最多

有 n[i] 件可用,每件费用是 c[i] ,价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

Page 5: Knapsack Problem  ( 背包 问题 )

5

分组背包问题: 有 N 件物品和一个容量为 V 的背包。第 i 件物品的费

用是 c[i] ,价值是 w[i] 。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

有依赖的背包问题: 这种背包问题的物品间存在某种“依赖”的关系。也就

是说, i 依赖于 j ,表示若选物品 i ,则必须选物品 j 。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。

Page 6: Knapsack Problem  ( 背包 问题 )

6

适配背包问题: 有容量为 S 的背包, N 件物品,重量分别为 w1, w2,

…, wn ,从 N 件物品中挑选若干件物品,所选物品之和恰能放入该背包,即所选物品之和等于 S 。

Page 7: Knapsack Problem  ( 背包 问题 )

7

授课内容贪心法求解 最佳装载 背包问题

动态规划法求解 0/1 背包问题

遗传算法求解 0/1 背包问题

Page 8: Knapsack Problem  ( 背包 问题 )

8

贪心法求解 最佳装载 背包问题描述:对于容量为 c 的背包进行装载,从 n 个物品

中选择装入背包的物品,每个物品 i 的重量和价值分别为 wi 和 pi 。在背包中物品的总重量不超过背包容量的前提下,求装入物品价值最高的装载法。

输入: 5 20 // 物品的数量和背包的容量 6 3 // 第一个物品的重量和价值 2 5 //… 3 8 10 6 7 4

Page 9: Knapsack Problem  ( 背包 问题 )

9

输出: 0 1 1 1 0.714286

Page 10: Knapsack Problem  ( 背包 问题 )

10

解题思路 总是对当前问题作最好的选择,也就是局部寻优。

现按物品效益、重量比值升序排列。然后每次选择比值大的物品进行装载,直到背包装满为止。

Page 11: Knapsack Problem  ( 背包 问题 )

11

核心代码// 创建物品信息结构体

Page 12: Knapsack Problem  ( 背包 问题 )

12

Page 13: Knapsack Problem  ( 背包 问题 )

13

Page 14: Knapsack Problem  ( 背包 问题 )

14

转换为价值重量比

Page 15: Knapsack Problem  ( 背包 问题 )

15

2- 动态规划法求解 0/1 背包问题动态规划法设计算法一般分成三个阶段:( 1)分段:将原问题分解为若干个相互重叠的子问题;( 2)分析:分析问题是否满足最优性原理,找出动态规划函数的递推式;( 3)求解:利用递推式自底向上计算,实现动态规划过程。

动态规划法利用问题的最优性原理,以自底向上的方式从子问题的最优解逐步构造出整个问题的最优解。

Page 16: Knapsack Problem  ( 背包 问题 )

16

在 0/1 背包问题中,物品 i 或者被装入背包,或者不被装入背包,设 xi 表示物品 i 装入背包的情况,则当 xi=0

时,表示物品 i 没有被装入背包, xi=1 时,表示物品 i 被装入背包。根据问题的要求,有如下约束条件和目标函数:

)1(}1,0{1

nix

Cxw

i

n

iii (式 2.1 )

n

iii xv

1

max (式 2.2 )

于是,问题归结为寻找一个满足约束条件式 2.1 ,并使目标函数式 2.2达到最大的解向量 X=(x1, x2, …, xn) 。

Page 17: Knapsack Problem  ( 背包 问题 )

17

证明 0/1 背包问题满足最优性原理。

设 (x1, x2, …, xn) 是所给 0/1 背包问题的一个最优解,则 ( x2, …, xn) 是下面一个子问题的最优解:

)2(}1,0{

112

nix

xwCxw

i

n

iii

n

iii xv

2

max

如若不然,设 (y2, …, yn) 是上述子问题的一个最优解,则

因此,

这说明 (x1, y2, …, yn) 是所给 0/1 背包问题比 (x1, x2, …, xn)更优的解,从而导致矛盾。

n

iii

n

iii xvyv

22

Cywxwn

iii

211

n

iii

n

iii

n

iii xvxvxvyvxv

1211

211

Page 18: Knapsack Problem  ( 背包 问题 )

18

0/1 背包问题可以看作是决策一个序列 (x1, x2, …, xn) ,对任一变量 xi 的决策是决定 xi=1还是 xi=0 。在对 xi-1决策后,已确定了 (x1, …, xi-1) ,在决策 xi 时,问题处于下列两种状态之一:

( 1 )背包容量不足以装入物品 i ,则 xi=0 ,背包不增加价值;

( 2 )背包容量可以装入物品 i ,则 xi=1 ,背包的价值增加了vi 。

这两种情况下背包价值的最大者应该是对 xi决策后的背包价值。令 V(i, j) 表示在前 i(1≤i≤n) 个物品中能够装入容量为j ( 1≤j≤C )的背包中的物品的最大值,则可以得到如下动态规划函数:

Page 19: Knapsack Problem  ( 背包 问题 )

19

[动态规划函数 ]:

iii

i

w j if j)) 1,-V(i ),w-j 1,-V(imax(v

w j if j) 1,-V(i

0 jor 0 i if 0

j) V(i,

1 装入 0 个物品 2 背包容量为 0

5 放入第 i 物后可得的价值 4 不放入第 i 物可得的价值

3 第 i 物的重量比背包目 前可承受之重量还重

(式 2.3 )

( 式 2.4.1 )( 式 2.4.2 )

Page 20: Knapsack Problem  ( 背包 问题 )

20

式 2.3 表明:把前面 i 个物品装入容量为 0 的背包和把 0 个物品装入容量为 j 的背包,得到的价值均为 0 。

式 2.4 的第一个式子表明:如果第 i 个物品的重量大于背包的容量,则装入前 i 个物品得到的最大价值和装入前i-1 个物品得到的最大价值是相同的,即物品 i 不能装入背包;第二个式子表明:如果第 i 个物品的重量小于背包的容量,则会有以下两种情况:

( 1 )如果把第 i 个物品装入背包,则背包中物品的价值等于把前 i-1 个物品装入容量为 j-wi 的背包中的价值加上第 i

个物品的价值 vi ;

( 2 )如果第 i 个物品没有装入背包,则背包中物品的价值就等于把前 i-1 个物品装入容量为 j 的背包中所取得的价值。显然,取二者中价值较大者作为把前 i 个物品装入容量为 j的背包中的最优解。

Page 21: Knapsack Problem  ( 背包 问题 )

21

根据动态规划函数,用一个 (n+1)×(C+1) 的二维表 V , V[i][j] 表示把前 i 个物品装入容量为 j 的背包中获得的最大价值。

例如,有 5 个物品,其重量分别是 {2, 2, 6, 5, 4} ,价值分别为 {6, 3, 5, 4, 6} ,背包的容量为 10 。

    0 1 2 3 4 5 6 7 8 9 10

  0

w1=2 v1=6 1

w2=2 v2=3 2

w3=6 v3=5 3

w4=5 v4=4 4

w5=4 v5=6 5

Page 22: Knapsack Problem  ( 背包 问题 )

22

    0 1 2 3 4 5 6 7 8 9 10

  0 0 0 0 0 0 0 0 0 0 0

w1=2 v1=6 1 0 0 6 6 6 6 6 6 6 6 6

w2=2 v2=3 2 0 0 6 6 9 9 9 9 9 9 9

w3=6 v3=5 3 0 0 6 6 9 9 9 9 11 11 14

w4=5 v4=4 4 0 0 6 6 9 9 9 10 11 13 14

w5=4 v5=6 5 0 0 6 6 9 9 12 12 15 15 15

0

第一阶段,只装入前 1 个物品,确定在各种情况下的背包能够得到的最大价值;

第二阶段,只装入前 2 个物品,确定在各种情况下的背包能够得到的最大价值;

依此类推,直到第 n 个阶段。最后, V(n,C)便是在容量为 C 的背包中装入 n 个物品

时取得的最大价值。

Page 23: Knapsack Problem  ( 背包 问题 )

23

如何确定装入背包的具体物品?

从 V(n,C) 的值向前推,如果 V(n,C)>V(n-1,C) ,表明第 n 个物品被装入背包,前 n-1 个物品被装入容量为 C-wn 的背包中;否则,第 n 个物品没有被装入背包,前 n-1 个物品被装入容量为 C 的背包中。依此类推,直到确定第 1 个物品是否被装入背包中为止。由此,得到如下函数:

),1(),(,1

),1(),(0

jiVjiVwjj

jiVjiVx

ii (式 6.13 )

Page 24: Knapsack Problem  ( 背包 问题 )

24

x5=1

x4=0

x3=0

x2=1

x1=1

    0 1 2 3 4 5 6 7 8 9 10

  0 0 0 0 0 0 0 0 0 0 0

w1=2 v1=6 1 0 0 6 6 6 6 6 6 6 6 6

w2=2 v2=3 2 0 0 6 6 9 9 9 9 9 9 9

w3=6 v3=5 3 0 0 6 6 9 9 9 9 11 11 14

w4=5 v4=4 4 0 0 6 6 9 9 9 10 11 13 14

w5=4 v5=6 5 0 0 6 6 9 9 12 12 15 15 15

0

Page 25: Knapsack Problem  ( 背包 问题 )

25

核心算法实现:

设 n 个物品的重量存储在数组 w[n] 中,价值存储在数组v[n] 中,背包容量为 C ,数组 V[n+1][C+1] 存放迭代结果,其中 V[i][j] 表示前 i 个物品装入容量为 j 的背包中获得的最大价值,数组 x[n] 存储装入背包的物品,动态规划法求解0/1 背包问题的算法如下:

Page 26: Knapsack Problem  ( 背包 问题 )

26

遗传算法求解 0/1 背包问题 ( 仅做了解 )

Page 27: Knapsack Problem  ( 背包 问题 )

27

⑴ 选择算子 ⑵ 交叉算

子 ⑶ 变异算

遗传算法的基本运算

遗传算法基本原理 模拟自然界优胜劣汰的进化现象,把搜索空间映射为遗传空间,把可能的解编码成一个向量——染色体,向量的每个元素称为基因。 X=11010111 通过不断计算各染色体的适应值,选择最好的染色体,获得最优解。

Page 28: Knapsack Problem  ( 背包 问题 )

28

●选择算子 ——从旧的种群中选择适应度高的染色体,放入匹配集(缓冲区),为以后染色体交换、变异,产生新的染色体作准备。选择方法——适应度比例法(转轮法)

按各染色体适应度大小比例来决定其被选择数目的多少。

某染色体被选的概率: Pc

)(

)(i

ic xf

xfP

xi 为种群中第 i 个染色体,

Page 29: Knapsack Problem  ( 背包 问题 )

29

具体步骤1 )计算各染色体适应度值

2 )累计所有染色体适应度值,记录中间累加值 S - mid 和最

后累加值 sum = ∑f(xi)

3 ) 产生一个随机数 N , 0 〈 N 〈 sum

4 ) 选择对应中间累加值 S - mid 的第一个染色体进入交换集

5 ) 重复( 3 )和( 4 ),直到获得足够的染色体。举例:⒈具有 6 个染色体的二进制编码、适应度值、 Pc 累计 值。

Page 30: Knapsack Problem  ( 背包 问题 )

30

染色体的 适应度和所占的比例

用转轮方法进行选择

Page 31: Knapsack Problem  ( 背包 问题 )

31

染色体编号 1 2 3

4 5 6 7 8 9 10

适应度 8 2 17 7 2 12 11 7 3 7被选概率 0.1 0.02 0.2

20.09

0.02

0.16

0.14

0.09

0.03

0.09

适应度累计 8 10 27 34 36 48 59 66 69 76

随机数 23 49 76 13 1 27 57所选染色体号码 3 7 10 3 1 3 7

染色体被选的概率

被选的染色体个数

10 个染色体种群按比例的选择过程

Page 32: Knapsack Problem  ( 背包 问题 )

32

●交叉算子

方法 : 随机选择二个染色体 ( 双亲染色体 ), 随机指定一点或多点 , 进行交换 , 可得二个新的染色体 ( 子辈染色体 ).

复制不能创新 , 交叉解决染色体的创新

新的子辈染色体 : A’ 11010001

B’ 01011110

双点 (two-point crossover)交叉,多点 (multi-point crossover)交叉…

Page 33: Knapsack Problem  ( 背包 问题 )

33

模拟生物在自然界环境变化 , 引起基因的突变 . 产生新的染色体,表现出新的性状。

在染色体二进制编码中 ,1 变成 0; 或 0 变成 1. 突变产生染色体的多样性 , 避免进化中早期成熟 , 陷入局部极值点 , 突变的概率很低 .

●变异算子

基本位变异:以变异概率 Pm随机指定某一位或者几位基因做上的基因值做变异运算;

均匀变异,边界变异等…

Page 34: Knapsack Problem  ( 背包 问题 )

34

遗传策法的运算过程遗传策法的运算过程选择选择 ((复制复制 )) :: 根据各个个体的适应度,按照一 定的规则或方法,从第 t 代群体

P(t)

中选择出一些优良的个体遗传到下

一代群体 P(t+1) 中;交叉:交叉: 将群体 P(t) 内的各个个体随机搭

配 成对,对每一对个体,以某个概率 (称为交叉概率)交换它们之间的 部分染色体;变异:变异: 对群体 P(t) 中的每一个个体,以

某一概率 (称为变异概率 )改变某 一个或某一些基因座上的基因值

为其他基因值。

实际问题参数集

编码

随机产生群体 t

计算适值

运算:复制 交叉 变异

群体 t+1

满足要求?

解码

改善或解决实际问题

群体 t+1群体 t

Y

N

Page 35: Knapsack Problem  ( 背包 问题 )

35

注意约束条件

Page 36: Knapsack Problem  ( 背包 问题 )

36

实验讲解

冲撞机器人问题

Page 37: Knapsack Problem  ( 背包 问题 )

37

实验讲解——碰撞机器人 模拟与仿真的应用; 描述:在 A*B 大小的仓库种有 N 个机器人,每个机器人

都有一个初始位置和方向,机器人按照指令进行移动,而且没有两个机器人同时移动。每个机器人占据直径为 1 的圆形区域。如果企图移动出仓库的范围,则判断为撞墙;如果两个机器人占据同样的位置,则判断为冲撞。

Page 38: Knapsack Problem  ( 背包 问题 )

38

输入 第一行 K ,测试序列的组数; 每个测试序列开始一行是两个整数 A B , 1<=A,B<=100 ,给定仓库大小。 A 是东西方向,B 是南北方向。第二行是两个整数 M N , 1<=N, M<=100 ,分别表示机器人的数目和指令的数目。随后两行包括 2 个整数 1<=Xi<=A,1<=Yi<=B 和一个字母(N S E W )表示位置和方向,没有两个机器人的初始位置是相同的。

Page 39: Knapsack Problem  ( 背包 问题 )

39

1 5432

4

3

2

1

N

E

S

W

Page 40: Knapsack Problem  ( 背包 问题 )

40

最后M 行顺序给定所有指令。

指令格式如下:< 机器人编号> <操作 > < 次数 >

其中有 3 种操作:L——左转 90度R——右转 90度F—— 向前一个单位

1<= 次数 <= 100

Page 41: Knapsack Problem  ( 背包 问题 )

41

输出 对于每个测试序列,输出一行:

机器人撞墙( Robot i crashes into the wall ) Robot i crashes into robot j. (i 是移动机器人 ) OK(没有发生冲撞)

Page 42: Knapsack Problem  ( 背包 问题 )

42

解题思路二维数组保存所有机器人的位置,数组元素的值

就是占据该网格的机器人的编号,如果网格没有被占有,值为 0 ;

用一个数组记录机器人的方向,值为 0 ~ 3 ,表示(东北西南) 4 个方向。左转值增加,右转值减少,结果需要模4 。方向改变不会导致机器人碰撞。

蛮力法模拟机器人的移动,每次移动一格,如果下个位置是墙或者有别的机器人,则发生碰撞。

Page 43: Knapsack Problem  ( 背包 问题 )

43

输入样例15 42 21 1 E5 4 W1 F 72 F 7

Page 44: Knapsack Problem  ( 背包 问题 )

44

输出样例Robot 1 crashes into the wall

Page 45: Knapsack Problem  ( 背包 问题 )

45

Page 46: Knapsack Problem  ( 背包 问题 )

46

Page 47: Knapsack Problem  ( 背包 问题 )

47

实验安排时间: 20090429(周三 ) 16 : 40 ~ 18 :

15地点:计算机楼二楼机房内容:

动态规划法求解如下 0/1 背包问题: 5 个物品重量和价值分别为 {3 , 2 , 1 , 4 , 5}{25 , 20 , 15 ,40 , 50} ,背包容量为 6 。

贪心算法求解订票问题: 某公司以出售某一固定数量的连号票(套票)来代替单张售票,套票的订单以该套票中最小的座位号为标志。如果一个订单完全按照观众要求,那么观众付全价( 2 元),如果一个订单虽被接受,但是至少有一个座位与观众要求不同,那么顾客只要付半价( 1 元),问怎样销售才能使收入最高。

Page 48: Knapsack Problem  ( 背包 问题 )

48

service.in 20 3 // 总座位数,套票所含座位数; 7 4 2 10 9 16 15 17

Service.out 9 // 最大收入 6 //订单数 4 1 // 第 4 位观众的座位从座位号 1 开始 1 4 2 7 3 10 6 13 5 16

其他授课内容实验作业;