回溯之0-1背包

各位亲爱的小伙伴,小编又上线了,前一阵子忙着软考、验收项目,今天补一下,看到评论区好多小伙伴对回溯的0-1背包问题很感兴趣,今天就来一起分享一下!

0-1背包问题简介

看问题很简单,0-1背包,也就代表着对于每个物品的选择无非也就两种情况:装或者不装,说到这,大家是不是想起了判定树?决策树?是不是无非也就是两种情况,是OR不是。如果大家能够想到这里那说明大家的知识网,已经开始初步建立了,如果没有的也不要气馁,大家可以先让自己对算法感兴趣,并且多学一些相关的内容,相信大家一定会有很大的收获的。
我们继续来说,我们在这个问题里面,所有的可能的问题的解,组成了解空间,我们在所谓的解空间里面寻找总重量不超过购物车容量并且价值最大的物品的集合作为最优解。而这些由问题的子解组成的解空间,其空间树称为子集树。

定义问题的解空间

问题的解是从n件物品中选择一些总重量不超过背包可装最大容量的物品并使得价值最大。那么当第i件物品装入背包能够达到要求,还是不装进去能达到要求呢,因此每一个物品的状态都给其设置一个状态0-1,0:不装,1:装进背包。这样一来该问题的解是一个n元组,每个分量取值0/1

确定解空间的组织结构

问题的解空间描述了2^n种可能,也就是说n个元素组成的集合所有子集的个数,例如有4个物品,就有16种情况可供参考。由此可见解空间结构为树,深度为n。
在这里插入图片描述

约束条件

我们发现解空间有如此多种情况,但是存在某种或某些物品不能装入购物车的情况,因此我们需要约束条件,判断装入背包的物品总重量是否超过背包容量,超过则为不可行解,搜索过程将不再搜索那些导致死结点的孩子结点。
约束条件为:在这里插入图片描述

限界条件

背包问题的解可能很多,但是我们要的是找出一个最优解,因此需要设置限界条件来加快我们搜索的速度
根据解空间的组织形式我们已经了解其是树结构,对于任意的一个中间结点z(中间状态),从根节点到z结点的分支代表的状态已经确定,从z往下的分支状态是不确定的,也就是架设z结点所在为第t层,也就是说,我们已经确定了t-1个物品的状态,我们只需要确定t物品的状态,那么前t种物品的状态就确定了,而t+1到n物品的状态还不确定,前t种物品的状态所得到的总价值为cp,已经装入物品的价值大不代表着一定是最优的,因为剩余物品里面可能有质量小价值高的。
我们还不能确定t+1到n物品的状态,因此只能用估计值。假设第t+1到n物品都能装进去,t+1到n物品的总价值rp来表示,cp+rp是经过z结点的可行解的价值上界,也就是经过z结点最大就是全装进去的价值。
如果价值上界小于或者等于当前搜索到的最优值(也就是bestp来表示,初始值设置为0),则说明从z无论如何往下走,都不能找到比现在价值更大的情况了,因此没有往下继续搜索的必要。反之,则证明还有往下搜索的必要。
界限条件:cp+rp>bestp

如何搜索

从根开始,深度优先搜索,约束条件成立则继续搜寻,左孩子为活结点,直直走到装不下东西。如果限界条件满足,说明右子树可能存在价值更高的情况,则回溯到当前节点的父节点判断另一种情况。搜索至所有活结点都变成死结点时结束,拿到当最优解,此解为回溯0-1背包问题的最优解。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值