【生日快乐】搜索技术【深度优先搜索】 - 回溯法

news2024/11/28 18:44:11

搜索技术【深度优先搜索】 - 回溯法

回溯法是一种选优搜索法,按照选优条件深度优先搜索,以达到目标。当搜索到某一步时,发现原先的选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术被称为回溯法,而满足回溯条件的某个状态被称为“回溯点”。

【回溯法】

算法要素

回溯法指从初始状态出发,按照深度优先搜索的方式,根据产生子节点的条件约束,搜索问题的解,当发现当前节点不满足求解条件时,就回溯,尝试其他路径。回溯法是一种“能进则进,进不了则换,换不了则退”的搜索方法。

[算法要素]

用回溯法解决实际问题时,首先要确定解的组织形式,定义问题的解空间。

① 解空间

解的组织形式: 回溯法的解的组织形式可以被规范为一个n 元组{x 1 ,x 2 ,…,xn },例如对3个物品的0-1背包问题,解的组织形式为{x ,x 2 ,x 3 }。

显约束: 对解分量的取值范围的限定。

比如有3个物品的0-1背包问题,解的组织形式为{x 1 ,x 2 ,x 3 }。它的解分量xi 的取值范围很简单,xi =0或者xi =1。xi =0表示将第i 个物品不放入背包,xi =1表示将第i 个物品放入背包,因此xi ∈{0,1}。3个物品的0-1背包问题,其所有可能解是{0,0,0}、{0,0,1}、{0,1,0}、{0,1,1}、{1,0,0}、{1,0,1}、{1,1,0}、{1,1,1}。

解空间: 顾名思义,就是由所有可能解组成的空间。二维解空间如下图所示。假设图中的每一个点都有可能是我们要的解,这些可能解就组成了解空间,而我们需要根据问题的约束条件,在解空间中寻找最优解。解空间越小,搜索效率越高。解空间越大,搜索效率越低。这犹如大海捞针,在大海里捞针相当困难,如果把解空间缩小到一平方米的海底就容易得多了。

在这里插入图片描述

② 解空间的组织结构

一个问题的解空间通常由很多可能解组成,不能像无头苍蝇一样乱飞乱撞去寻找最优解,盲目搜索的效率太低了,需要按照一定的套路即一定的组织结构搜索最优解。如果把这种组织结构用树形象地表达出来,就是解空间树。例如对3个物品的0-1背包问题,解空间树如下图所示。

在这里插入图片描述

解空间树只是解空间的形象表示,有利于解题时对搜索过程有直观理解,并不是真的要生成一棵树。有了解空间树,不管是写代码还是手工搜索求解,都能看得非常清楚,更能直接看到整个搜索空间的大小。

③ 搜索解空间

隐约束:指对能否得到问题的可行解或最优解做出的约束。

如果不满足隐约束,就说明得不到问题的可行解或最优解,就没必要再沿着该节点的分支进行搜索了,相当于把这个分支剪掉了。因此隐约束也被称为剪枝函数,实质上不是剪掉该分支,而是不再搜索该分支。

例如对3个物品的0-1背包问题,如果将前两个物品放入(x 1 =1,x 2=1)后,背包超重了,就没必要再考虑是否将第3个物品放入背包的问题,如下图所示。即对圈中的分支不再搜索了,相当于剪枝了。

在这里插入图片描述

隐约束(剪枝函数)包括约束函数和限界函数。判断能否得到可行解的函数被称为约束函数,判断能否得到最优解的函数被称为限界函数。有了剪枝函数,就可以剪掉得不到可行解或最优解的分支,避免无效搜索,提高搜索效率。剪枝函数设计得好,搜索效率就高。

解空间的大小和剪枝函数的好坏都直接影响搜索效率。因此这两项是搜索算法的关键。

在搜索解空间时,有以下几个术语需要说明。

  • 扩展节点:一个正在生成孩子的节点。
  • 活节点:一个自身已生成,但孩子还没有全部生成的节点。
  • 死节点:一个所有孩子都已经生成的节点。
  • 子孙:节点e 的子树上所有节点都是e 的子孙。
  • 祖宗:从节点e 到树根路径上的所有节点都是e 的祖宗。

解题秘籍

① 定义解空间。因为解空间的大小对搜索效率有很大的影响,因此使用回溯法时首先要定义合适的解空间,包括解的组织形式和显约束。

  • 解的组织形式:将解的组织形式都规范为一个n 元组{x 1 ,x 2 ,…,xn },只是对具体问题表达的含义不同而已。
  • 显约束:显约束是对解分量的取值范围的限定,可以控制解空间的大小。

② 确定解空间的组织结构。解空间的组织结构通常以解空间树形象地表达,根据解空间树的不同,解空间分为子集树、排列树、m 叉树等。

③ 搜索解空间。按照深度优先搜索策略,根据隐约束(约束函数和限界函数),在解空间中搜索问题的可行解或最优解。当发现当前节点不满足求解条件时,就回溯,尝试其他路径。如果问题只是求可行解,则只需设定约束函数即可,如果要求最优解,则需要设定约束函数和限界函数。解的组织形式都是通用的n 元组形式,是解空间的形象表达。解空间和隐约束是控制搜索效率的关键。显约束可以控制解空间的大小,约束函数决定剪枝的效率,限界函数决定是否得到最优解。所以回溯法解题的关键是设计有效的显约束和隐约束。

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

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

相关文章

如何用 Elasticsearch 实现 Word、PDF,TXT 文件的全文内容检索?

简单介绍一下需求 能支持文件的上传,下载 要能根据关键字,搜索出文件,要求要能搜索到文件里的文字,文件类型要支持 word,pdf,txt 文件上传,下载比较简单,要能检索到文件里的文字&am…

2022-ISCTF-部分MISC和PWN

misc 两层编码 第一层 sha256掩码爆破 第二层 base64解码找到key import string,sys from hashlib import sha256 from multiprocessing import Process from Crypto.Util.number import * from pwn import * import base64 from primefac import * context(log_leveldebug)…

【STL】容器 - set和map的使用

目录 前言 一.键值对 1.在SGI - STL中对键值对的定义: 2.make_pair 二.set 1.set的概念与注意事项 2.set的使用(常用接口) <1>.构造函数 <2>.迭代器与范围for <3>.插入和查找 <4>.删除erase <5>.计数count 三.map 1.map的概念与注…

洛谷千题详解 | P1012 [NOIP1998 提高组] 拼数【C++、Java语言】

博主主页&#xff1a;Yu仙笙 专栏地址&#xff1a;洛谷千题详解 目录 题目描述 输入格式 输出格式 输入输出样例 解析&#xff1a; C源码&#xff1a; C源码2&#xff1a; C源码3&#xff1a; Java源码&#xff1a; ---------------------------------------------------------…

element-ui upload图片上传组件使用

图片上传前端收集 数据 再调用接口发送到后端 组件标签内的参数&#xff1a; 参数说明类型可选值默认值action必选参数&#xff0c;上传的地址string——headers设置上传的请求头部object——multiple是否支持多选文件boolean——data上传时附带的额外参数object——name上传…

【数据结构】链表OJ第一篇 —— 移除链表元素 反转链表 合并两个有序链表

文章目录0. 前言1. 移除链表元素2. 反转链表3. 合并两个有序链表4. 结语0. 前言 上篇博客中&#xff0c;我们学习了实现了单链表。但是仅仅实现并不算掌握&#xff0c;所以我们需要做些题目来练习巩固。而从今天开始的几期&#xff0c;anduin 都会为大家带来链表OJ题&#xff…

在Linux环境下VScode中配置ROS、PCL和OpenCV开发环境记录

一.安装必要的插件 打开VScode&#xff0c;在开展中安装CMake、CMake Tools&#xff0c;ROS和catkin-tools插件&#xff0c;截图如下&#xff0c;安装后重新打开VScode插件生效。 二.创建ROS工作空间 在选择的路径下&#xff0c;打开终端创建工作空间&#xff0c;具体命令如下…

【概率论笔记】正态分布专题

文章目录一维正态分布多维正态分布n维正态分布二维正态分布一维正态分布 设X~N(μ,σ2)X\text{\large\textasciitilde}N(\mu,\sigma^2)X~N(μ,σ2)&#xff0c;则XXX的概率密度为f(x)12πσe−(x−μ)22σ2f(x)\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}}f(…

WXML模板语法

文章目录1、数据绑定1.1 数据绑定的基本原则1.2在data中定义页面的数据1.3 Mustache语法的格式1.4 Mustache语法的应用场景1.5 算数运算2、事件绑定2.1 小程序常用的事件2.2事件对象的属性列表2.3 target和currentTarget的区别2.4 <font colorred>bindtap的语法格式2.5 在…

狗厂员工来面试本想难为一下,结果被虐得连console.log也不敢写了

这次说到的面试题是关于node服务端内存溢出的问题&#xff0c;狗厂员工来面试本想难为一下&#xff0c;现在我连console.log也不敢写了 关于这道node内存溢出的问题&#xff0c;大哥从以下几个方面讲的&#xff0c;讲完我觉得自己得到了升华&#xff0c;现在搞得连代码也快不敢…

2.24 OrCAD Cadence16.6怎么更改原理图中做好的库文件?

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

FPGA代码设计规范一些探讨

代码设计规范的重要性 经过一段的工作积累已经慢慢进入了提高和进阶的阶段&#xff0c;在这篇博客里多聊一聊在现实工作中的话题&#xff0c;比如代码规范以及如何尽快接手前人代码&#xff0c;快速定位项目问题。 显然每个FPGA工程师的设计理念和代码风格很多情况下有一些差别…

python 基于PHP+MySQL的学生成绩管理系统

学生成绩管理是每一个学校都会面临的一个问题,传统的管理模式已经明显到和时代不同步。通过我对当前学校成绩管理的需求和自己的实习经验整理出了一个能够满足大多数学校的学生成绩管理系统。本系统分为管理人员,教师和学生三种用户,每种用户各负责其一部分功能然后通过他们的整…

Web前端开发基础教程二

注释和特殊字符&#xff1a; 如果需要在html文档添加一些便于阅读和理解但又不需要显示在页面中的注释文字&#xff0c;就需要使用注释标签。 html中的注释以“<!--”开头&#xff0c;以“-->”结束或者快捷键&#xff1a;Ctrl/。 举例&#xff1a; <!-- 我想放假 …

【实战】Mysql 千万级数据表结构变更 、含脚本

一、实测结果 业务无感知&#xff0c;无死锁平滑 线上800万数据以下 直接使用 alter 新增字段 300ms左右 2000万数据&#xff0c;强制使用主键索引&#xff0c;每次查询50万数据 并插入新表 &#xff0c;耗时 20s &#xff0c;cpu 占45% 二、整体步骤 创建新表 biz_table_ne…

Vue-脚手架的创建

本篇vue3的脚手架主要是使用vue-cli进行创建&#xff0c;有网的情况下才能创建成功 文章目录一、下载node.js二、全局安装vue/cli三、使用vue-cli创建项目3.1 使用vscode打开终端3.2 创建项目3.3 创建成功四、注意事项一、下载node.js 1、打开node的官网 node官网 2、点击下方图…

Oxygen XML Editor 25.0.X Crack

XML 编辑器 Oxygen XML Editor 是完整的 XML 编辑解决方案&#xff0c;适用于 XML 开发人员和内容作者。它提供了必备的 XML 编辑工具&#xff0c;涵盖了大多数 XML 标准和技术。Oxygen XML Editor 包括 Oxygen XML Developer 和 Author 的所有功能。 特点与技术 单一来源出版 …

【树莓派不吃灰】使用frp内网穿透,实现远程访问树莓派

目录1. 前言2. frp内网穿透2.1 概述2.2 实现原理3. 开源frp项目4. 公网服务器选型5. 下载frp软件5.1 公网服务器下载frp服务器5.1.1 github选择适合服务端的版本5.1.2 公网服务器进行下载解压5.2 树莓派下载frp客户端5.2.1 github选择适合客户端的版本5.2.2 树莓派进行下载解压…

流形上的预积分(上)

预积分和流形 论文&#xff1a;IMU Preintegration on Manifold for Effificient Visual-Inertial Maximum-a-Posteriori Estimation 引言 Recent results in monocular visual-inertial navigation (VIN) have shown that optimization-based approaches outperform filteri…

免费体验CSDN云IDE使用指南

云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间啦~ 官方活动入口 文章目录1.免费体验CSDN云IDE使用指南1.1云IDE优点2.自己的代码在云IDE上跑起来看看如何操作2.1 克隆开源仓库2.2 创建一个空工作空间2.3 使用默认模板代…