广度优先搜索算法

这篇具有很好参考价值的文章主要介绍了广度优先搜索算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 点睛

树的广度优先搜索实际上就是层次遍历。首先遍历第 1 层,然后第 2 层......同一层次按照从左到右的顺序访问,直到最后一层。一棵树如下图所示,先遍历第 1 层 A,然后遍历第 2 层的 B 和 C,再遍历第 3 层的 D、E、F,最后遍历第 4 层的 G。

二 分支限界法

分支限界法通常以广度优先或最小耗费(最大效益)优先的方式搜索问题的解空间树。活节点表是关键数据结构。活节点表的实现通常有两种形式:一种是普通队列,即先进先出队列,另外一种是优先级队列,按照优先级决定哪个节点为当前扩展节点。根据活节点表不同,分支限界法分为以下两种:队列式分支限界法和优先队列分支限界法。

分支限界法的问题秘籍如下。

1 定义解空间

2 确定解空间的组织结构

3 搜索解空间

三 队列式分支限界法解决背包问题算法设计

1 定义问题的解空间

背包问题属于典型的 01 背包问题,问题的解是从 n 个物品张选择一些物品,使其在不超过容量的情况下价值最大。每个物品都有且只有两种状态:要么被装入,要么不被装入。那么第 i 个物品被装入达到目标还是不被装入呢?显然还不确定。因此,可以用变量 Xi 表示第 i 个物品是否被装入背包的状态,用 0 表示不被装入,用 1 表示被装入。问题的解空间是{x1,x2,......xn},其中 xi = 0 或 xi = 1。

2 确定解空间的组织结构

问题的解空间描述了 2 的 n 次方种可能的解,解空间树为子集树,解空间树的深度为问题的规模 n。

3 搜素解空间

对于任何一个中间节点 z,从根节点到 z 节点的分支所代表的状态已确定,从 z 到其子孙节点的分支状态待确定。也就是说,如果 z 在解空间树中所处的层次是 t,则说明从第 1 种物品到第 t-1 种物品的状态已确定,只需沿着 z 的分支扩展确定第 t 种物品的状态,前 t 种物品的状态就确定了。在前 t 中物品的状态确定后,对当前已转入背包的物品的总重量用 cw 表示,对总价值用 cp 表示。

3.1 约束条件

判断第 i 个物品被装入背包后总重量是否超出背包容量,如果超出,则为不可行解;否则为可行解。约束条件为 cw+w[i]<=W。其中 w[i] 为第 i 个物品的重量,W 为背包容量。

3.2 限界条件

已装入物品的价值高不一定就是最优的,因为还有剩余物品未确定。目前还不确定第 t+1 种物品到第 n 种物品的实际状态,因此只能用估计值。假设第 t+1 种物品到第 n 种物品都被装入背包,对第 t+1 种物品到第 n 种物品的总价值为 rp 来表示。因此 cp+rp 是所有从根出发经过中间节点 z 的可行解的价值上界。如果价值上界小于当前搜索到的最优解,则说明从中间节点 z 继续向子孙节点搜索不可能得到一个比当前更优的可行解。没有继续搜索的必要,反之,继续向 z 的子孙节点搜索。因此限界条件为 cp+rp>=bestp

3.3 搜索过程

从根节点开始,以广度优先的方式进行搜索。根节点首先成为活节点,也就是当前扩展节点。一次性生成所有孩子节点,由于在子集树中约定左子树值为“1”,因此沿着扩展节点左分支扩展,则代表装入物品;由于在子树集中约定右分支的值为“0”,因此沿着扩展节点的右分支扩展,则代表不装入物品。此时判断是否满足约束条件和限界条件,如果满足则加入队列中,反之,则舍弃。然后从队列中取出一个元素,作为当前扩展节点,直到搜索过程队列为空为止。

四 图解

有一个背包和 4 个物品,每个物品的重量和价值都如下图所示,背包的容量 W=10,求在不超过背包容量的前提下,把哪些物品放入背包才能获得最大价值。

广度优先搜索算法

1 初始化

sumw 和 sumv 分别用来统计所有物品的总重量和总价值。sumw=13,sumv=18,sumw>W,因此不能全部装完,需搜索求解。初始化当前放入背包的物品价值 cp=0,当前剩余物品价值 rp=sumv=18,当前剩余容量 rw=W,当前处理物品序号为 1 且当前最优值 bestp=0。解向量 x[]=(0,0,0,0),创建一个根节点 Node(cp,rp,rw,id),将其标记为 A 并加入队列 q 中。cp 为装入背包的物品价值,rp 为剩余物品的总价值,rw 为剩余容量,id 为物品号,x[] 为当前解向量。

广度优先搜索算法

2 扩展节点 A

广度优先搜索算法

3 扩展节点 B

广度优先搜索算法

4 扩展节点 C

广度优先搜索算法

5 扩展节点 D

广度优先搜索算法

6 扩展节点 E

广度优先搜索算法

7 扩展节点 F

广度优先搜索算法

8 扩展节点 G

对头元素 G 出队,该节点的 cp+rp<bestp=11,不满足限界条件,不扩展。

广度优先搜索算法

9 扩展节点 H

广度优先搜索算法

10 扩展节点I

广度优先搜索算法

11 队头元素 J 出队

不满足限界条件,不再扩展。

12 队头元素 K 出队

扩展节点 K,t =5,已经处理完毕,cp<bestp,不是最优解。

13 队头元素 L 出队

扩展节点 L,t =5,已经处理完毕,cp=bestp,是最优解,输出该解向量(1,0,1,1)文章来源地址https://www.toymoban.com/news/detail-419095.html

14 队列为空,算法结束。

到了这里,关于广度优先搜索算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++

    深度优先搜索(DFS)和广度优先搜索(BFS)是一种用于遍历或搜索树图的一种算法,在这个过程中保证图或数的每个结点被访问且仅被访问一次,再按照每个结点访问的顺序不同分为深搜和广搜。 本文只讨论这两种算法在搜索方面的应用! 深度优先搜索 ( Depth-First-Search,DFS )它 沿

    2024年02月13日
    浏览(47)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(50)
  • Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

    深度优先搜索( DFS )和广度优先搜索( BFS )是两种常用的图遍历算法,用于在图中搜索目标节点或遍历图的所有节点。本篇博客将介绍 DFS 和 BFS 算法的基本概念,并通过实例代码演示它们的应用。 😃😄 ❤️ ❤️ ❤️ 深度优先搜索( DFS )是一种用于遍历或搜索图或树

    2024年02月07日
    浏览(65)
  • 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)

    从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次。(连通图与非连通图) 1、访问指定的起始顶点; 2、若当前访问的顶点的邻接顶点有未被访问的,则任选一个访问之;反之,退回到最近访问过的顶点;直到与起始顶点相通的全部顶点都访问完毕; 3、若

    2024年01月17日
    浏览(46)
  • Python 图算法,图最短路径,图广度优先搜索,图深度优先搜索,图排序

    一、图数据库相关算法 图数据库是一种专门用来存储和处理图数据的数据库系统。它使用图结构来表示数据之间的关联关系,以及节点和边之间的属性信息。以下是一些常用的图数据库算法: 1. 最短路径算法:最短路径算法用于计算图中两个节点之间的最短路径,例如Dijk

    2024年02月15日
    浏览(34)
  • 【Python搜索算法】广度优先搜索(BFS)算法原理详解与应用,示例+代码

    目录 1 广度优先搜索     2 应用示例 2.1 迷宫路径搜索 2.2 社交网络中的关系度排序 2.3 查找连通区域         广度优先搜索(Breadth-First Search,BFS)是一种图遍历算法,用于系统地遍历或搜索图(或树)中的所有节点。BFS的核心思想是从起始节点开始,首先访问其所有相

    2024年02月08日
    浏览(46)
  • 图论算法|深度优先搜索理论基础|797.所有可能的路径|广度优先搜索BFS理论基础|200. 岛屿数量

    dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 递归和回溯是相辅相成的 https://leetcode.cn/problems/all-paths-from-source-to-target/ 有向无环图(DAG): 有环无向图是指在图中存在至少一个环(Cycle)的无向图。环是

    2024年02月15日
    浏览(56)
  • 数据结构与算法基础-学习-24-图的遍历之DFS(深度优先搜索)和BFS(广度优先搜索)

    目录 一、遍历定义 二、遍历实质 三、DFS 四、BFS 五、宏定义 六、自定义类型 七、函数实现 1、DFS(邻接矩阵实现) 2、DFS(邻接表实现) 3、BFS(邻接矩阵实现) 4、BFS(邻接表实现) 5、打印邻接矩阵遍历顺序  6、打印邻接表遍历顺序 八、遍历算法效率分析 1、DFS 2、BFS 九

    2024年02月03日
    浏览(72)
  • 【数据结构与算法】图的搜索——广度优先遍历、最小生成树

    邻接链表: 用字典实现.有向图的邻接链表的总长度等于图的边个数;无向图的邻接链表的总长度等于图的边个数的2倍. 邻接矩阵:用于最短路径算法. 该数据结构维护一个不相交动态集的集合,每个集合有一个代表,不关心谁做代表。 支持三种操作: MAKE_SET(x) FIND_SET(x) UNION(x,y

    2024年02月19日
    浏览(49)
  • 广度优先搜索(BFS)算法求解单源最短路径问题

      单源最短路径问题是图论中一类重要且常见的应用问题。在这个问题中,我们需要找到从一个给定源节点到其他节点的最短路径。广度优先搜索(BFS)算法是一种常用且有效的求解这一问题的算法。   本篇博客将重点讨论单源最短路径问题及其实际应用,同时简要介绍

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包