五大常用算法之分支定界法

五大常用算法之分支定界法看了五大常用算法之一这篇博文,感觉理解了很多,可是纯粹都是理论,缺少一些示例,所以准备综合一篇博文,以帮助自己记忆,原文:一、基本描述   类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

看了五大常用算法之一这篇博文,感觉理解了很多,可是纯粹都是理论,缺少一些示例,所以准备综合一篇博文,以帮助自己记忆,原文:

http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741378.html

一、基本描述

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

   (1)分支搜索算法

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

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

   1)FIFO搜索

   2)LIFO搜索

   3)优先队列式搜索

(2)分支限界搜索算法 

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

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

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

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

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

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

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

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

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

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

其他更好的解释:

分支定界 (branch and bound) 算法是一种在问题的解空间树上搜索问题的解的方法。但与回溯算法不同,分支定界算法采用广度优先或最小耗费优先的方法搜索解空间树,并且,在分支定界算法中,每一个活结点只有一次机会成为扩展结点。

利用分支定界算法对问题的解空间树进行搜索,它的搜索策略是:

1 .产生当前扩展结点的所有孩子结点;

2 .在产生的孩子结点中,抛弃那些不可能产生可行解(或最优解)的结点;

3 .将其余的孩子结点加入活结点表;

4 .从活结点表中选择下一个活结点作为新的扩展结点。

如此循环,直到找到问题的可行解(最优解)或活结点表为空。

从活结点表中选择下一个活结点作为新的扩展结点,根据选择方式的不同,分支定界算法通常可以分为两种形式:

1 . FIFO(First In First Out) 分支定界算法:按照先进先出原则选择下一个活结点作为扩展结点,即从活结点表中取出结点的顺序与加入结点的顺序相同。

2 .最小耗费或最大收益分支定界算法:在这种情况下,每个结点都有一个耗费或收益。假如要查找一个具有最小耗费的解,那么要选择的下一个扩展结点就是活结点表中具有最小耗费的活结点;假如要查找一个具有最大收益的解,那么要选择的下一个扩展结点就是活结点表中具有最大收益的活结点。

FIFO分支定界算法

因为没有一个感觉好的说明,固贴上两个网址上的算法,有兴趣可以看一看。

FIFO分支定界算法初探

http://www.21shipin.com/html/62062.shtml

常用算法大全-分枝定界

http://www.cppblog.com/ivenher/articles/1777.html

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

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

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


相关推荐

  • ubuntu 安装apt_Unable to locate package vim

    ubuntu 安装apt_Unable to locate package vimubuntu通过apt命令快速安装指定版本的nginx先安装nginx依赖的第三方包sudoaptinstallcurlgnupg2ca-certificateslsb-release添加nginx官方的ubuntu的apt源echo”debhttp://nginx.org/packages/ubuntu`lsb_release-cs`nginx”\|sudotee/etc/apt/sources.list.d/nginx.list新增

    2022年9月16日
    0
  • lombok 插件_lombok插件作用

    lombok 插件_lombok插件作用在开发中,使用lombok插件能给程序开发带来极大的便利,省去Getter、Setter等无技术含量的重复代码,让我们更专注于代码的逻辑设计。lombok插件安装往往会有一些问题,IDE直接下载安装往往是失败的。这里,我给大家写一篇lombok安装的教程:1.首先查看IDEA的版本2.去官网下载对应版本的lombok插件,地址:http://plugins.jetbrains….

    2022年9月8日
    1
  • 使用阻塞队列实现线程同步_线程可以并行执行吗

    使用阻塞队列实现线程同步_线程可以并行执行吗一、串行,并行,并发1.名称解释串行:程序按顺序执行,同一时间只能执行一个程序,前一个执行完毕后才轮到后一个并行:多个程序可以同时执行,宏观和微观上看程序都是同时执行并发:同一时刻只有一条程序

    2022年8月16日
    13
  • 视频监控传输设备_网络视频监控平台

    视频监控传输设备_网络视频监控平台高清视频传输系统传输系统是整个社会治安视频监控网络的数据传送平台,承担着平安城市从接入点中心以之间的视频数据传输重担,是搭建整个监控网络的血脉,因此,治安视频监控网络传输系统将采用全数字化的计算机网络传输系统,从监控点的接入到监控中心的数据汇聚完全采用全数字化通道,整个传输网络结构主干万兆汇聚,千兆到监控点接入,户外接入层交换机选用宽温宽压工业级交换机产品,保证视频数据的无阻塞、无延迟传输以及与原…

    2022年10月4日
    0
  • Asp.Net MVC模型验证正则表达式[通俗易懂]

    Asp.Net MVC模型验证正则表达式[通俗易懂][RegularExpression(@”^\+?[1-9][0-9]*$”,ErrorMessage=”排序内容必须为不小于1的正整数”)][Display(Name=”排序”)]publicoverrideNullable<int>OrderNum{get;set;}参考地址mvc模型验证及正则表达式如何在MVC3正则表达式中为NOTNULL或ZERO提供数据注释验证模型验证表达式可叠加[NotNullExpression]//非空[Regula

    2022年7月22日
    7
  • sql中的declare_如何声明变量

    sql中的declare_如何声明变量在sql语句中添加变量。declare @local_variabledata_type声明时需要指定变量的类型,可以使用set和select对变量进行赋值,在sql语句中就可以使用@local_variable来调用变量 声明中可以提供值,否则声明之后所有变量将初始化为NULL。 例如:declare@idint

    2022年8月20日
    6

发表回复

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

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