【S8-回溯法】

回溯法

回溯算法主要针对于**搜索问题**或优化问题,这类问题的满足显示约束)尝分布在一个解空间中,因此也就是在解空间中找到一个可行解(最优解)或者所有的可行解(最优解)。
回溯算法通常将此搜索空间看作一定的树形结构,称之为解空间树,采用一种“走不通就掉头的搜索策略”,相当于从根节点开始对解空间树进行深度优先搜索,。

回溯法的基本概念

回溯法的解需要满足一组综合的约束条件,通常分为:显式约束隐式约束

  • 显式约束条件: 限定每个x只从一个给定的集合上取值。(可能与问题实例I有关,也可能无关。)

满足显式约束的所有元组确定一个可能的解空间。

  • 隐式约束条件: 规定了实例I的解空间中那些满足规范函数的元组,描述了xi必须彼此相关的情况。(与问题实例I有关)

解空间中满足隐式约束条件的元组称为可行解。

  • 问题状态(problem state):树中的每一个结点确定所求解问题的一个问题状态。
  • 状态空间(state space):由根结点到其他结点的所有路径确定了这个问题的状态空间。
  • 解状态(solution states): 是这样一些问题状态S,对于这些问题状态,由根到S的那条路径确定了这个解空间中的一个元组。
  • 答案状态(answerstates):是这样的一些解状态S,对于这些解状态而言,由根到S的这条路径确定了这问题的一个解(满足隐式约束条件)。
  • in all,问题状态->解状态->答案状态。
  • 状态空间树(state space tree):解空间的树结构,包括所有结点及所有边(由根到各结点的路径)。
  • 算法的目标就是搜索整棵状态空间树,寻找答案结点。
  • 静态树:状态空间树结构与所要解决问题的实例无关。
  • 动态树:状态空间树结构与所要解决问题的实例有关。
  • 活结点:一个结点如果已被生成,而它的所有儿子结点还没有全部生成,则称这个结点为“活结点”,表示开始处理但还没有完全处理完的结点;
  • 死结点:其儿子已全部生成或在该结点剪枝,从而无需向下扩展的结点,称为“死结点”,表示已经处理完毕的结点;
  • E-结点:当前正在生成其儿子结点的活结点,称为“E-结点”(正在扩展的结点),即正在处理的结点。

回溯法的搜索过程
从根结点出发,以深度优先方式搜索整个解空间。
首先,根结点成为一个活结点,同时也成为当前的扩展结点。
在当前扩展结点处,搜索向纵深方向移至一个新结点,该新结点成为一个新的活结点,并成为当前扩展结点。
如果在当前扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。此时应回溯至最近的一个活结点处,并使该活结点成为当前的扩展结点,继续执行第②步。
回溯法以这种方式递归地在解空间中搜索, 直至找到所要求的解或解空间中已没有活结点时为止。
问题状态的生成
第一种状态生成方法:当前的E-结点R一旦生成一个新的儿子结点C,这个C结点就变成一个新的E-结点,当检测完了子树C后,R结点就再次成为E-结点,生成下一个儿子结点。(该方法也称为深度优先结点生成法)
第二种状态生成方法:一个E-结点一直保持到变成死结点为止。它又分为两种方法:宽度优先生成方法(队列方法)和D-检索方法(栈方法)
第一种状态生成方法对应回溯法(加限界的深度优先生成方法)。
第二种状态生成方法对应分枝-限界法。

回溯算法的形象化描述

在这里插入图片描述

算法8.1 回溯的一般方法

BACKTRACK
在这里插入图片描述

算法8.2 递归回溯算法

RBACKTRACK
在这里插入图片描述

4皇后问题

解空间树:
在这里插入图片描述
xi:代表第i个皇后位于第xi列。

子集和数问题

在这里插入图片描述
子集和的解形式:

  • n元组:在这里插入图片描述

  • n元组的解空间树:在这里插入图片描述在这里插入图片描述

  • k元组:在这里插入图片描述

  • k元组的解空间树:在这里插入图片描述
    在这里插入图片描述

效率估计

回溯算法的效率主要取决于4个因素:

  • 生成下一个X(k)的时间(生成结点的时间)
  • 满足显式约束条件的X(k)的数目(子结点的数量)
  • 限界函数Bi的计算时间(检验结点的时间)
  • 满足Bi的X(k)的数目(通过检验的结点数量)
    一旦选定了一种状态空间树结构,前三种因素与所要解决问题的实例无关,只有第四种因素,对于问题的不同实例,生成的通过检验的结点数是不相同的。
    易知,回溯算法最坏情况下的时间复杂度为O(p(n)2n)或O(q(n)n的阶乘),其中p(n)和q(n)为n的多项式。

蒙特卡罗方法进行效率估计

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

算法8.3 估计回溯法的效率

ESTIMATE
在这里插入图片描述

8皇后问题

对于判断任两个皇后是否在同一斜对角线的判定:设有两个皇后被放置在(i, j )和(k, l )位置上, 那么当且仅当
i-j = k-l 或 i+j = k+l 时, 它们才在同一条斜角线上。将这两个等式分别变换成: j-l = i-k 或 j-l = k-i 。因此当且仅当 |j-l|=|i-k| 时( 即两个皇后所在位置的行差距等于列差距时),两个皇后在同一条斜角线上。

算法8.4 可以放置一个新皇后吗

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

算法8.5 n-皇后问题的所有解

在这里插入图片描述

估算NQUEENS所生成结点数

在这里插入图片描述
要会求状态空间树的结点总数不受限的结点总数

### S8-0053 使用手册概述 #### 一、产品简介 S8-0053 是一款二氧化碳传感器,能够通过串口其他设备相连实现通信功能。该传感器的应用场景非常广泛,适用于多种环境监测需求。 #### 二、硬件连接说明 对于 S8-0053 的硬件连接部分,其主要特点是直接串口相接即可完成基本的数据交互操作[^3]。 #### 三、软件配置指南 为了使 S8-0053 正常工作,在初始化阶段需按照如下参数设定串口属性: - 波特率:9600 bps - 数据位:8 bits - 停止位:1 bit - 校验方式:无奇偶校验 以上设置确保了后续命令帧的有效传输以及响应消息的正确接收处理过程顺利进行。 #### 四、指令集解析 当向 S8-0053 发送查询请求时,应构建特定格式的消息体来获取目标寄存器内的数值信息。具体而言,一条完整的读取 CO₂ 浓度值的操作由以下几个字节构成: | 字段 | 含义 | | --- | ---- | | `FE` | 地址码,表示任意节点均可回应此条询问语句 | | `04` | 功能码,代表本次调用意在访问输入型存储区域而非保持型内存空间 | | `00 03` | 寄存器起始位置偏移量 | | `00 01` | 请求读出记录项总数目 | | `D5 C5` | CRC 循环冗余检验序列 | 执行上述动作之后,如果一切正常,则会收到含有实际测量结果在内的反馈报文,形式上表现为另一组有序排列好的十六进制数列:“FE 04 02 **XX YY** ZZ”,其中加粗标注的部分即为所关心的目标变量——空气中CO₂含量的具体表现形态;而最后两位则继续承担着错误检测机制的角色。 ```python import serial from crcmod.predefined import mkPredefinedCrcFun crc_fun = mkPredefinedCrcFun('modbus') def read_co2_concentration(port_name='/dev/ttyUSB0'): ser = serial.Serial( port=port_name, baudrate=9600, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=1) request_data = bytearray([0xFE, 0x04, 0x00, 0x03, 0x00, 0x01]) crc_value = crc_fun(request_data).to_bytes(2,'little') request_data.extend(crc_value) ser.write(request_data) response = ser.readall() if len(response) >= 7 and response[:2].hex() == 'fe04': concentration_high_byte = int.from_bytes(response[3:4], byteorder='big', signed=False) concentration_low_byte = int.from_bytes(response[4:5], byteorder='big', signed=False) co2_ppm = (concentration_high_byte << 8) + concentration_low_byte return f'当前环境中CO₂浓度为{co2_ppm}ppm' else: raise Exception('未能成功获得有效回复') if __name__ == '__main__': try: result = read_co2_concentration('/dev/ttyUSB0') # 替换成自己的端口号 print(result) except Exception as e: print(e) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ImSev7en_1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值