分支限界法(一)LC-检索

一般方法
1、LC-检索
2、15-谜问题
3、LC-检索的抽象化控制
4、LC-检索的特性

一般方法

分治限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。但是二者搜索方式不同。
在这里插入图片描述
n-皇后问题的显示约束条件是同一行和同一列,因为显式约束条件是x,y都在[1,n]之间,在判断的时候就是按相等判断同时这就是判断行和列。隐式约束是对角线。
在这里插入图片描述
上面的编号不是进行搜索时候的编号,是按照显式约束条件生成的完全解空间树按照深度优先的次序编的号(看节点8,4567不是不存在而是在当前这个解空间树里不显示,相当于对完全解空间树进行剪枝)
在这里插入图片描述
在这里插入图片描述

  • 是将生成节点的全部儿子也放进去了
  • 相同点就是使用限界函数来剪枝
    在这里插入图片描述
    FIFO:谁最先进去的就把谁先作为E-节点;
    LIFO:谁后进入的将谁先作为E-节点

在这里插入图片描述
⭕️里的是之前用回溯的顺序,外面的是用这种方法生成的顺序
在这里插入图片描述
节点计算结果:有啥好的解决办法呢?因为现在分支限界的节点数很明显大于回溯了
在这里插入图片描述

一、LC-检索

在这里插入图片描述
由之前的一般方法中只有FIFO和LIFO这两种方法,完全没有体现出对可能具有答案节点的节点的照顾,只有对这些节点予以特殊照顾才能让我们更快的找到最后的答案。
给或借点表示中的节点赋予优先权
在这里插入图片描述
在这里插入图片描述
能不能有这样的优先级,这样的优先级应该怎么设置呢?
在这里插入图片描述

状态空间树中的任何节点只有以下几种可能

在这里插入图片描述
上帝视角定义一个节点成本函数C(x):上帝视角就意味着我们不可能达到的视角,其实就是在当前情况下,还没有对🌲进行遍历就已经知道了下面是否有答案节点,如果有答案节点是否是最小的,俗称“先知”。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
其实得到精确的成本函数C(x)的过程就是找到最优解的过程,就没啥意义了,所以要想办法大致估计节点成本。
在这里插入图片描述
对C(x)的一个估计:
由两个部分组成,就相当于由以往的经验对未来进行预测,但是这种预测是有误差的;同时要考虑到当前节点的成本,综合考量这两部分在整个的节点成本估计函数的比例。
在这里插入图片描述
在这里插入图片描述
进入活节点表里面的节点应该有它的C🎩值,谁的C🎩值最小,就把它作为下一个E-节点。
在这里插入图片描述

LC-检索的特殊情况

其实BFS和D-检索都可以用当C🎩的表达式中两种函数的特殊选择来表示。
在这里插入图片描述
因为g(x)=0,无影响;f(h(x))=节点的级数,也就是BFS队列实现的默认一样。
在这里插入图片描述
实际上是用一个限界函数的标准表示形式来统一所有情况。
在这里插入图片描述
为啥是D-检索呢?首先忽略f(h(x))的影响,而g(X)的定义是对于当前节点的子节点比当前的节点小,所以要将所有的小的算完才能选取,就相当于是堆栈检索
在这里插入图片描述
过程分析:
首先是根节点1,然后生成子节点2、3,压入堆栈,然后弹出节点3,生成节点4,5压入,然后弹出节点5,依次这样进行。

二、15谜问题

在这里插入图片描述
合法移动:空格周围的牌移到空格
在这里插入图片描述
在这里插入图片描述
position(3)=2;position(5)=7;position(12)=8;position(16)=6;(空格位置)
less(X):明明号码比当前的值小,位置却比当前的值大的个数
⚠️X的取值是在初始状态下进行取值
在这里插入图片描述

如何判断目标状态是否能达到?

给出判断目标状态是否在初始状态的状态空间中。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当然求解每一个节点的时候都需要用定理9.1先判断一下是否可以达到目标状态。
在这里插入图片描述
如果能往上到达棋盘的边界则一直向上移动,到了边边之后,就进行下一个向右,继续进行一直向右移动,到头,over and over
在这里插入图片描述
所以需要给出成本估计函数:C🎩
在这里插入图片描述
⚠️C🎩是C的下界
⚠️g🎩是最小移动数
在这里插入图片描述
最长从现在的位置如果可以到目标位置我最少不得不移动这些个位置,才能物归原位。
在这里插入图片描述
虽然一步到不了目标状态,但是如果要想到达一定要移动节点7移动1步
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法3:LC-检索
当前实例下,LC-检索几乎和使用精确函数c一样有效,LC-检索的选择性比很多检索方法强很多。主要是因为C🎩函数选择的好。

三、LC-检索的抽象化控制在这里插入图片描述

在这里插入图片描述

抽象化控制思想

在这里插入图片描述
在这里插入图片描述
什么时候判断一个节点是答案节点非常重要。

算法的终止条件

在这里插入图片描述
如果LC检索算法在进行E-节点选择的时候使用的是最小堆,就是每一层的元素都先进入最小堆,这时候每一个状态的最小值都是在最小堆的堆顶,就实现了每一次都拿出最小值。活节点表的实现不同
在这里插入图片描述
问题变成了估计函数C🎩如何选择?C🎩具有什么样的特性才能算作好的估计函数?

四、LC-检索的特性

在这里插入图片描述
因为下一步是选择C🎩值小的活节点为E-节点,按照上图的C🎩必须得选择左子树,而最小节点却在右子树。
在这里插入图片描述
在这里插入图片描述
可是这样的C🎩通常得不到,因为你需要提前知道两个点的C的大小关系

其实如果C🎩和C的“单调性”是一样的,就可以用来代表,实际上的意义是一样的。
在这里插入图片描述

一般可以找到一个易于计算、且具有如下特性的C🎩:对于每一个节点X,都有C🎩<=C(x)

但是这样设计的话算法LC也未必能找到最小答案节点。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个E-节点在生成儿子节点的时候就进行判断是否是答案节点;生成儿子节点的时候不判断是否是答案节点全部进入活节点表,在出表的时候再进行判断是否是答案节点。
在这里插入图片描述
因为第一种算法在子节点还没有完全进入活节点表中的时候就如果直接对当前的节点进行判断的话,可能会忽略掉后来有可能进入的更小节点;但是第二种在所有子节点都进入活节点表之后再进行判断的话,就可以从一个整体的角度进行判断哪个是最小的,最合适的。
在这里插入图片描述
第一个框:因为节点E是在全部都进入活节点表之后进行,所以C🎩(E)是活节点表里面最小的。
第二个框:C(L)是什么?从L出发能到达的成本最小的答案节点。
在这里插入图片描述
注意前提:如果有答案节点的话

五、分配问题

在这里插入图片描述
最小成本的计算,就要选择每个人在4个任务里面选择自己成本最少的,把这个成本作为最小成本,但是这个最小成本下界并不一定是一个合法成本,因为有可能两个人会选中同一个任务
在这里插入图片描述
每行的最小元素之和不是每行元素之和。
在这里插入图片描述

解空间状态🌲

解空间状态树的成本下界是每个节点已经知道选择的节点的成本
在这里插入图片描述
当每一层判断出最小的之后其他的就不用走了,比如我现在得到了最优解,现在的cost是13,但是当我走到b->3的时候他的lb是14,下界是14,说明以后只能比14大,而现在最小的已知是13,所以肯定不能选择了。
在这里插入图片描述
1、可以得到
2、可以

在这里插入图片描述

1、二分图(二部图)

设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边所关联的两个顶点i和j分别属于这两个不同的顶点集(i∈A, j∈B),则称图G为一个二分图。就是你无论怎么划分都有横跨两个顶点集合的边。
在这里插入图片描述
图中的顶点可以划分为两个集合A,B,任意一条边的头和尾属于两个集合,所以此图为二分图。
在这里插入图片描述

2、匹配

在图论中,一个匹配(matching)是指一个边的集合,其中任意两条边都没有公共顶点。
例如:图2.1中红色的边,可以为图1.3所示图的一个匹配。
在这里插入图片描述

3、最大匹配

一个图所有匹配中,所含匹配边数最多的匹配,称为这个图的最大匹配。图 3.1是一个最大匹配,它包含4条匹配边。
在这里插入图片描述

4、完美匹配

如果一个图的某个匹配中,所有的顶点都是匹配点,那么它就是一个完美匹配。完美匹配一定是最大匹配(完美匹配的任何一个点都已经匹配,添加一条新的匹配边一定会与已有的匹配边冲突),但并非每个图都存在完美匹配。

5、交替路径

从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径称为交替路径。

6、增广路径(没太看懂)

从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路(agumenting path)。
增广路径性质
(1)P的路径长度必定为奇数,第一条边和最后一条边都不属于M,因为两个端点分属两个集合,且未匹配。
(2)P经过取反操作可以得到一个更大的匹配M’。
(3)M为G的最大匹配当且仅当不存在相对于M的增广路径。

7、匈牙利算法

利用增广路径求二分图的最大匹配算法称作匈牙利算法。(匈牙利数学家Edmonds于1965年提出)。

基本思想:通过寻找增广路径,把增广路径中的匹配边和非匹配边的相互交换,这样就会多出一条匹配边,直到找不到增广路径为止。
未匹配点实际上就是还未选入到我要选择的集合里面的节点,匹配点是我已经选择到集合里面的点。
例如:以图2.1所示的二分图为例,使用匈牙利算法求解图的最大匹配。
(1)从顶点a出发,按照交替路径前进,第一个非匹配边为,到达顶点e,e为非匹配点,构成增广路径。令为匹配边,顶点a,e为匹配顶点。
在这里插入图片描述
(2)从顶点b出发,第一非匹配边为,到达顶点e,选择匹配边,到达a,选择非匹配边,g为非匹配点,找到一条增广路径。
在这里插入图片描述
(3)交换增广路径中的匹配边与非匹配边,得到如下匹配。
在这里插入图片描述
(4)从顶点c出发,第一非匹配边为,到达顶点e,然后按照交替路径前进,到达顶点b,无法继续前进。
在这里插入图片描述
(5)从顶点c出发,选择第二条非匹配边。
(6)从顶点d出发,选择非匹配边,到达顶点g,选择匹配边,到达顶点a,选择非匹配边到达顶点e,选择匹配边,到达顶部b,没有可以选择的边,且没有找到增广路径。
在这里插入图片描述
(7)继续从顶点d出发,选择非匹配边,找到增广路径,将边变为匹配边,算法结束。
在这里插入图片描述
匈牙利算法多用于指派问题中,例如任务匹配问题。通过转化为二分图的形式,求解最大匹配,保证实现最优分配。

六、0-1背包问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
剩余的物品填入的是剩下未添加的物品里面单位价值最大的,后面你无论选择什么物品放入都不可能超过这个节点的值。

0/1背包问题的解空间状态🌲

在这里插入图片描述
在这里插入图片描述
同样还可以考虑之前的两条:
1、估计函数的设计是否有效?觉得有效但是选的是上界不过也一样。唉,那要是按照上面的那个来的话,有别的可能不就无效了吗?搞不懂了
2、是否用改进之后的LC-检索算法?可以

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值