回溯法在0_1背包问题中的应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用值或称价值Pi。 他的问题就是在不超过背包载重量W的前提 下,优化所能携带的物品的总价值P。
该问题是0-1背包问题的一个典型实例。 其数学描述为:n 个物 品 ,重 量 分 别 为wi、价 值 分 别 为pi,其 中0≤i≤n-1,背 包 的 载重量为W。 用xi表示物品Vi被装入背包的情况,如果物品Vi被
{(x0,x1,…,xn-1)|xi=0或xi=1}。 若n=3,则此0-1背包问题的解空间 为 {(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0),(1,1,1)}。 3.2 确定解空间的结构
可以用树的形式将解空间表达出来。 树中从第i层到第i+1 层 的 边 上 的 值 表 示 解 向 量 中 xi的 取 值 , 并 假 定 第 i 层 的 左 子 树 描 述 物 品Vi被 装入 背 包 的 情 况 , 右 子 树 描 述 物 品Vi被 拒 绝 的 情 况 。 则 该0-1背 包 问 题 的 状 态 空 间 树 就 表 示 为 一 棵 高 度 为 n的 完 全二叉树(如图1所示)。 从根结点到叶子结点的任一路径就对 应解空间中的一个解向量。 3.3 搜索解空间
n-1
Σ 选中,则xi=1;否则,xi=0。求满足目标函数P=max pixi和约束方 i=1 n-1
Σ 程 wixi≤W的物品组合(x0,x1,…,xn-1)与相应的总价值P。 i=1
3 回溯法求解0-1背包问题
3.1 定义问题的解空间 根 据 上 述 0-1背 包 问 题 的 数 学 描 述 ,解 向 量 可 以 表 示 成 X=
0-1背 包 问 题 。
关 键 词 :回 溯 法 ;0-1背 包 问 题 ;求 解 ;解 空 间
中 图 分 类 号 :TP312
文 献 标 识 码 :A
文 章 编 号 :1672-7800 (2008)12-0054-02
0 引言
回溯法是算法设计的基本方法之一, 又称“通用解题法”。 使用回溯法可以系统地搜索所给问题的一个解或全部解。它适 用于求解一些涉及到寻找一组解的问题或者求满足某些约束 条件的最优解问题, 且适用于求解组合数量较大的问题。 因 此,了解回溯法的基本思想与解题步骤对解决现实生活中的诸 多问题具有非常重要的意义。
作 者 简 介 :徐 颖 (1980~),女 ,江 苏 丰 县 人 ,西 安 石 油 大 学 计 算 机 学 院 硕 士 研 究 生 ,研 究 方 向 为 算 法 分 析 与 设 计 。
第 12 期
徐 颖:回溯法在 0-1 背包问题中的应用
· 55 ·
图1 n=3时0-1背包问题的状态空间树
求以后,无法达到目标函数的要求。 因此,最好优先选择那些既 能使目标函数的值增加最快, 又能使背包载重量消耗速度较慢 的物品装入背包 。 为了达到这个目的,首先把所有物品按价值重 量比的非增顺序排列,然后按照这个顺序进行搜索。
2005. (责任编辑:袁 月)
2 0-1背包问题
背包问题在现实生活中有着广泛的应用背景, 如预算控 制、项目选择、材料切割、货物装载等问题。 如果对每个对象只 提 供 两 种 选 择 :全 部 接 受 或 全 部 拒 绝 ,则 该 背 包 问 题 就 是 0-1背 包问题。
假定一个旅行爱好者准备带着一个背包去旅行。进一步假 定旅行者知道背包所能承受的最大负荷为W,以及他想要携带 的n个不同的有用物品集,如帐篷、水壶、压缩饼干、洗漱用品 等,每个物品要么全部接受,要么全部拒绝。 假设每个物品i由 两个值来表征 :一个是重量值Wi,一个是旅行者赋予物 品 的有
{ cw+=w[i]; //改变背包当前重量 b+=p[i]; //改变当前总价值
x[i]=1;//物 品 i装 入 背 包 } else b+=p[i]/w[i]*(c-cw); } return b; //背包装满, 将所有物品的的总价值作为一个上 限返回 3.5 结果 基于上述思想设计的回溯算法运行结果如图2所示。
5 结束语
综上所述,回溯法虽然是通过搜索问题的解空间来得到问 题的解,但它并不是首先生成问题的所有可能解,然后再去逐 一判断这些解是否满足约束条件和目标函数,而是每次只构造 可能解的一部分,然后评估这部分解。 如果这部分解有可能导 致当前最优解,则对其进一步构造;否则,就放弃这部分解,回 溯搜索其他可行解。因此,回溯法常常可以避免许多无效搜索。 以上算法在VC++ 6.0环境下得到验证, 实践证明了回溯法可以 有 效 地 解 决 0-1背 包 问 题 。 参考文献: [1] 王晓东.算法设计与分析[M].北京:清华大学出版社,2003. [2] 王红梅.算法设计与分析[M].北京:清华大学出版社,2006. [3] 霍 红 卫.算 法 设 计 与 分 析 [M].西 安 :西 安 电 子 科 技 大 学 出 版 社 ,
1 回溯法的基本思想
回溯法通过系统地搜索一个问题的解空间来得到问题的 解。 为了实现回溯,首先需要针对所给问题,定义其解空间。 这 个解空间必须至少包含问题的一个解(可能是最优的)。然后组 织解空间,确定易于搜索的解空间结构。 典型的组织方法是图 或树。 一旦定义了解空间的组织方法,即可按照深度优先策略 从开始结点出发搜索解空间。并在搜索过程中利用约束函数在 扩展结点处剪去不满足约束的子树,用目标函数剪去得不到最 优解的子树,避免无效搜索。
第7卷%第12期 2008年 12 月
软件导刊 Software Guide
Vol.7 No.12 Dec. 2008
回溯法在0-1背包问题中的应用
徐颖
(西安石油大学 计算机学院,陕西 西安 710065)
摘 要:结合0-1背包问题介绍了回溯法的基本思想和解题步骤 ,并在VC++ 6.0环境下验证了回溯法可以有效地解决
(1)按 价 值 重 量 比 的 非 增 顺 序 排 列 物 品 。 (2)初始化:当前背包重量cw为0,当前背包中物品总价值cp 为0,当前搜索深度i为0,当前解向量为x[i]=0,当前最优值p为0。 (3)调 用 限 界 函 数 。 (4)如 果 返 回 的 上 限 大 于 当 前 最 优 值 p,从 物 品 Vi开 始 把 物 品装入背包 ,直至没有物品可装或装 不下 物 品Vk为 止 ,并 生成 部分解。 转步骤(5);否则,转步骤(6)。 (5)如 果k大 于 或 等 于 物 品 总 数 量 n,则 得 到 一 个 可 行 解 ,并 把 该 可 行 解 的 值 作 为 当 前 最 优 值 ,令 i=n,转 步 骤 (3),以 便 回 溯 搜 索 其 他 可 行 解 ; 否 则 , 令 i=k+1, 拒 绝 物 品 k, 从 物 品 k+1 继 续 装 入 ,转 步 骤 (3)。 (6)当k>=0且 x[k]=0时 ,令 k=k-1,直 至 条 件 不 成 立 。 即 沿 着 右分支结点方向向上回溯,直至左分支结点。 (7)如 果 k<0,算 法 结 束 ;否 则 ,转 步 骤 8. (8)令x[k]=0,cw=cw-w[k],cp=cp-w[k],i=k+1,转步骤(3)。 其中, 限界函数用来估计由当前部分解可获取的最大价 值。 描述如下: b=cp;//变 量 b用 来 存 储 改 变 后 的 总 价 值 for(i<n;i++) //逐一考察各物品 { if(cw+w[i]<=c) // cw+w[i]没有超过背包容量
ห้องสมุดไป่ตู้图2 0-1背包问题的回溯法运行结果
4 算法分析
回溯算法的运行时间取决于它在搜索过程中所生成的结 点数。 而限界函数可以大大减少所生成的结点个数, 避免无效 搜索,加快搜索速度。 但调用限界函数计算上界需花费O(n)时 间。 最坏情况下有O(2n)个右儿子结点需调用限界函数 , 故计 算0-1背包问题的回溯算法的时间复杂度为 O(n2n)。 回溯法的 另一个重要特性就是在搜索执行的同时产生解空间。在搜索过 程中的任何时刻, 仅保留从开始结点到当前可扩展结点的路 径, 其空间需求为O(从开始结点起最长路径的长度)。所以,该 算 法 的 空 间 复 杂 度 为 O(n)。
构造出问题的状态空间树以后,就可以从其根结点出发搜 索解空间 ,即决定每个物品的取舍 。 为了使目标函数的值增加最 快,可以优先选择价值最大的物品装入背包,然后是价值量次之 的 物 品 … … 直 至 背 包 装 不下 为 止 。 但 是 ,如 果所 选 择 的 物 品 重量 很大,使得背包载重量消耗速度太快,以至后续能装入背包的物 品迅速减少, 使得继续装入背包的物品在满足了约束方程的要
在装包过程中,要尽量优先选择价值重量比较高的物品装 入背包。表现在搜索过程中,就是要尽量沿着左子树结点前进。 当不能继续前进时(假设该结点为T),就得到问题的一个部分 解,并把搜索转移到右子树。 估计由该部分解所能得到的最大 价值,即结点T的上限。 可以用贪婪算法处理剩余物品:将按照 价值重量比非增顺序排列的剩余物品依次装入背包,至无法完 全装入下一个物品时,就将该物品的一部分装满背包。 这样就 可以得到一个上限。 如果该值为当前最优值:继续由右子树向 下搜索,扩大部分解,直至找到可行解;保存可行解,并把可行 解的值作为当前最优值,向上回溯,寻找其他可行解;若该值小 于当前最优值:丢弃当前正在搜索的部分解,向上回溯。反复使 用此方法,直至搜索完整个解空间。 3.4 应用回溯法求解0-1背包问题的算法步骤