当前位置: 首页 > news >正文

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

为什么80%的码农都做不了架构师?>>>   hot3.png

一、基本描述

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

(1)分支搜索算法

所谓“分支”就是采用广度优先的策略,依次搜索E-结点的所有分支,也就是所有相邻结点,抛弃不满足约束条件的结点,其余结点加入活结点表。然后从表中选择一个结点作为下一个E-结点,继续搜索。 选择下一个E-结点的方式不同,则会有几种不同的分支搜索方式。 1)FIFO搜索 2)LIFO搜索 3)优先队列式搜索

(2)分支限界搜索算法

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

由于求解目标不同,导致分支限界法与回溯法在解空间树T上的搜索方式也不相同。 回溯法以深度优先的方式搜索解空间树T,而 分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树T。 分支限界法的 搜索策略是:在扩展结点处,先生成其所有的儿子结点(分支),然后再从当前的活结点表中选择下一个扩展对点。为了有效地选择下一扩展结点,以加速搜索的进程,在每一活结点处,计算一个函数值(限界),并根据这些已计算出的函数值,从当前活结点表中选择一个最有利的结点作为扩展结点,使搜索朝着解空间树上有最优解的分支推进,以便尽快地找出一个最优解。 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。问题的 解空间树是表示问题解空间的一棵有序树,常见的有子集树和排列树。在搜索问题的解空间树时,分支限界法与回溯法对当前扩展结点所使用的扩展方式不同。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,那些导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被子加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所求的解或活结点表为空时为止。

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

有一些问题其实无论用回溯法还是分支限界法都可以得到很好的解决,但是另外一些则不然。也许我们需要具体一些的分析——到底何时使用分支限界而何时使用回溯呢? 回溯法和分支限界法的一些区别: 方法对解空间树的搜索方式   存储结点的常用数据结构      结点存储特性常用应用 回溯法深度优先搜索堆栈活结点的所有可行子结点被遍历后才被从栈中弹出找出满足约束条件的所有解 分支限界法广度优先或最小消耗优先搜索队列、优先队列每个结点只有一次成为活结点的机会找出满足约束条件的一个解或特定意义下的最优解 来源: 红脸书生

转载于:https://my.oschina.net/ecp/blog/635396

相关文章:

  • Swift 中的函数(上)
  • IOS开发中UILabel单行、多行文本计算高度、宽度的技巧
  • 盲修瞎练路漫漫,名师点化三日成[转]
  • jsp 页面和 jsp标记
  • 给包文件增加注释
  • 纯手动编译安装LAMP,   cacti , nagios , zabbix
  • Maven学习 (一) 搭建Maven环境
  • 1、绪论
  • forward内部跳转 和redirect重定向跳转的区别
  • iOS版微软自拍App上架:自然美颜 上手简单
  • JAVA - 多线程 两种方法的比较
  • elasticsearch插件安装
  • 会话状态保持,JSESSIONID,COOKIE,URL重写
  • python 的SimpleXMLRPCServer,xmlrpclib
  • issues about Facebook Login
  • gops —— Go 程序诊断分析工具
  • HTTP中GET与POST的区别 99%的错误认识
  • Object.assign方法不能实现深复制
  • web标准化(下)
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 一文看透浏览器架构
  • 最近的计划
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # Java NIO(一)FileChannel
  • # 达梦数据库知识点
  • ###C语言程序设计-----C语言学习(3)#
  • #define 用法
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (ibm)Java 语言的 XPath API
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (状压dp)uva 10817 Headmaster's Headache
  • .CSS-hover 的解释
  • .Net 4.0并行库实用性演练
  • .Net Core与存储过程(一)
  • .net mvc部分视图
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net和jar包windows服务部署
  • .Net中wcf服务生成及调用
  • .NET中统一的存储过程调用方法(收藏)
  • .pop ----remove 删除
  • /etc/sudoers (root权限管理)
  • @synthesize和@dynamic分别有什么作用?
  • [52PJ] Java面向对象笔记(转自52 1510988116)
  • [Angular] 笔记 9:list/detail 页面以及@Output
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [ES-5.6.12] x-pack ssl