1.1 分支限界法的本质——通过限界阻塞子树
1.2 分支限界法与回溯法的区别
1.3 下界或者上界估算——贪心
2.2 分支限界法解决单元最短路径问题
5.2 分支限界法解决0-1背包问题
7.2 分支限界法步骤描述
8.2 分支限界法解决旅行商问题
1.1 分支限界法的本质——通过限界阻塞子树
分支限界法通常仅关心使给定函数最大化或最小化。
(分支限界法的本质)因此,如果算法找到了一个耗费为c的解,并且有一个部分解,它的耗费至少是c,那么就不会有该部分解的扩展生成。
在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。
然后,从活结点表中取下一节点(优先队列中最大或最小值)成为当前扩展结点,并重复上述扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。
(分支限界法实现的本质)对某个节点进行搜索时,先估算出目标的解,再确定是否向下搜索(选择最小损耗的结点进行搜索)
在分支结点上,预先分别估算沿着它的各个儿子结点向下搜索的路径中,目标函数可能取得的界,然后把它的这些儿子结点和它们可能取得的界保存在一张结点表中,再从表中选择界最小或最大的结点向下搜索。一般采用优先队列维护这张表。
1.2 分支限界法与回溯法的区别
1)(求解目标)回溯法的求解目标是找出解空间中满足约束条件的一个解或所有解。
2)(搜索方式深度优先)回溯法会搜索整个解空间,当不满条件时,丢弃,继续搜索下一个儿子结点,如果所有儿子结点都不满足,向上回溯到它的父节点。
1)(求解目标)分支限界法的目标一般是在满足约束条件的解中找出在某种意义下的最优解,也有找出满足约束条件的一个解。
2)(搜索方式)分支限界法以广度优先或以最小损耗优先的方式搜索解空间。
3)常见的两种分支界限法
a.队列式(FIFO)分支界限法(广度优先):按照队列先进先出原则选取下一个结点为扩展结点
b.优先队列式分支限界法(最小损耗优先):按照优先队列规定的优先级选取优先级最高的结点成为当前扩展结点
1.3 下界或者上界估算——贪心
分支限界法对下界和上界的估算,总是采用贪心算法,选择当前最优作为界加入到优先队列
给定带权重的有向图G=(V, E),图中的每一条边都具有非负的长度,求从源顶点s到目标顶点t的最短路径问题。
2.2 分支限界法解决单元最短路径问题
把源顶点s作为根节点开始进行搜索。对源顶点s的所有邻接顶点,都产生一个分支结点,估计从源点s经该邻接顶点到达目标顶点t的距离作为该分支结点的下界
选择下界最小的分支结点,对该分支结点所对应的顶点的所有邻接顶点继续进行上述的搜索
源顶点为a,目标定的为t,把a作为根节点进行搜索:
2.2.2 分支限界法的步骤
每个结点包含如下信息:
u——该节点所对应的顶点
path[n]——从源点开始的路径上的顶点编号
k——当前搜索深度下,路径上的顶点个数
d——从源点到本节点所对应顶点的路径长度
b——经本节点到目标顶点最短路径的长度下界
bound——一个可行解的取值,当做剪枝的标准
假定源顶点为s,目标顶点为t。
step1.初始化。建立根节点X
当前可行解的最短路径下界bound置位∞。
step2.令顶点X.u所对应的顶点为u,对u的所有邻接顶点vi,建立儿子结点Yi,把结点X的数据复制到结点Yi
否则剪去结点Yi,转向step6
step5.把结点Yi插入优先队列。如果结点Yi.u = t,表明它是问题的一个可行解,用Yi.b更新当前可行解的最短路径长度下界bound。
step6.取下优先队列首元素作为子树的根节点X,若X.u = t,表明它是问题的最优解,算法结束,数组X.path存放从源点s到目标顶点t的最短路径上的顶点编号,X.d存放该路径长度,否则,转向step2.
根节点0对应于源点a,有3个邻接顶点b、c、d,其下界为3,7,11,压入优先队列。
k=2。优先队列中下界3最小,对于的顶点b,也即结点1。从顶点b继续进行搜索。
顶点b的邻接顶点为c和e,其下界为6和11,压入优先队列。
k=3。优先队列中下界6最小,对应顶点c,也即结点4.从顶点c继续进行搜索。
顶点c邻接顶点d、e、f、g,对应的下界为13,10,8,8,压入优先队列。
(回溯到了k=2)k=2。优先队列中7最小,对应顶点c,也即结点2。从顶点c进行搜索。
顶点c邻接顶点d、e、f、g,对应的下界为14,11,9,9,压入优先队列。
k=4。优先队列中8最小,对应顶点f,也即结点8。
顶点f的邻接顶点为e、t,下界分别为9、11,压入栈中。其中11为一个可行解,将bound置为11.
(回溯到了k=4)k=4。优先队列中8最小,对应顶点g,也即结点9。
顶点g的邻接顶点为f、t,下界都是10。其中10为一个可行解,将bound置为10.
k=5.优先队列中9最小,对应顶点e,也即结点14.
顶点e只有一个邻接顶点t,下界为9,从而得到一个可行解,路径长度为9,加入优先队列中。
优先队列中最小的为9,且最后一个结点为t,因此是最优解。
假定n个商品重量分别为w0, w1, ..., wn-1,价值分别为p0, p1, ..., pn-1,背包载重量为M。怎样选择商品组合,使得价值最高?
5.2 分支限界法解决0-1背包问题
按价值重量比 递减 的顺序,对n个商品进行排序
将这些商品分为3个集合:
S1——选择装入背包的商品集合
S2——不选择装入背包的商品集合
S3——尚待选择的商品集合
S1(k)、S2(k)、S3(k)分别表示在搜索深度为k时的3个集合中的商品。开始时有:
假设比值pi/wi最大的商品序号为s(s ∈ S3),用s进行分支,一个分支结点表示把商品s装入背包,另一个分支结点表示不把商品s装入背包。
当商品按照价值重量比递减排序后,s就是集合S3(k)中的第一个元素。特别地,当搜索深度为k时,商品s的序号就是集合S中的元素k。
把商品s装入背包的分支结点
不把商品s装入背包的分支结点
假定b(k)表示在搜索深度为k时,某个分支结点的背包中商品的价值上界。
此时S3(k) = {k, k+1, ..., n-1}。用如下方法计算两种分支结点背包中商品价值的上界:
1)按照一个商品是否加入到S1集合,总共有2n个叶子节点,每个叶子节点对应一种情况
2)当一层一层向下搜索是,如果当前S1集合中的总重量超过了载重量M,则直接将b(k)置为0,该分支终止。
为什么这样做?因为在搜索上一层时,该商品不应该加入到S1集合,这种不加入该商品情况对应于另一个分支。加入该商品的此分支已经不满足要求了,所以剪枝。
5.2.3 分支限界法求解步骤
每个结点都包含如下信息:
S1——当前选择装入背包的商品集合
S2——当前不选择装入背包的商品集合
S3——当前尚待选择的商品集合
bound——一个可行解的取值,当做剪枝的标准
step3. 若X.k == n,算法结束,X.S1即为装入背包中的物体,X.b即为装入背包中物体的最大价值;
计算Y.b,将Y.b与bound进行比较,据此判定是否插入优先队列;当S3为空时,找到一个可行解,判定是否更新bound。
计算Z.b,将Z.b与bound进行比较,据此判定是否插入优先队列;当S3为空时,找到一个可行解,判定是否更新bound。
step6.取出优先队列首元素作为结点X,转向step3
有5个商品,重量分别为8,16,21,17,12,价值分别为8,14,16,11,7,背包的载重量为37,求装入背包的商品及其价值。
n个操作员(编号:0, 1, ..., n-1)以n种不同时间完成n项不同作业(编号:0, 1, ..., n-1),要求分配每位操作完成一项作业,使完成n项作业的时间总和最少。
cij表示第i位操作员完成第j号作业所需的时间。
用向量x来描述分配给操作员的作业编号,如分量xi表示分配给第i位操作员的作业编号。
7.2 分支限界法步骤描述
(估算下界,放到优先队列)从根节点开始向下搜索,在整个搜索过程中,每遇到一个结点,对其所有儿子结点计算它们的下界,把它们记录在结点表中。
(从优先队列取最值,重复操作)从表中选取最小的结点,并重复上述过程。
(叶节点是否是最优解的判定)当搜索到一个叶子节点,如果该节点的下界是结点表中最小的,那么该节点就是问题的最优解。
否则,对下界最小的结点继续进行扩展。
7.2.1 下界估算方法(类似于贪心,是一种最小估算方法)
假定k表示搜索深度,当k = 0,从根节点开始向下搜索。若将0号作业(j = 0)分配给第i位操作员(0 ≤ i ≤ n-1),其余作业分配给其余操作员,则所需时间至少为:第i位操作员完成第0号作业的时间 + 其余n-1项作业分配给其余n-1位操作员单独完成时所需最短时间之和。(下式中l是任意的,只要不等于i即可)
下图中,若将第0号作业分配给第0位操作员,c00 = 3,此时所需时间下界为: 3 + 7(1号作业给其余三位操作员完成最短时间) + 6(2号作业给其余三位操作员完成最短时间) + 3(3号作业给其余三位操作员完成最短时间) = 19
7.2.2 分支限界法求解作业分配问题
每个结点包含如下信息:
m——已分配作业的操作员编号集合
S——未分配作业的操作员编号集合
x——操作的分配方案向量x,分量xi表示分配给第i位操作员的作业编号。
k——搜索深度(表示分配的第k号作业)
bound——一个可行解的取值,当做剪枝的标准
step1.开始步骤。建立根节点X
把当前问题的可行解的最优时间下界bound置位∞。
step2.对所有操作员i(i ∈ X.S),建立儿子结点Yi,把结点X的数据复制到Yi
否则剪去结点Yi,转step6
step5.把结点Yi插入优先队列,如果结点Yi是叶节点,表明它是问题的一个可行解,用Yi.t更新当前可行解的最优时间下界bound。
step6.取下队列首元素作为子树的根节点X,若X.k = n,则该节点是叶节点,表明它是问题的最优解,算法结束,向量X.x便是作业最优分配方案;否则转向step2.
考虑如图所示的4个操作员的作业最优分配方案
令tik表示在某个搜索深度k下,把作业k分配给操作员i的时间下界。
将这四个结点插入优先队列
当k = 1时,结点2(把0号作业分给0号操作员)的下界做小,将其取出,并由它向下继续搜索
将这三个结点插入优先队列
当k =2时,结点7(把1号作业分给2号操作员)的下界最小,将其取出,并由它向下继续搜索
将这两个结点插入优先队列
当k = 3时,结点10(将2号作业分给3号操作员)的下界最小,将其取出,并由它向下继续搜索
因为它是队列中最小的结点,所以将其取出,又因为是叶子节点,所以是最优解。(分量xi表示分配给第i位操作员的作业编号。)
一个售货员必须访问n个城市,恰好访问每个城市一次,并最终回到出发城市。
售货员从城市i到城市j的旅行费用是一个整数,旅行所需的全部费用是他旅行经过的的各边费用之和,而售货员希望使整个旅行费用最低。
(等价于求图的最短哈密尔顿回路问题)令G=(V, E)是一个带权重的有向图,顶点集V=(v0, v1, ..., vn-1)。从图中任一顶点vi出发,经图中所有其他顶点一次且只有一次,最后回到同一顶点vi的最短路径。
c——费用矩阵(邻接矩阵),cij表示顶点vi到顶点vj的关联边的长度。
8.1.2 费用矩阵的特性及规约
令G=(V, E)是一个带权重的有向图,l是图G的一条哈密尔顿回路,c是图G的费用矩阵,则回路上的边对应于费用矩阵c中每行每列各一个元素。
证明:因为l上面的每个顶点vi有且仅有一条入边和出边,入边表示费用矩阵第i列仅有一个元素对应,出边表示费用矩阵第i行仅有一个元素对应。
费用矩阵c的第i行(或第j列)中的每个元素减去一个整数lhi(或chj),得到一个新的费用矩阵c'。使得c'中第i行(或第j列)中的最小元素为0,称为费用矩阵的行归约(或列归约)。称lhi为行归约常数,chj为列归约常数。
对费用矩阵c的每一行和每一列都进行行归约和列归约,得到一个新的费用矩阵c',使得c'中每一行和每一列至少都有一个元素0,称为费用矩阵的归约。矩阵c'称为费用矩阵c的归约矩阵,称常数h为矩阵c的归约常数。
令G=(V, E)是一个带权重的有向图,l是图G的一条哈密尔顿回路,c是G的费用矩阵,w(l)是以费用矩阵c计算的这条回来的费用。如果c'是费用矩阵c的归约矩阵,归约常数为h,w'(l)是以费用矩阵c'计算的这条回路的费用。则有:
令G=(V, E)是一个带权重的有向图,l是图G的一条最短哈密尔顿回路,c是G的费用矩阵,c'是c的归约矩阵,G'是与c'对应的图,c'是G'的费用矩阵,则l是G'的一条最短的哈密尔顿回路。
8.2 分支限界法解决旅行商问题
(分支1)选取沿着某一条边出发的路径,作为进行搜索的一个分支结点
(分支2)不沿这条边的其他所有路径集合,作为进行搜索的另一个分支结点
假定父亲结点为X, w(X)是父亲结点的下界。
现在,选择沿vivj边向下搜索作为其一个分支结点Y;
不沿vivj边向下搜索作为另一个分支结点Y'。
费用矩阵被降阶和归约,归约常数为h,则w(Y) = w(X) + h
同时它必然包含费用矩阵中第i行的某个元素和第j列的某个元素,令dij为第第i行和第j列中除cij之外的最小元素之和。
如果这两个最小元素不为零,那么也即按照这两个元素进行归约。本质上dij也是矩阵进一步的归约常数。
1)沿cij 为0的方向选择,使所选择的路线尽可能短。
2)在多个cij 为0的方向中,沿dij最大的方向选择,使w(Y')尽可能大
令S是费用矩阵中cij 为0的元素集合,Dkl是S中使dij达到最大的元素,即:
即vkl就是所要选择的分支方向。
8.2.4 分支限界法的求解步骤
每个结点包含如下信息:
c——归约过后的费用矩阵
bound——一个可行解的取值,当做剪枝的标准
X.c 为费用矩阵,并进行归约,归约常数为h
step4.选择使dij最大的元素dkl,选择边vkl作为分支方向。
计算下界Y'.w,并与bound进行比较,根据比较决定是否插入优先队列。
step10.取下优先队列元素作为结点X,若X.k为0,算法结束;否则转向step3.
以下收录的导航满足如下标准:
无弹窗、横幅等干扰体验的广告、网页布局优美、收录的网址符合实用简约原则
极致简约风格、收录主流网站以及小众实用的在线工具,兼顾美观和实用,支持自定义
久违的拟物风格,喜欢的小伙伴可以看一下,还有夜间模式
极简、至美,如果你需要一个简单的搜索开始页,推荐这个
支持登录自定义网址,可以修改网页背景、布局、logo,有足够的网址存储容量兼顾保持简单的风格
拥有手绘风格的界面以及有趣的动画效果,小清新般的存在~
分为标准版和简约版,其中标准版使用QQ登录后可以自定义,答主更喜欢简约版
有强大的自定义功能,用户可以生成自己的公开链接
文艺小清新,支持自定义
一个主流导航风格的网址导航,与2345之流不同的是它没有干扰性广告,支持登陆后自定义,网站已稳定运行7年,喜欢hao123风格的小伙伴可以试试
简单纯粹的搜索导航,点击右上角可以展开更多网站
此项目开源,有兴趣的朋友可以自建,开源地址 >>
暗色系极客范,界面极简
此项目开源,但需要注意开源协议,开源地址 >>
素雅、简洁白,可自定义背景、支持学校官方网址导航
推荐极简模式,支持知乎、微信、淘宝等网站内容直接搜索
一个简单大方的搜索框主页
简单的拟物风格主页,更适合移动设备使用
可自定义网址、可更换大量动态静态背景,特效酷炫,页面可简可繁,整洁优雅
没错,只有一个沉浸式搜索框
支持自定义背景图片、首页网站和切换搜索引擎
黑白风极简主题,需注册登录才可使用,支持自定义
注册账号后,可以自定义一个下图风格的导航,生成自己的网址
主页除了可以设置导航网站,还可以利用插件自定义主页
简洁风网址导航,界面柔和,支持注册自定义以及分享
支持自定义,主要收录前端开发、界面设计、影视后期、日常办公四个分类的网站
设计工作者应该会喜欢,支持注册后自定义
地址(并非原作者搭建):
此项目开源,有兴趣的朋友可以自建,开源地址:
登陆以后可以自定义壁纸
百度出品,界面无广告,可自定义网址,支持上传导入书签,缺点是底部有信息流,最大的优点是服务相对可靠
支持网址自定义,看起来是一家国外公司,提供免费版和专业版,访问速度挺快的
地址:现网址内容已不可描述,不再放出网址
支持自定义网页,收录网站更为全面,同时依然保持界面简洁
安装chrome插件可以实现自定义内容同步
利益相关:简约导航是答主正在维护的网站
欢迎大家在留言区提交符合标准的导航,如果符合要求我会及时添加到文章里
本文原创,转载请注明出处
软件探索是一个致力于推荐实用软件与网站的自媒体
如果您喜欢我们的文章,欢迎关注我的(>▽<)
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。