• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 算法详解之分支限界法的具体实现

算法详解之分支限界法的具体实现

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了分支限界法,分支限界法 01背包,分支限界法装载问题,分支限界法tsp问题,分支限界法基本思想等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

首先我们来关注一个问题:

问题描述:

布线问题:印刷电路板将布线区域划分成n×m个方格阵列,要求确定连接方格阵列中的方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,为了避免线路相交,已布了线的方格做了封锁标记,其他线路不允许穿过被封锁的方格。如下图所示:

 

算法思路:

布线问题的解空间是一个图,则从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始方格a到这些方格的距离为1。接着,从活结点队列中取出队首结点作为下一个扩展结点,并将与当前扩展结点相邻且未标记过的方格标记为2,并存入活结点队列。这个过程一直继续到算法搜索到目标方格b或活结点队列为空时为止。

在实现上述算法时,

(1) 定义一个表示电路板上方格位置的类Position。

它的2个成员row和col分别表示方格所在的行和列。在方格处,布线可沿右、下、左、上4个方向进行。沿这4个方向的移动分别记为0,1,2,3。下表中,offset[i].row和offset[i].col(i= 0,1,2,3)分别给出沿这4个方向前进1步相对于当前方格的相对位移。

(2) 用二维数组grid表示所给的方格阵列。

初始时,grid[i][j] = 0, 表示该方格允许布线,而grid[i][j] = 1表示该方格被封锁,不允许布线。

算法图解:

代码贴出来:


  FindPath (start, finish, PathLen, path);
 }
</div>

代码贴出来:


  FindPath (start, finish, PathLen, path);
 }
</div>
好了,问题解出来了。咦,我们用的是什么方法呢?呵呵,对,这就是分支限界算法。


算法总结:

分支限界法基本思想:

• 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。

• 在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。

• 在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

• 此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。

分支限界法与回溯法的不同:

(1)求解目标不同:回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出在某种意义下的最优解。

(2)搜索方式的不同:回溯法以深度优先的方式搜索解空间树,而分支限界法则以广度优先或以最小耗费优先的方式搜索解空间树。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 算法详解之分支限界法的具体实现

相关文章

  • 2017-08-30c语言实现字符串中单词的反转
  • 2017-05-28C程序读取键盘码的方法
  • 2017-05-28Linux网络编程之UDP Socket程序示例
  • 2017-05-28C++设计模式编程中的迭代器模式应用解析
  • 2017-05-28c语言线程终止练习示例
  • 2017-05-28详解C++中的一维数组和二维数组
  • 2017-08-1722.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象
  • 2017-05-28详解socket阻塞与非阻塞,同步与异步、I/O模型
  • 2017-05-28简单的socket编程入门示例
  • 2017-05-28C++ 二叉搜索树(BST)的实现方法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • c++中冒号(:)和双冒号(::)的使用说明
    • c++实现简单的线程池
    • c++非变易算法-stl算法
    • C++ 智能指针深入解析
    • VC下实现fopen支持中文的方法
    • C++中new的越界访问问题
    • 解析C++哈夫曼树编码和译码的实现
    • C语言解决螺旋矩阵算法问题的代码示例
    • 浅谈几种常见语言的命名空间(Namespace)
    • 全排列算法的原理和实现代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有