06分支限界法

news2024/9/29 18:01:38

文章目录

  • 八数码难题
    • 普通BFS算法
    • 全局择优算法(A算法,启发式搜索算法)
  • 单源最短路径问题
  • 装载问题
    • 算法思想:队列式分支限界法
    • 优先队列式分支限界法
  • 布线问题
  • 最大团问题
  • 批处理作业调度问题

分支限界法与回溯法的区别:
(1)求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。
(2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

BFS框架:

queue.add(起点)while(队列不为空)
{ 
       取出队首点;
       if(如果达到目标) 结束 
       for(当前结点可拓展选择) {
               if (判重检测通过)
                      queue.add(新扩展结点)}
}

常见的两种分支限界法
(1)队列式(FIFO)分支限界法
按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。
(2)优先队列式分支限界法
按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

在这里插入图片描述

八数码难题

在 3*3 的方格棋盘上,分别放置了标有数字1、2、3、4、5、6、7、8的八张牌,初始状态S0,目标状态Sg。
可以使用的操作有:
 空格左移,空格上移,空格右移,空格下移
 即只允许把位于空格左、上、右、下方的牌移入空格,寻找从初始状态到目标状态的移动棋子步数最少的解路径。

普通BFS算法

1 从初始布局出发,先把移动一步后的布局全部找出,检查是否有目标布局,若有一定是最少移动步骤;
2 若没有,再从这些一步的布局出发,找到移动两步后的所有布局;再检查是否有目标布局。若有一定是最少移动步骤;如此继续,直到找到目标布局。
3 由于是按移动步数从少到多产生布局的,所以,找到的第一个目标布局一定是最少步骤的。
在这里插入图片描述

全局择优算法(A算法,启发式搜索算法)

设估价函数为: f(n)=d(n)+W(n)
其中,d(n)表示节点 n 在搜索树中的深度;
w(n)表示节点 n 中“不在位”的数码个数。

一般来说,某节点中的“不在位”的数码个数越多,说明它离目标节点越远。
对初始节点 S0,由于 d(S0)= 0,W(S0)= 3, 因此有 f(S0)=0+3=3
在这里插入图片描述

单源最短路径问题

问题描述:在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。
在这里插入图片描述
在这里插入图片描述
算法思想
算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。
此后,算法从极小堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。
如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。
这个结点的扩展过程一直继续到活结点优先队列为空时为止。

剪枝策略
在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。

装载问题

问题描述:有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集装箱i的重量为Wi,且满足下列条件,装载问题要求确定是否有一个合理的装载方案可将这个集装箱装上这2艘轮船。如果有,找出一种装载方案。 实质就是要求第1艘船的最优装载。

在这里插入图片描述

算法思想:队列式分支限界法

在算法的while循环中,首先检测当前扩展结点的左儿子结点是否为可行结点。如果是则将其加入到活结点队列中。然后将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。
活结点队列中的队首元素被取出作为当前扩展结点,由于队列中每一层结点之后都有一个尾部标记-1,故在取队首元素时,活结点队列一定不空。当取出的元素是-1时,再判断当前队列是否为空。如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。

while (true) {
      // 检查左儿子结点
      if (Ew + w[i] <= c) // x[i] = 1,Ew表示当前扩展结点相应的重量
      EnQueue(Q, Ew + w[i], bestw, i, n); //将活结点加入活结点队列
      // 右儿子结点总是可行的,直接加入
      EnQueue(Q, Ew, bestw, i, n); // x[i] = 0
      Q.Delete(Ew);     // 取下一扩展结点
      if (Ew == -1) {      // 同层结点尾部
         if (Q.IsEmpty()) return bestw;
         Q.Add(-1);        // 同层结点尾部标志
         Q.Delete(Ew);  // 取下一扩展结点
         i++;}                 // 进入下一层      }  }

算法的改进
节点的左子树表示将此集装箱装上船,右子树表示不将此集装箱装上船。
设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。则当ew+r<=bestw时,可将其右子树剪去,因为该子树不可能产生更优解。
另外,为了确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。

算法的改进

// 检查左儿子结点
  Type wt = Ew + w[i];   // 左儿子结点的重量
      if (wt <= c) {     // 可行结点
         if (wt > bestw) bestw = wt;
         // 加入活结点队列
         if (i < n) Q.Add(wt);
}
// 检查右儿子结点
      if (Ew + r > bestw && i < n)
      Q.Add(Ew);     // 可能含最优解
      Q.Delete(Ew);     // 取下一扩展结点

构造最优解
为了在算法结束后能方便地构造出与最优值相应的最优解,算法必须存储相应子集树中从活结点到根结点的路径。为此目的,可在每个结点处设置指向其父结点的指针,并设置左、右儿子标志。

class QNode
 {   QNode *parent;   // 指向父结点的指针
      bool LChild;        // 左儿子标志
      Type weight;       // 结点所相应的载重量
};

找到最优值后,可以根据parent回溯到根节点,找到最优解。

// 构造当前最优解
for (int j = n - 1; j > 0; j--) {
      bestx[j] = bestE->LChild; //被选中的集装箱 
      bestE = bestE->parent; //回溯到该路径中的上层结点
}


优先队列式分支限界法

算法思想:
解装载问题的优先队列式分支限界法用最大优先队列存储活结点表。活结点x在优先队列中的优先级定义为从根结点到结点x的路径所相应的载重量再加上剩余集装箱的重量之和。
优先队列中优先级最大的活结点成为下一个扩展结点。以结点x为根的子树中所有结点相应的路径的载重量不超过它的优先级。子集树中叶结点所相应的载重量与其优先级相同。在优先队列式分支限界法中,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。

布线问题

在这里插入图片描述
算法思想:队列式分支限界法
求解方法:
(1)起始位置a第一个扩展;
(2)依次考虑距a距离为1、2、3、…、的方格,并作标记,并存入活结点队列;
(3)从活结点队列取结点扩展,一直搜索到目标方格b或活结点队列为空时为止。
在这里插入图片描述
二维数组 grid[i][j]:表示方格阵列
初始时,
grid[i][j]= 0:该方格允许布线
grid[i][j]= 1:该方格被封锁,不允许布线
边界处理:四周用方格阵列围起来,作为处理的边界。

for (int i = 0; i <= m + 1; i++) { 
    grid[0][i] = grid[n + 1][i] = 1; 
  } //顶部和底部
for (int i = 0; i <= n + 1; i++) { 
    grid[i][0] = grid[i][m + 1] = 1; 
  } //左翼和右翼

方格的方位offset,沿四个方向的移动分别记为offset[0]~offset[3]

Position offset[4]; //offset是四个移动方向的相对位移矩阵
offset[0].row = 0; offset[0].col = 1; // 右
offset[1].row = 1; offset[1].col = 0; // 下
offset[2].row = 0; offset[2].col = -1; // 左
offset[3].row = -1; offset[3].col = 0; // 上

算法将起始距离标记为2(因0,1用于表示状态)
grid[start.row][start.col] = 2; //起始点距离为2
here.row = start.row; // here为正在布线的方格,初始值为start。
here.col = start.col;                                                     

do {  // 标记可达相邻方格
    for (int i = 0; i < NumOfNbrs; i++)
      { // NumOfNbrs为相邻方格数
         nbr.row = here.row + offset[i].row;  // here是正在走线的方格,
         nbr.col = here.col + offset[i].col;     nbr是可考虑走线方格
         if (grid[nbr.row][nbr.col] == 0) { // 该方格未标记
            grid[nbr.row][nbr.col] = grid[here.row][here.col] + 1;
                              // grid[][]中记录该方格距离起始方格距离
         if ((nbr.row == finish.row) && (nbr.col == finish.col))    
            break; // 完成布线
         Q.Add(nbr);} //队列中加入新的扩展结点
       }
}

找到目标位置后,可以通过回溯方法找到这条最短路径。

构造最短路径:
从终点finish出发,开始向起始方格方向回溯。
每次向标记距离比当前方格标记距离少1的相邻方格移动,直至到达起始方格时为止。搜索时,比较相邻4个方格的标号。

最大团问题

给定无向图G=(V,E)。如果U∈V,且对任意u,v∈U有(u,v)∈E,则称U是G的完全子图。
G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。
在这里插入图片描述

在这里插入图片描述
上界函数

用变量cliqueSize表示与该结点相应的团的顶点数;
level表示结点在子集空间树中所处的层次;
用cliqueSize +n-level+1作为顶点数上界upperSize的值。
在此优先队列式分支限界法中,upperSize实际上也是优先队列中元素的优先级。
算法总是从活结点优先队列中抽取具有最大upperSize值的元素作为下一个扩展元素。

算法思想

子集树的根结点是初始扩展结点,对于这个特殊的扩展结点,其cliqueSize的值为0。 

算法在扩展内部结点时,首先考察其左儿子结点。在左儿子结点处,将顶点i加入到当前团中,并检查该顶点与当前团中其它顶点之间是否有边相连。当顶点i与当前团中所有顶点之间都有边相连,则相应的左儿子结点是可行结点,将它加入到子集树中并插入活结点优先队列,否则就不是可行结点。

接着继续考察当前扩展结点的右儿子结点。当upperSize>bestn时,右子树中可能含有最优解,此时将右儿子结点加入到子集树中并插入到活结点优先队列中。

算法的while循环的终止条件是遇到子集树中的一个叶结点(即n+1层结点)成为当前扩展结点。

批处理作业调度问题

给定n个作业的集合J={J1,J2,…,Jn}。每一个作业Ji都有2项任务要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。
作业Ji需要机器j的处理时间为tji,i=1,2,…,n;j=1,2。
对于一个确定的作业调度,设是Fji是作业i在机器j上完成处理的时间。
则所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。
批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

已解决sc delete MongoDB卸载MongoDB拒绝访问。

已解决sc delete MongoDB卸载MongoDB拒绝访问。 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 粉丝群里面的一个小伙伴遇到问题跑来私信我&#xff0c;想卸载MongoDB数据库&#xff0c;但是发生了报错&#xff08;当时他心里瞬间凉了一大截&…

select 与 where、order by、limit 子句执行优先级比较

当 select 和 其他三种语句的一者或者多者同时出现时&#xff0c;他们之间是存在执行先后顺序的。 他们的优先级顺序是&#xff1a;where > select > order by > limit 目录 1、select 与 where 2、select 与 order by 3、order by 与 limit 4、优先级证明 1、s…

低噪声与功放选型购买

低噪声与功率放大器的区别&#xff1f;购买时怎么区分&#xff1f; 低噪放 低噪放&#xff0c;低噪声射频放大器。作用就是要求噪声系数很低&#xff0c;放大电压信号。一般放在系统第一级&#xff0c;因为噪声系数低&#xff0c;接收放大的信号有很好的的信噪比。如天线的接…

大数据框架之Hadoop:入门(六)常见错误及解决方案

1&#xff09;防火墙没关闭、或者没有启动YARN INFO client.RMProxy: Connecting to ResourceManager at hdp101/192.168.10.101:80322&#xff09;主机名称配置错误 3&#xff09;IP地址配置错误 4&#xff09;ssh没有配置好 5&#xff09;root用户和vagrant两个用户启动集…

设计模式--适配器模式 Adapter Pattern

设计模式--适配器模式 Adapter Pattern适配器模式 Adapter Pattern1.1 基本介绍1.2 工作原理类适配器模式对象适配器模式接口适配器模式小结适配器模式 Adapter Pattern 1.1 基本介绍 &#xff08;1&#xff09;适配器模式将某个类的接口转换成为客户端期望的另一个接口表示&…

普通人如何改变自己的命运?

【Morty】普通人改变命运的秘密&#xff01;我的观点可能会颠覆你的认知_哔哩哔哩_bilibili 非常感谢UP&#xff0c;你的每个视频我都看了&#xff0c;给我启示最大的是《为什么你总是那么穷》&#xff0c;这些年一直走背运&#xff0c;加上20年创业失败了&#xff0c;已经身无…

LAMP架构介绍及配置

LAMP架构介绍及配置一、LAMP简介与概述1、LAMP平台概述2、LAMP各组件主要作用3、构建LAMP平台二、编译安装Apache htpd服务1、将所需软件包上传到/opt目录下2、解压以下文件3、移动两个文件并改名4、安装所需工具5、编译安装6、做软连接&#xff0c;使文件可执行7、优化配置文件…

面试题:Java锁机制

java对象包含了三个部分&#xff1a;对象头&#xff0c;实例数据和对齐填充。对象头又存放了&#xff1a;markWord和class point。classpoint &#xff1a;指向方法区&#xff0c;当前对象的类信息数据。markword&#xff1a;存储了很多和当前对象运行时的数据&#xff1a;例如…

【Spark分布式内存计算框架——Spark Core】7. RDD Checkpoint、外部数据源

第五章 RDD Checkpoint RDD 数据可以持久化&#xff0c;但是持久化/缓存可以把数据放在内存中&#xff0c;虽然是快速的&#xff0c;但是也是最不可靠的&#xff1b;也可以把数据放在磁盘上&#xff0c;也不是完全可靠的&#xff01;例如磁盘会损坏等。 Checkpoint的产生就是…

六、mybatis与spring的整合

Spring整合Mybaits的步骤 引入依赖 在Spring整合Mybaits的时候需要引入一个中间依赖包mybatis-spring <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version> </dependency&g…

通过抓包分析gPRC协议

通过抓包分析gPRC协议 前言 gRPC 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向移动和 HTTP/2 设计。目前提供 C、Java 和 Go 语言版本&#xff0c;分别是&#xff1a;grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C, Node.js, Python, Ruby, Objective-C, PHP 和 …

windows + vscode + rust

1 安装VSCODE略2 安装rust插件1、说明&#xff1a;第4步本人是一个一个点击状态。上图禁用按钮在没装之前是显示“安装”按钮&#xff0c;应该点击“安装”也可以。2、还需要安装C插件&#xff0c;搜索C即可&#xff0c;装微软的3 创建rust工程由于初次使用&#xff0c;不知道目…

实战项目-课程潜在会员用户预测(朴素贝叶斯&神经网络)

目录1、背景介绍2、朴素贝叶斯2.1 模型介绍2.2 模型实现3、人工神经网络1、背景介绍 目标&#xff1a;将根据用户产生的数据对课程潜在的会员用户&#xff08;可能产生购买会员的行为&#xff09;进行预测。 平台的一位注册用户是否购买会员的行为应该是建立在一定背景条件下…

TCP、UDP网络编程面试题

TCP、UDP、Socket、HTTP网络编程面试题 什么是网络编程 网络编程的本质是多台计算机之间的数据交换。数据传递本身没有多大的难度&#xff0c;不就是把一个设备中的数据发送给其他设备&#xff0c;然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式…

linux 进程

文章目录1、进程的状态2、进程的组织3、进程的控制3.1、进程的创建fork 函数fork 拷贝和共享fork 原理fork 的写时复制exec 函数族exec 原理3.2、进程的终止exit 函数* 僵死进程* 孤儿进程3.3、进程的阻塞和唤醒3.4、进程的切换4、进程间通信5、进程调度算法进程是可执行程序的…

特斯拉无人驾驶解读

来源于Tesla AI Day Tesla无人驾驶算法的核心任务就是如何理解我们所看到的一切呢?也就是说,不使用高端的设备,比如激光雷达,仅仅使用摄像头就能够将任务做得很好。Tesla使用环绕型的8个摄像头获得输入。 第一步是特征提取模块Backbone,无论什么任务都离不开特征…

chatgpt怎么安装?国内怎么玩chatgpt?

关于chatgpt的传言最近真的是闹得沸沸扬扬&#xff0c;主要是这个chatgpt人工智能的冲击力实在是太大了&#xff0c;它学习了大量的语言知识&#xff0c;具有很强的语言能力&#xff0c;无论是写作&#xff0c;还是诗歌&#xff0c;甚至是代码都是不在话下&#xff0c;美国大学…

【数据库】 如何对数据库进行操作

目录 一&#xff0c;SQL语句基础 1&#xff0c; SQL简介 &#xff08;1&#xff09; SQL语句分类 &#xff08;2&#xff09;SQL语句的书写规范 二&#xff0c;数据库操作 1、查看 &#xff08;1&#xff09;查看所有数据库 &#xff08;2&#xff09;查看有没有指定的数…

ubuntu20下Qt5.14.2+OpenCV(含Contrib)-4.5.0环境搭建

Qt若要能处理图片和视频&#xff0c;就必须安装OpenCV&#xff0c;而OpenCV中很多的高级功能如人脸识别等都包含在Contrib扩展模块中&#xff0c;需要将Contrib与OpenCV一起联合编译&#xff0c;目前所用这两个版本都是4.5.0版。 一、下载OpenCV OpenCV的官方下载地址为http:…

SSM整合SpringSecurity简单使用

一、SpringSecurity 1.1 什么是SpringSecurity Spring Security 的前身是 Acegi Security &#xff0c;是 Spring 项目组中用来提供安全认证服务的框架。(官网地址) Spring Security 为基于J2EE企业应用软件提供了全面安全服务。特别是使用领先的J2EE解决方案-Spring框架开发…