- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
分支限界法解 01 背包问题
学院:网研院 姓名:XXX 学号:2013XXXXXX
一、 分支限界法原理
分支限界法类似于回溯法, 也是在问题的解空间上搜索问题解的算法。一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空 间中满足约束条件的所有解;而分支限界法的求解目标则是找出满足约束条件的 一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解, 即在某种意义下的最优解。
由于求解目标不同,导致分支限界法与回溯法对解空间的搜索方式也不相同。回溯法以深度优先的方式搜索解空间,而分支限界法则以广度优先或以最小耗费 优先的方式搜索解空间。
分支限界法的搜索策略是,在扩展结点处,先生成其所有的儿子结点(分支), 然后再从当前的活结点表中选择下一扩展结点。为了有效地选择下一扩展结点, 加速搜索的进程,在每一个活结点处,计算一个函数值(限界),并根据函数值, 从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间上有最优解的分支推进,以便尽快地找出一个最优解。
常见的分支限界法有如下两种:
队列式(FIFO)分支限界法:按照先进先出原则选取下一个节点为扩展节点。活结点表是先进先出队列。FIFO 分支限界法搜索策略:
一开始,根结点是唯一的活结点,根结点入队。
从活结点队中取出根结点后,作为当前扩展结点。
对当前扩展结点,先从左到右地产生它的所有儿子,用约束条件检查, 把所有满足约束函数的儿子加入活结点队列中。
再从活结点表中取出队首结点(队中最先进来的结点)为当前扩展结点, 重复上述过程,直到找到一个解或活结点队列为空为止。
LC(least cost)分支限界法(优先队列式分支限界法):按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。活结点表是优先权队列, LC 分支限界法将选取具有最高优先级的活结点出队列,成为新的扩展节点。优 先队列式分支限界法搜索策略:
对每一活结点计算一个优先级(某些信息的函数值);
根据这些优先级从当前活结点表中优先选择一个优先级最高(最有利) 的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。
再从活结点表中下一个优先级别最高的结点为当前扩展结点,重复上述过程,直到找到一个解或活结点队列为空为止。
二、 01 背包问题简介
01 背包问题假设有一个容量为 c 的背包,有 n 件物品,每件物品有重量 w 和价值 v,求解怎样往背包里装物品能够在不超出背包容量 c 的情况下获得最大价值(本实验中物品的 w 和 v 都是大于 0 的实数,可以是整数也可以是浮点数)。
三、 FIFO 分支限界法解 01 背包问题
算法
输入背包容量 capacity、物品数量 count、物品的重量数组 weights 和物品的价值数组 values,根据物品单位价值(value/weight)从大到小构造一个新数组,数组元素(OriginNode)有 weight、value 和 valuePerWeight 属性,根据该排序数组构造问题的解空间树(完全二叉树);
定义一个 FIFO 队列(队列元素是节点,见下文),队列可以在队尾插入节点和在队头删除节点;
定义节点(ArrayNode),节点是问题的解空间树上的点,它的属性有当前价值 currentValue、当前重量 currentWeight、上限价值upboundValue、节点对应的选择情况 nodeChoses(0 表示不选,1 表示选,如“1 0 1”表示该节点选择了物品 1 和物品 3,没有选择物品 2)和节点在问题解空间树上的层次 nodeCount(0 ~ n);
定义一个计算节点价值上限的函数 upBound(),upBound 函数的计算规章是:
价值上限=节点现有价值+背包剩余容量*剩余物品的最大单位重量价值
定义一个全局的 currentMaxValue 记录程序目前取得的最大价值;
将一个空节点推入队列,空节点的当前价值、当前重量、节点层次均为 0,全局的currentMaxValue 初始化为 0,使用upBound 函数计算几点的价值上限并使用该属性初始化节点的 upboundValue 属性;
当队列不为空时,一直重复下述操作:从队首取得头节点,如果头 节点的上限价值 upboundValue 比全局的 currentMaxValue 要大,则表明头节点的子节点中可能有最优节点,取头节点在问题的解空间 树上的左子节点和右子节点,若左子节点和右子节点的重量没有超 出背包容量且它们的 upboundValue 大于全局的 currentMaxValue, 将该子节点插入队尾,否则不插入,同时若子节点的当前价值currentValue 大于全局的
文档评论(0)