1 / 48

Knapsack Problem ( 背包 问题 )

戴红伟 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)

Download Presentation

Knapsack Problem ( 背包 问题 )

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 戴红伟 20090427 Knapsack Problem (背包问题)

  2. The Knapsack Problem • Def: 有N个物品和一个背包,其中: • 物品具有重量 (w1, w2, …, wn) 和价值 (p1, p2, …, pn) • 背包的最大重量承受限制为W 如何放置物品可得最高价值? • 此问题可以表示为如下:

  3. Knapsack Problem问题类型 • Fractional Knapsack Problem: • 物品可以被任意分割 • 一般采用贪婪算法(Greedy Approach) • 0/1 Knapsack Problem: • 物品不可分割 • 一般采用动态规划法(Dynamic Programming) • 参考:《算法设计与分析》王红梅 P150

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

  14. (式2.1) (式2.2) 在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。根据问题的要求,有如下约束条件和目标函数: 于是,问题归结为寻找一个满足约束条件式2.1,并使目标函数式2.2达到最大的解向量X=(x1, x2, …, xn)。

  15. 证明0/1背包问题满足最优性原理。 设(x1, x2, …, xn)是所给0/1背包问题的一个最优解,则( x2, …, xn)是下面一个子问题的最优解: 如若不然,设(y2, …, yn)是上述子问题的一个最优解,则 因此, 这说明(x1, y2, …, yn)是所给0/1背包问题比(x1, x2, …, xn)更优的解,从而导致矛盾。

  16. 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)的背包中的物品的最大值,则可以得到如下动态规划函数:

  17. [动态规划函数]: 3第 i 物的重量比背包目 前可承受之重量还重 1装入0个物品 2背包容量为0 (式2.3) (式2.4.1) (式2.4.2) 5放入第 i 物后可得的价值 4不放入第 i 物可得的价值

  18. 式2.3表明:把前面i个物品装入容量为0的背包和把0个物品装入容量为j的背包,得到的价值均为0。式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的背包中的最优解。

  19. 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 例如,有5个物品,其重量分别是{2, 2, 6, 5, 4},价值分别为{6, 3, 5, 4, 6},背包的容量为10。 根据动态规划函数,用一个(n+1)×(C+1)的二维表V,V[i][j]表示把前i个物品装入容量为j的背包中获得的最大价值。

  20. 0 1 2 3 4 5 6 7 8 9 10 0 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 第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值; 第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值; 依此类推,直到第n个阶段。最后,V(n,C)便是在容量为C的背包中装入n个物品 时取得的最大价值。

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

  22. 0 1 2 3 4 5 6 7 8 9 10 0 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 x1=1 x2=1 x3=0 x4=0 x5=1

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

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

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

  26. ●选择算子 ——从旧的种群中选择适应度高的染色体,放入匹配集(缓冲 区),为以后染色体交换、变异,产生新的染色体作准备。 选择方法——适应度比例法(转轮法) 按各染色体适应度大小比例来决定其被选择数目的多少。 某染色体被选的概率:Pc xi 为种群中第i个染色体,

  27. 具体步骤 1)计算各染色体适应度值 2)累计所有染色体适应度值,记录中间累加值S - mid 和最 后累加值 sum = ∑f(xi) 3) 产生一个随机数 N,0〈 N 〈 sum 4) 选择对应中间累加值S - mid 的第一个染色体进入交换集 5) 重复(3)和(4),直到获得足够的染色体。 举例: ⒈具有6个染色体的二进制编码、适应度值、Pc累计 值。

  28. 染色体的 适应度和所占的比例 用转轮方法进行选择

  29. 10个染色体种群按比例的选择过程 染色体被选的概率 被选的染色体个数

  30. ●交叉算子 复制不能创新,交叉解决染色体的创新 方法:随机选择二个染色体(双亲染色体),随机指定一点或多点, 进行交换,可得二个新的染色体(子辈染色体). 新的子辈染色体: A’ 11010001 B’ 01011110 双点(two-point crossover)交叉,多点(multi-point crossover)交叉…

  31. ●变异算子 模拟生物在自然界环境变化,引起基因的突变.产生新的染色体,表现出新的性状。 在染色体二进制编码中,1变成0;或0变成1.突变产生染色体的多样性,避免进化中早期成熟,陷入局部极值点,突变的概率很低. 基本位变异:以变异概率Pm随机指定某一位或者几位基因做上的基因值做变异运算; 均匀变异,边界变异等…

  32. 满足要求? 遗传策法的运算过程 选择(复制): 根据各个个体的适应度,按照一 定的规则或方法,从第t代群体P(t) 中选择出一些优良的个体遗传到下 一代群体P(t+1)中; 交叉: 将群体P(t)内的各个个体随机搭配 成对,对每一对个体,以某个概率 (称为交叉概率)交换它们之间的 部分染色体; 变异: 对群体P(t)中的每一个个体,以某一概率(称为变异概率)改变某 一个或某一些基因座上的基因值为其他基因值。 实际问题参数集 编码 随机产生群体t 计算适值 运算:复制 交叉 变异 群体t+1群体t 群体t+1 N Y 解码 改善或解决实际问题

  33. 注意约束条件

  34. 实验讲解 冲撞机器人问题

  35. 实验讲解——碰撞机器人 • 模拟与仿真的应用; • 描述:在A*B大小的仓库种有N个机器人,每个机器人都有一个初始位置和方向,机器人按照指令进行移动,而且没有两个机器人同时移动。每个机器人占据直径为1的圆形区域。 如果企图移动出仓库的范围,则判断为撞墙;如果两个机器人占据同样的位置,则判断为冲撞。

  36. 输入 • 第一行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)表示位置和方向,没有两个机器人的初始位置是相同的。

  37. 最后M行顺序给定所有指令。 • 指令格式如下: <机器人编号> <操作> <次数> 其中有3种操作: L——左转90度 R——右转90度 F——向前一个单位 1<= 次数 <= 100

  38. 输出 • 对于每个测试序列,输出一行: • 机器人撞墙(Robot i crashes into the wall) • Robot i crashes into robot j. (i是移动机器人) • OK(没有发生冲撞)

  39. 解题思路 • 二维数组保存所有机器人的位置,数组元素的值就是占据该网格的机器人的编号,如果网格没有被占有,值为0; • 用一个数组记录机器人的方向,值为0~3,表示(东北西南)4个方向。左转值增加,右转值减少,结果需要模4。方向改变不会导致机器人碰撞。 • 蛮力法模拟机器人的移动,每次移动一格,如果下个位置是墙或者有别的机器人,则发生碰撞。

  40. 输入样例 1 5 4 2 2 1 1 E 5 4 W 1 F 7 2 F 7

  41. 输出样例 • Robot 1 crashes into the wall

  42. 实验安排 • 时间:20090429(周三) 16:40~18:15 • 地点:计算机楼二楼机房 • 内容: • 动态规划法求解如下0/1背包问题:5个物品重量和价值分别为{3,2,1,4,5}{25,20,15,40,50},背包容量为6。 • 贪心算法求解订票问题: • 某公司以出售某一固定数量的连号票(套票)来代替单张售票,套票的订单以该套票中最小的座位号为标志。如果一个订单完全按照观众要求,那么观众付全价(2元),如果一个订单虽被接受,但是至少有一个座位与观众要求不同,那么顾客只要付半价(1元),问怎样销售才能使收入最高。

  43. 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 • 其他授课内容实验作业;

More Related