o-1背包问题迭代_算法设计:回溯法-解决01背包问题

一、算法思想

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法。有时会遇到这样一类题目,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。回溯法的优点 再于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。但是,对于可以得出明显的递推公式迭代求解的问题,还是不要用回溯 法,因为它花费的时间比较长

二、算法要素

1、解空间

用回溯法解决实际问题的时候,首先确定解的形式,定义问题解空间

(1)解的组织形式为一个n元组{x1,x2,x3…..,xn}

(2)解的取值范围

例如0-1背包问题:

0-1背包问题可以抽象成一个容量有限(容量设为W)的背包装东西,每个商品都有自己的体积w和价值v,目的就是用这个容量有限的背包装满价值总量最大的东西

例如有3个物品, 解的组织形式为{x1,x2,x3}。它的解分量xi的取值范围很简单,xi=0或者xi=1。xi=0表示第i个物品不放入包,xi=1表示第i个物品放入背包,因此

xiϵ{0,1}

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}

解空间:所有可能解组成的空间,而我们需要根据问题的约束条件,在解空间中寻找最优解,如下图所示:

o-1背包问题迭代_算法设计:回溯法-解决01背包问题_第1张图片

解空间越小,搜索效率越高。解空间越大,搜索效率越低

(3)搜索解空间

隐约束指对能否得到问题的可行解或最优解做出的约束

如果不满足隐约束,就说明得不到问题的可行解或最优解,那就没必要在沿着该节点的分支进行搜索了,相当于把这个分支减掉了。因此,隐约束也称为剪枝函数,实质不是减掉分支,而是不再搜索该分支

例如3个物品的0-1背包问题,如果前2个物品放入(x1=1,x2=1)后,背包超重了,那就没必要再考虑第3个物品是否放入背包的问题相当于剪枝了,如下图所示:

o-1背包问题迭代_算法设计:回溯法-解决01背包问题_第2张图片

隐约束(剪枝函数)包括约束函数和限界函数

解空间的大小和剪枝函数的好坏直接影响搜索效率,因此这两项是搜索算法的关键,在搜索空间时,有几个术语需要说明:

(1)、扩展节点:一个正在生长孩子的节点

(2)、活节点:一个自身已生成,但孩子还没有全部生成的节点

(3)、死节点:一个所有孩子都已经生成的节点

(4)、子孙:节点E的子树所有节点都是E的子孙

(5)、祖宗:从节点E到树根路径上的所有的节点都是E的祖宗

2、解题步骤:

(1)定义解空间

因为解空间的大小对搜索效率有很大影响,因此使用回溯法首先定义合适的解空间,确定解空间包括解的组织形式和显约束

解的组织形式:解的组织形式都规范为一个n元组{x1,x2,…….,xn},只是具体表达含义不同而已

显约束:对解取值范围的限定,通过显约束可以控制解空间的大小

(2)确定解空间的组织形式

解空间的组织结构通常用解空间树形象的表达,根据解空间的不同,解空间分为子集树、排列树、m叉树

(3)搜索解空间

回溯法是按照深度优先搜索策略,根据约束(约束函数和限界函数),在解空间中搜索问题的可行解或最优解,当发现当前节点不满足求解条件时,就回溯尝试其它路径

如果问题只是要求可行解,则只需设定约束函数即可,如果要求最优解,则需要设定约束函数和限定函数

解的组织形式都是通用的n元组形式,解的组织结构是解空间的形象表达。解空间和隐约束是控制搜索效率的关键。显约束可以控制解空间

三、算法设计过程

以01背包问题为例:假设有n个物品,每个物品i对应的价值为vi,重量为wi,购物车容量为W,每个物品只有1件,要么装入要么不装入不可拆分,如何装入物品的总价值最大?

2、设计过程

(1)定义问题解空间

每个物品有且只有2种状态,要么装入,要么不装入。我们用变量xi表示第i个物品是否被装入购物车的行为,如果用"0"表示不装入背包,用"1"表示装入背包,则xi的取值为0或者1,i=1,2,3,4,5….,第i个物品装入购物车xi=1;不装入购物车xi=0。该问题的解形式是一个n元组,且每个分量的取值为0或1

由此得到问题解空间为{x1,x2,x3,……xi,…..,xn},其中,显约束xi=0或1,i=1,2,3….n

(2)确定解空间的组织结构

问题的解空间描述了2的n次方可能解,也就是说n个元素组成的集合所有子集个数。例如3个物品的购物车问题,解空间是:{0,0,0}、{0,0,1}、{0,1,0}、{0,1,1}、{1,0,0}、{1,0,1}、{1,1,0}、{1,1,1}。该问题有2的3次方个可能解

o-1背包问题迭代_算法设计:回溯法-解决01背包问题_第3张图片

(3)搜索解空间

【1】约束条件

解空间包含2的n次方种可能解,存在某种或某些物品无法装入的情况,因此需要设置约束条件,判断装入物品总重量是否超过总容量,如果超出,为不可行解;否则为可行解。搜索过程不再搜索那些导致不可行解的节点及其孩子节点,约束条件为:

w1x1 + w2x2 + w3x3+….<=W

【2】界限条件

可行解可能不止一个,问题的目标是找一个装入购物车的物品总价值最大的可行解,即最优解。因此,需要设置界限条件来加速该最优解的速度

根据解空间的组织结构,对于任何一个中间节点z(中间状态),从根节点到z节点的分支所代表的状态已经确定,从z到其子孙节点的分支的状态是不确定的。也就 是说,如果z在解空间树中所处的层次是t,说明第1种物品到第t-1种物品的状态已经确定了。我们只需要沿着z的分支扩展很容易确定第t种物品的状态。那么前t种物品的状态就确定了。但第t+1种物品到第n种物品的状态还不确定。这样,前t种物品的状态确定后,当前已装入购物车的物品的总价值,用c p表示。已装入物品的价值高不一定就是最优的,因为还有剩余物品未确定

你可能感兴趣的:(o-1背包问题迭代)