算法设计与分析期末考试复习(六)

news2024/9/23 5:19:08

分支限界法

广度优先搜索:处理某顶点时,一次性发现其所有相邻顶点,未处理顶点加入等待队列
在这里插入图片描述
先来先服务:队尾加入,队首离开
o 加入队列,𝑸. Enqueue( )
o 离开队列,𝑸. Dequeue( )

分支限界法与回溯法的区别

  • 回溯法的求解目标是找出解空间树中满足约束条件的所有解。
  • 分支限界法的求解目标是尽快找出满足约束条件的一个解,或者是满足约束条件的解中找出某种意义下的最优解,通常用于解决离散值的最优化问题。

搜索方式不同

  • 回溯法以深度优先的方式搜索解空间树。
  • 分支限界法以广度优先或最小耗费优先的方式搜索解空间树。

对扩展结点的扩展方式不同

  • 分支限界法中,每一个活结点只有一次机会成为扩展结点。
  • 活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

存储空间的要求不同

  • 分支限界法的存储空间比回溯法大得多。
  • 因此当内存容量有限时,回溯法成功的可能性更大。

二者区别小节

  • 回溯法空间效率高,分支限界法往往更快。
  • 限界函数常基于问题的目标函数,适用于求解最优化问题

分支限界法的基本思想:以广度优先或最小耗费(最大收益)优先的方式搜索解空间树。

  • 分支限界法中,每一个活结点只有一次机会成为扩展结点。
  • 活结点一旦成为扩展结点,就一次性产生其所有儿子结点。
  • 其中导致不可行解或导致非最优解的儿子结点被舍弃。
  • 其余儿子结点被加入活结点表PT中
  • 含义:根据限界函数估算目标函数达到可能取值
  • 选取可能使目标函数取得极值的结点优先进行搜索。
  • 然后从活结点表中取下一结点成为当前扩展结点
  • 重复上述过程:直至找到所需的解或活结点表为空时为止。

求解步骤

  1. 每个活结点仅有一次机会变成扩展结点
  2. 由扩展结点生成一步可达的新结点
  3. 在新结点中,删除不可能导出最优解的结点(限界策略)
  4. 将剩余的新结点加入活动表(队列)中
  5. 从活动表中选择结点再扩展(分支策略)
  6. 直至活动表为空

队列分支限界法

  • 按照队列先进先出(FIFO)原则选取下一个结点为扩展结点
  • 从活结点表中取出结点的顺序与加入结点的顺序相同
  • 因此活结点表的性质与队列相同

优先队列分支限界法(代价最小或效益最大)

  • 每个结点都有一个对应的耗费或收益,以此决定结点的优先级。
  • 从优先队列中选取优先级最高的结点成为当前扩展结点
  • 如果查找一个具有最小耗费的解,则活动表用小顶堆来建立,下一个扩展结点就是具有最小耗费的活结点。
  • 如果希望搜索一个具有最大收益的解,则可用大顶堆来构造活结点表,下一个扩展结点是具有最大收益的活结点。

0/1背包问题

回溯求解0/1背包问题,虽剪枝减少了搜索空间,但整个搜索按深度优先机械进行,是盲目搜索(不可预测本结点以下的结点进行的如何)。

  1. 分支限界法首先确定一个合理的限界函数,并根据限界函数确定目标函数的界[down,up]
  2. 然后按照广度优先策略遍历问题的解空间树,在某一分支上,依次搜索该结点的所有孩子结点,分别估算这些孩子结点的目标函数的可能取值(对最小化问题,估算结点的down,对最大化问题,估算结点的up)。
  3. 如果某孩子结点的目标函数值超出目标函数的界,则将其丢弃,否则加入活动表等待处理。
    在这里插入图片描述
    问题的解可表示为n元向量{x1, x2, … xn }, xi{0,1},则可用子集树表示解空间, 在树中做广度优先搜索。
  4. 下界Vdb = 40(1,0,0,0)——贪心思想
  5. 上界Vub = 100
  6. 限界函数
    在这里插入图片描述

0-1背包步骤

  1. 首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。
  2. 结点的优先级由已装袋的物品价值加上剩下的最大单位重量价值的物品装满剩余容量的价值和。
  3. 算法首先检查当前扩展结点的左儿子结点的可行性。如果该左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。
  4. 当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界约束时才将它加入子集树和活结点优先队列。
  5. 当扩展到叶结点时为问题的最优值。
int bound(){
	while(i<=n && w[i]<=cleft){
		cleft -= w[i];
		b += v[i];
		i++;
	}
	if(i<=n){
		b = b+(v[i]/w[i])*cleft;
		return b;
	}
}
while(i!=n+1){
	//检查当前扩展结点的左儿子结点
	int wt = cw + w[i];
	if(wt <= c){
		if(cv+v[i] > bestv){
			bestv = cv+v[i];
		}
		AddLiveNode(ub,cv+v[i],cw+w[i],true,i+1);
	}
	ub = Bound(i+1);
	//检查当前扩展结点的右儿子结点
	if(ub>=bestv){
		AddLiveNode(up,cv,cw,false,i+1)
	}
	//取下一个扩展结点
}

从0/1背包问题的搜索过程可看出:与回溯法相比,分支限界法根据限界函数不断调整搜索方向,选择最可能得到最优解的子树优先进行搜索->找到问题的解。

分支限界法的一般过程:

  1. 根据限界函数确定目标函数的界[down,up]
  2. 将待处理结点表PT初始化为空
  3. 对根节点的每个孩子结点x执行下列操作:估算结点x的目标函数值value,如果value>=down,则将x加入表PT中。
  4. 循环直到某个叶子结点的目标函数值在表PT中最大
  5. i=表PT中值最大的结点
  6. 对结点i的每个孩子结点x执行下列操作:估算结点x的目标函数值value;若value≥down,则将结点x加入表PT中,若(结点x是叶子结点且结点x的value值在表PT中最大),则将结点x对应的解输出,算法结束;若(结点x是叶子结点但结点x的value值在表PT中不是最大),则令down=value,并且将表PT中所有小于value的结点删除;

单源路径问题

在有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。
采用优先队列式分支限界,并用极小堆来存储活结点表,其优先级是结点所对应的当前路长。

  • 解向量:X=(s, x2, …, t ),s 和t 分别为起点和终点
  • 显示约束:xi=A, B, … (i=2, …, n)
  • 隐式:cij≠∞
  • 目标函数:cost(i )=min {cij +cost (j )} (i≤j≤n且顶点 j 是 i 的邻接点)
  • 下界:把每一段最小的代价相加,2+4+5+3=14
  • 上界:2+6+6+3=17 (s→B→E→H→t)
while(true){
	for(int j=1; j<=n; j++){
	// 顶点i和j间有边,且此路径长小于原先从源点到j的路径长
		if((c[E.i][j]<inf)&&(E.length+c[E.i][j]<dist[j])){
			//顶点i到j可达,且满足控制约束
			dist[j] = E.length+c[E.i][j];
			prev[j] = E.i;
			MinHeadpNode<Type> N;
			N.i=j;
			N.length=dist[j];
			H.insert(N);
		}
		try(H.DeleteMin(E));
		catch (OutOfBounds) {break;}  // 优先队列空
	}
}

装载问题

  1. 装载问题的队列式分支限界法仅求出所要求的最优值,稍后将进一步构造最优解。
  2. 在while循环中,首先检测当前扩展结点的左儿子结点是否为可行结点。如果是,则将其加入到活结点队列Q中。
  3. 然后,将其右儿子结点加入到活结点队列中(右儿子结点一定是可行结点)。2个儿子结点都产生后,当前扩展结点被舍弃。
  4. 活结点队列中,队首元素被取出作为当前扩展结点。
  5. 队列中每一层结点之后,都有一个尾部标记-1。
  6. 在取队首元素时,活结点队列一定不空。
  7. 当取出的元素是-1时,再判断当前队列是否为空。
  8. 如果队列非空,则将尾部标记-1加入活结点队列,算法开始处理下一层的活结点。
  9. 采用最大优先队列存储活结点表。活结点x在优先队列中的优先级定义为:从根结点到结点x的路径所相应的载重量Ew + 剩余集装箱的重量r。
  10. 子集树中叶结点所相应的载重量与其优先级相同,一旦有一个叶结点成为当前扩展结点,则可以断言该叶结点所相应的解即为最优解。此时可终止算法。

算法的改进

  1. 节点的左子树表示将此集装箱装船,右子树表示不将此集装箱装船。
  2. 设bestw是当前最优解;ew是当前扩展结点所相应的重量;r是剩余集装箱的重量。
  3. 当ew+rbestw时,可将其右子树剪去。此时若要船装最多集装箱,就应该把此箱装上船。
  4. 法MaxLoading初始时bestw=0,直到搜索到第一个叶结点才更新bestw。在搜索到第一个叶结点前,总有Ew+r>bestw, 此时右子树测试不起作用。
  5. 为确保右子树成功剪枝,应该在算法每一次进入左子树的时候更新bestw的值。

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

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

相关文章

【设计模式】6.代理模式

概述 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理访问目标对象 这样做的好处是&#xff1a;可以在目标对象实现的基础上,增强额外的功能操作&#xff0c;即扩展目标对象的功能。 被代理的对象可以是&#xff1a;远程对象、创建开销大的对象或需要安全…

PMP支付考试费用相关介绍

只有符合支付条件&#xff08;中文审核通过&#xff09;的考生才能进行付费。付费流程&#xff1a;同意相关承诺书-填写开票信息-选择支付方式-缴费成功一、同意相关承诺书仔细查看承诺书内容&#xff0c;对承诺书中内容进行确认&#xff0c;确认无误后&#xff0c;勾选同意点击…

电子科技大学软件工程期末复习笔记(七):测试策略

目录 前言 重点一览 V模型 回归测试 单元测试 集成测试 重要概念 自顶向下的集成方法 自底向上的集成方法 SMOKE方法 系统测试 验收测试 α测试 β测试 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲&#xff0c;供自己期末复习与学弟学妹参考用…

大数据系统自检

第一章 大数据计算系统概述 1.1 大数据计算框架概述 Hadoop Hadoop的运行过程&#xff08;5个步骤&#xff1f;&#xff09; split > map > shuffle > reduce > output Hadoop的详细运行过程&#xff1f;&#xff08;4个大过程&#xff0c;6662&#xff09; 创建…

CANoe TC8测试脚本的结构介绍

CANoe TC8脚本是通过vTESTstudio平台编写。每个协议(ARP\ICMPv4\IPv4\UDP\TCP\SOMEIP\DHCP)都有自己的vtt文件。每个vtt文件的测试树结构为: Test Fixture Fixture Preparation Test Case Test Case … Test Case Test Case Fixture Completion 当Test Fixture里的Test Case…

快速搭建数据驱动自动化测试框架

本文是根据吴晓华编著的《Selenium WebDriver 实战宝典》的16.2节&#xff1a;数据驱动框架及实战。 放在这里是为了以后有需要的时候&#xff0c;能够快速的搭建数据驱动自动化框架。 实现功能&#xff1a;成功登录qq邮箱&#xff0c;点击“通讯录”&#xff0c;新建联系人。…

漏洞复现-Billu_box

漏洞复现-Billu_box 1、确定主机IP nmap -sn 192.168.12.0/24MAC Address: 00:50:56:E9:00:06 (VMware) Nmap scan report for 192.168.12.138# 确定是192.168.12.1382、开放端口 nmap -p 1-65535 192.168.12.138 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http …

C++修炼之练气期第二层——缺省参数

目录 1.缺省参数的概念 2.缺省参数的分类 全缺省参数 半缺省参数 实用场景示例 1.缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。 在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 #inclu…

DETR(DEtection TRansforme)调试记录

下载地址&#xff1a; https://github.com/facebookresearch/detr 调试过程开始了 环境配置 我们依旧使用的是NVIDIA T4 GPU 服务器 创建conda环境 conda create -n detr python3.8conda install pytorch1.12.1 torchvision0.13.1 torchaudio0.12.1 cudatoolkit11.3 -c pyto…

Spring Boot 3.0系列【1】开篇之Spring Boot 3.0 版本新特性

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot版本&#xff1a;3.0.3 文章目录导读Spring Boot 简介简要发展史核心功能Spring Boot 3.0 新特性JDK 版本要求&#xff08;重点&#xff09;GraalVM 本地镜像支持&#xff08;重点&am…

RPC编程:Hessian RPC一个老的RPC框架(一)

RPC编程&#xff1a;Hessian RPC一个老的RPC框架一&#xff1a;Hessian RPC1&#xff1a;Hession RPC一个老的RPC框架2&#xff1a;老&#xff0c;为什么还要研究&#xff1f;3&#xff1a;Hession RPC概念二&#xff1a;Hessian RPC设计思想1&#xff1a;Hession依赖于服务器2…

卡方检验

一、卡方检验假设检验的一种&#xff0c;以实际观测值与期望值之间的偏离程度&#xff0c;解决是服从某个构成比率和是否具有相关性的问题。其偏离程度决定卡方值的大小&#xff0c;卡方值越小&#xff0c;偏差越小&#xff0c;实际值越趋于符合期望值。二、步骤在显著性为α0.…

如何防止DNS污染?

对于DNS污染&#xff0c;一般除了使用代理服务器和VPN之类的软件之外&#xff0c;并没有什么其它办法。但是利用我们对DNS污染的了解&#xff0c;还是可以做到不用代理服务器和VPN之类的软件就能解决DNS污染的问题&#xff0c;从而在不使用代理服务器或VPN的情况下访问原本访问…

大数据算法重点

1 大数据亚线性空间算法 场景&#xff1a;用二进制存储一个数字N&#xff0c;需要log(N)的空间 问题&#xff1a;如果N特别大而且这样的N又特别的多&#xff0c;该怎么办呢&#xff1f; 思路&#xff1a;减少一些准确性&#xff0c;从而节省更多的空间。 解决办法&#xff1a;使…

CentOS8基础篇8:使用systemctl管理NFS服务

一、服务简介 服务&#xff1a;是指执行指定系统功能的程序、例程或进程&#xff0c;以便支持其他程序&#xff0c;尤其是底层(接近硬件)程序。 例如&#xff1a;打印服务&#xff0c;ftp服务&#xff0c;http服务。 服务就是一个程序&#xff08;正在执行的程序&#xff09…

GG-21 100V 5A逆功率继电器

1 用途 GG-21逆功率继电器在出现逆功率时&#xff0c;从电网中断开交流发电机。 2 概述 逆功率继电器是基于感应式原理(具有旋转磁场)而工作。 继电器导磁体由两个磁路系统组成&#xff1a;上磁路系统和下磁路系统。电流线圈安装在上磁路系统中&#xff0c;它由接在发电机某相的…

机器学习|机器学习概述

目录 &#x1f4da;关于机器学习 &#x1f4da;监督学习和无监督学习 &#x1f430;监督学习 &#x1f430;无监督学习 &#x1f440;小结 &#x1f4da;关于机器学习 &#x1f308;在计算机中&#xff0c;“经验”通常以数据的形式存在。机器学习最主要的一项工作就是基…

MongoDB 详细教程,这一篇就够啦

文章目录1. 简介2. 特点3. 应用场景4. 安装&#xff08;docker&#xff09;5. 核心概念5.1 库5.2 集合5.3 文档6. 基本操作6.1 库6.1.1 增6.1.2 删6.1.3 改6.1.4 查6.2 集合6.2.1 增6.2.2 删6.2.3 改6.2.4 查6.3. 文档6.3.1 增6.3.2 删6.3.3 改6.3.4 查1. 语法2. 对比语法3. AN…

springboot使用Gateway搭建网关服务及Nacos实现动态路由

实际工作中我们会有很多个项目&#xff0c;这些项目共同使用同一个网关gateway来实现路由&#xff0c;各个项目之间调用以及前端调用都可以直接通过服务名称来调用&#xff0c;不用管ip&#xff0c;后续项目迁移到其它服务器也不受影响。 首先搭建springboot微服务&#xff0c…

智慧扫码点餐系统源码

智慧餐厅扫码点餐小程序系统源码 1. 开发语言&#xff1a;JAVA 2. 数据库&#xff1a;MySQL 3. 原生小程序 4. Saas 模式 5. 带调试部署视频 6、总后台管理端商家端门店端小程序用户端 智慧扫码点餐系统支持多店铺运营&#xff0c;单店铺运营以及连锁店铺运营。系统功能支…