Knapsack Problem ( 背包 问题 )
-
Upload
keegan-moody -
Category
Documents
-
view
251 -
download
0
description
Transcript of Knapsack Problem ( 背包 问题 )
Knapsack Problem ( 背包问题 )
戴红伟20090427
2
The Knapsack Problem Def: 有 N 个物品和一个背包,其中 :
物品具有重量 (w1, w2, …, wn) 和价值 (p1, p2, …, pn)
背包的最大重量承受限制为 W
如何放置物品可得最高价值 ?
此问题可以表示为如下 :
3
Fractional Knapsack Problem: 物品可以被任意分割 一般采用贪婪算法 (Greedy Approach)
0/1 Knapsack Problem: 物品不可分割 一般采用动态规划法 (Dynamic Programming)
参考:《算法设计与分析》王红梅 P150
Knapsack Problem 问题类型
4
其他类型背包问题完全背包问题 (0/1) :
有 N 种物品和一个容量为 V 的背包,每种物品都有无限件可用。第 i 种物品的费用是 c[i] ,价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
多重背包问题 有 N 种物品和一个容量为 V 的背包。第 i 种物品最多
有 n[i] 件可用,每件费用是 c[i] ,价值是 w[i] 。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
5
分组背包问题: 有 N 件物品和一个容量为 V 的背包。第 i 件物品的费
用是 c[i] ,价值是 w[i] 。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
有依赖的背包问题: 这种背包问题的物品间存在某种“依赖”的关系。也就
是说, i 依赖于 j ,表示若选物品 i ,则必须选物品 j 。为了简化起见,我们先设没有某个物品既依赖于别的物品,又被别的物品所依赖;另外,没有某件物品同时依赖多件物品。
6
适配背包问题: 有容量为 S 的背包, N 件物品,重量分别为 w1, w2,
…, wn ,从 N 件物品中挑选若干件物品,所选物品之和恰能放入该背包,即所选物品之和等于 S 。
7
授课内容贪心法求解 最佳装载 背包问题
动态规划法求解 0/1 背包问题
遗传算法求解 0/1 背包问题
8
贪心法求解 最佳装载 背包问题描述:对于容量为 c 的背包进行装载,从 n 个物品
中选择装入背包的物品,每个物品 i 的重量和价值分别为 wi 和 pi 。在背包中物品的总重量不超过背包容量的前提下,求装入物品价值最高的装载法。
输入: 5 20 // 物品的数量和背包的容量 6 3 // 第一个物品的重量和价值 2 5 //… 3 8 10 6 7 4
9
输出: 0 1 1 1 0.714286
10
解题思路 总是对当前问题作最好的选择,也就是局部寻优。
现按物品效益、重量比值升序排列。然后每次选择比值大的物品进行装载,直到背包装满为止。
11
核心代码// 创建物品信息结构体
12
13
14
转换为价值重量比
15
2- 动态规划法求解 0/1 背包问题动态规划法设计算法一般分成三个阶段:( 1)分段:将原问题分解为若干个相互重叠的子问题;( 2)分析:分析问题是否满足最优性原理,找出动态规划函数的递推式;( 3)求解:利用递推式自底向上计算,实现动态规划过程。
动态规划法利用问题的最优性原理,以自底向上的方式从子问题的最优解逐步构造出整个问题的最优解。
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) 。
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
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 )的背包中的物品的最大值,则可以得到如下动态规划函数:
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 )
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的背包中的最优解。
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
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 个物品
时取得的最大价值。
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 )
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
25
核心算法实现:
设 n 个物品的重量存储在数组 w[n] 中,价值存储在数组v[n] 中,背包容量为 C ,数组 V[n+1][C+1] 存放迭代结果,其中 V[i][j] 表示前 i 个物品装入容量为 j 的背包中获得的最大价值,数组 x[n] 存储装入背包的物品,动态规划法求解0/1 背包问题的算法如下:
26
遗传算法求解 0/1 背包问题 ( 仅做了解 )
27
⑴ 选择算子 ⑵ 交叉算
子 ⑶ 变异算
子
遗传算法的基本运算
遗传算法基本原理 模拟自然界优胜劣汰的进化现象,把搜索空间映射为遗传空间,把可能的解编码成一个向量——染色体,向量的每个元素称为基因。 X=11010111 通过不断计算各染色体的适应值,选择最好的染色体,获得最优解。
28
●选择算子 ——从旧的种群中选择适应度高的染色体,放入匹配集(缓冲区),为以后染色体交换、变异,产生新的染色体作准备。选择方法——适应度比例法(转轮法)
按各染色体适应度大小比例来决定其被选择数目的多少。
某染色体被选的概率: Pc
)(
)(i
ic xf
xfP
xi 为种群中第 i 个染色体,
29
具体步骤1 )计算各染色体适应度值
2 )累计所有染色体适应度值,记录中间累加值 S - mid 和最
后累加值 sum = ∑f(xi)
3 ) 产生一个随机数 N , 0 〈 N 〈 sum
4 ) 选择对应中间累加值 S - mid 的第一个染色体进入交换集
5 ) 重复( 3 )和( 4 ),直到获得足够的染色体。举例:⒈具有 6 个染色体的二进制编码、适应度值、 Pc 累计 值。
30
染色体的 适应度和所占的比例
用转轮方法进行选择
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 个染色体种群按比例的选择过程
32
●交叉算子
方法 : 随机选择二个染色体 ( 双亲染色体 ), 随机指定一点或多点 , 进行交换 , 可得二个新的染色体 ( 子辈染色体 ).
复制不能创新 , 交叉解决染色体的创新
新的子辈染色体 : A’ 11010001
B’ 01011110
双点 (two-point crossover)交叉,多点 (multi-point crossover)交叉…
33
模拟生物在自然界环境变化 , 引起基因的突变 . 产生新的染色体,表现出新的性状。
在染色体二进制编码中 ,1 变成 0; 或 0 变成 1. 突变产生染色体的多样性 , 避免进化中早期成熟 , 陷入局部极值点 , 突变的概率很低 .
●变异算子
基本位变异:以变异概率 Pm随机指定某一位或者几位基因做上的基因值做变异运算;
均匀变异,边界变异等…
34
遗传策法的运算过程遗传策法的运算过程选择选择 ((复制复制 )) :: 根据各个个体的适应度,按照一 定的规则或方法,从第 t 代群体
P(t)
中选择出一些优良的个体遗传到下
一代群体 P(t+1) 中;交叉:交叉: 将群体 P(t) 内的各个个体随机搭
配 成对,对每一对个体,以某个概率 (称为交叉概率)交换它们之间的 部分染色体;变异:变异: 对群体 P(t) 中的每一个个体,以
某一概率 (称为变异概率 )改变某 一个或某一些基因座上的基因值
为其他基因值。
实际问题参数集
编码
随机产生群体 t
计算适值
运算:复制 交叉 变异
群体 t+1
满足要求?
解码
改善或解决实际问题
群体 t+1群体 t
Y
N
35
注意约束条件
36
实验讲解
冲撞机器人问题
37
实验讲解——碰撞机器人 模拟与仿真的应用; 描述:在 A*B 大小的仓库种有 N 个机器人,每个机器人
都有一个初始位置和方向,机器人按照指令进行移动,而且没有两个机器人同时移动。每个机器人占据直径为 1 的圆形区域。如果企图移动出仓库的范围,则判断为撞墙;如果两个机器人占据同样的位置,则判断为冲撞。
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 )表示位置和方向,没有两个机器人的初始位置是相同的。
39
1 5432
4
3
2
1
N
E
S
W
40
最后M 行顺序给定所有指令。
指令格式如下:< 机器人编号> <操作 > < 次数 >
其中有 3 种操作:L——左转 90度R——右转 90度F—— 向前一个单位
1<= 次数 <= 100
41
输出 对于每个测试序列,输出一行:
机器人撞墙( Robot i crashes into the wall ) Robot i crashes into robot j. (i 是移动机器人 ) OK(没有发生冲撞)
42
解题思路二维数组保存所有机器人的位置,数组元素的值
就是占据该网格的机器人的编号,如果网格没有被占有,值为 0 ;
用一个数组记录机器人的方向,值为 0 ~ 3 ,表示(东北西南) 4 个方向。左转值增加,右转值减少,结果需要模4 。方向改变不会导致机器人碰撞。
蛮力法模拟机器人的移动,每次移动一格,如果下个位置是墙或者有别的机器人,则发生碰撞。
43
输入样例15 42 21 1 E5 4 W1 F 72 F 7
44
输出样例Robot 1 crashes into the wall
45
46
47
实验安排时间: 20090429(周三 ) 16 : 40 ~ 18 :
15地点:计算机楼二楼机房内容:
动态规划法求解如下 0/1 背包问题: 5 个物品重量和价值分别为 {3 , 2 , 1 , 4 , 5}{25 , 20 , 15 ,40 , 50} ,背包容量为 6 。
贪心算法求解订票问题: 某公司以出售某一固定数量的连号票(套票)来代替单张售票,套票的订单以该套票中最小的座位号为标志。如果一个订单完全按照观众要求,那么观众付全价( 2 元),如果一个订单虽被接受,但是至少有一个座位与观众要求不同,那么顾客只要付半价( 1 元),问怎样销售才能使收入最高。
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
其他授课内容实验作业;