五大常用算法之五:分支限界法

一、基本描述类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

一、基本描述

    类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解

   (1)分支搜索算法

    所谓“分支”就是采用广度优先的策略,依次搜索E-结点的所有分支,也就是所有相邻结点,抛弃不满足约束条件的结点,其余结点加入活结点表。然后从表中选择一个结点作为下一个E-结点,继续搜索。http://hovertree.com/

     选择下一个E-结点的方式不同,则会有几种不同的分支搜索方式。

   1)FIFO搜索

   2)LIFO搜索

   3)优先队列式搜索

(2)分支限界搜索算法 

二、分支限界法的一般过程

    由于求解目标不同,导致分支限界法与回溯法在解空间树T上的搜索方式也不相同。回溯法以深度优先的方式搜索解空间树T,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T

    分支限界法的搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。

    分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。在搜索问题的解空间树时,分支限界法与回溯法对当前扩展结点所使用的扩展方式不同。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,那些导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。

三、回溯法和分支限界法的一些区别

    有一些问题其实无论用回溯法还是分支限界法都可以得到很好的解决,但是另外一些则不然。也许我们需要具体一些的分析——到底何时使用分支限界而何时使用回溯呢?

回溯法和分支限界法的一些区别:

   方法对解空间树的搜索方式       存储结点的常用数据结构      结点存储特性常用应用

  回溯法深度优先搜索堆栈活结点的所有可行子结点被遍历后才被从栈中弹出找出满足约束条件的所有解

  分支限界法广度优先或最小消耗优先搜索队列、优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或特定意义下的最优解

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120452.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux 下gz文件解压命令,Linux解压gz文件的命令怎么写

    linux 下gz文件解压命令,Linux解压gz文件的命令怎么写Linux解压gz文件的命令怎么写发布时间:2020-11-1713:39:53来源:亿速云阅读:122作者:小新小编给大家分享一下Linux解压gz文件的命令怎么写,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!gz文件是一种压缩文件,以.gz或者.tar.gz(.tgz)为扩展名,在Linux、UNIX和OSX下常见…

    2022年5月20日
    41
  • u8和u16是什么意思_u8在哪里声明的

    u8和u16是什么意思_u8在哪里声明的unsignedint32(C语言标准表达方法)2.uint32_t;3.u32;这三种表达式是同一个意思,只是在不用的版本当中,为了兼容旧版本而出现这么多的表达方式。但不管怎么变化,都是基于标准c。主要用处是为了在定义数据类型的时候少写几个符号。unsignedchar=uint8_t=u8unsignedshortint=…

    2022年10月15日
    0
  • javascript常见编程模式举例

    javascript常见编程模式举例

    2021年11月16日
    48
  • 一致性哈希算法原理及代码实现「建议收藏」

    一致性哈希算法原理及代码实现「建议收藏」一致性哈希安装goget-ugithub.com/junhaideng/consistent使用c:=consistent.New()ips:=[]string{“192.168.0.1″,”192.168.0.2″,”192.168.0.3″,”192.168.0.4”}for_,ip:=rangeips{c.Add(ip)}fmt.Println(“ip:”,c.Get(“/hello.txt”))背景在介绍一致性哈希之前,首先来看

    2022年7月27日
    4
  • 美化包软件_手机音量进度条 插件

    美化包软件_手机音量进度条 插件前言在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别。有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点。

    2022年7月31日
    3
  • 深入了解Vue.js组件笔记

    深入了解Vue.js组件笔记

    2021年6月12日
    104

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号