转自:http://www.cnblogs.com/chinazhangjie/archive/2010/11/01/1866136.html

分支限界法与回溯法

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

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

分支限界法的基本思想

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

在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。

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

常见的两种分支限界法

(1)队列式(FIFO)分支限界法

按照队列先进先出(FIFO)原则选取下一个结点为扩展结点。

(2)优先队列式分支限界法

按照优先队列中规定的优先级选取优先级最高的结点成为当前扩展结点。

一、单源最短路径问题

1、问题描述

在下图所给的有向图G中,每一边都有一个非负边权。要求图G的从源顶点s到目标顶点t之间的最短路径。

下图是用优先队列式分支限界法解有向图G的单源最短路径问题产生的解空间树。其中,每一个结点旁边的数字表示该结点所对应的当前路长。

找到一条路径:

目前的最短路径是8,一旦发现某个结点的下界不小于这个最短路进,则剪枝:

同一个结点选择最短的到达路径:

2.剪枝策略

在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。

在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。

3.算法思想

解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。

算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。

实现

1 2.剪枝策略在算法扩展结点的过程中,一旦发现一个结点的下界不小于当前找到的最短路长,则算法剪去以该结点为根的子树。 在算法中,利用结点间的控制关系进行剪枝。从源顶点s出发,2条不同路径到达图G的同一顶点。由于两条路径的路长不同,因此可以将路长长的路径所对应的树中的结点为根的子树剪去。 3.算法思想解单源最短路径问题的优先队列式分支限界法用一极小堆来存储活结点表。其优先级是结点所对应的当前路长。算法从图G的源顶点s和空优先队列开始。结点s被扩展后,它的儿子结点被依次插入堆中。此后,算法从堆中取出具有最小当前路长的结点作为当前扩展结点,并依次检查与当前扩展结点相邻的所有顶点。如果从当前扩展结点i到顶点j有边可达,且从源出发,途经顶点i再到顶点j的所相应的路径的长度小于当前最优路径长度,则将该顶点作为活结点插入到活结点优先队列中。这个结点的扩展过程一直继续到活结点优先队列为空时为止。实现2 /*主题:单源最短路径问题3 * 作者:chinazhangjie4 * 邮箱:chinajiezhang@gmail.com5 * 开发语言:C++6 * 开发环境:Mircosoft Virsual Studio 20087 * 时间: 2010.11.018 */

9

10 #include

11 #include

12 #include

13 #include

14 using namespacestd;15

16 structnode_info17 {18 public:19 node_info (int i,intw)20 : index (i), weight (w) {}21 node_info ()22 : index(0),weight(0) {}23 node_info (const node_info &ni)24 : index (ni.index), weight (ni.weight) {}25

26 friend27 bool operator < (const node_info& lth,const node_info&rth) {28 return lth.weight > rth.weight ; //为了实现从小到大的顺序

29 }30

31 public:32 int index; //结点位置

33 int weight; //权值

34 };35

36 structpath_info37 {38 public:39 path_info ()40 : front_index(0), weight (numeric_limits::max()) {}41

42 public:43 intfront_index;44 intweight;45 };46

47 //single source shortest paths

48 classss_shortest_paths49 {50

51 public:52 ss_shortest_paths (const vector >& g,intend_location)53 :no_edge (-1), end_node (end_location), node_count (g.size()) , graph (g)54 {}55

56 //打印最短路径

57 void print_spaths () const{58 cout << "min weight :" << shortest_path < (cout, " "));62 cout <

65 //求最短路径

66 voidshortest_paths () {67 vectorpath(node_count);68 priority_queue >min_heap;69 min_heap.push (node_info(0,0)); //将起始结点入队

70

71 while (true) {72 node_info top = min_heap.top (); //取出最大值

73 min_heap.pop ();74

75 //已到达目的结点

76 if (top.index ==end_node) {77 break;78 }79 //未到达则遍历

80 for (int i = 0; i < node_count; ++i) {81 //顶点top.index和i间有边,且此路径长小于原先从原点到i的路径长

82 if (graph[top.index][i] != no_edge &&

83 (top.weight + graph[top.index][i])

94 shortest_path =path[end_node].weight;95 int index =end_node;96 s_path_index.push_back(index) ;97 while (true) {98 index =path[index].front_index ;99 s_path_index.push_back(index);100 if (index == 0) {101 break;102 }103 }104 }105

106 private:107 vector > graph ; //图的数组表示

108 int node_count; //结点个数

109 const int no_edge; //无通路

110 const int end_node; //目的结点

111 vector s_path_index; //最短路径

112 int shortest_path; //最短路径

113 };114

115 intmain()116 {117 const int size = 11;118 vector >graph (size);119 for (int i = 0;i < size; ++i) {120 graph[i].resize (size);121 }122 for (int i = 0;i < size; ++i) {123 for (int j = 0;j < size; ++j) {124 graph[i][j] = -1;125 }126 }127 graph[0][1] = 2;128 graph[0][2] = 3;129 graph[0][3] = 4;130 graph[1][2] = 3;131 graph[1][5] = 2;132 graph[1][4] = 7;133 graph[2][5] = 9;134 graph[2][6] = 2;135 graph[3][6] = 2;136 graph[4][7] = 3;137 graph[4][8] = 3;138 graph[5][6] = 1;139 graph[5][8] = 3;140 graph[6][9] = 1;141 graph[6][8] = 5;142 graph[7][10] = 3;143 graph[8][10] = 2;144 graph[9][8] = 2;145 graph[9][10] = 2;146

147 ss_shortest_paths ssp (graph, 10);148 ssp.shortest_paths ();149 ssp.print_spaths ();150 return 0;151 }

View Code

测试数据(图)

测试结果

min weight : 8

path: 0 2 6 9 10

单源路径分支界限java_分支限界法—单源最短路径问题相关推荐

  1. 单源路径分支界限java_单源最短路径-分支界限法

    单源最短路径-分支界限法-优先队列式.这里使用无回路的有向图,便于构建树.构建好树后,从根结点作为起始源,加入结点队列,然后判断获取队列中最短的路径结点做为活结点,将活结点的所有子结点加入队列,移除活 ...

  2. 单源路径分支界限java_java实现单源最短路径

    本文采用java实现单源最短路径,并带有略微详细的注解,供大家参考,具体内容如下 package com.qf.greaph; import java.util.arraylist; import j ...

  3. 单源路径分支界限java_java单源最短路径算法

    . .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...

  4. tsp 分支界限 java_干货 | 10分钟教你用branch and bound(分支定界)算法求解TSP旅行商问题...

    在此之前,先给大家讲讲最重要的一个点,搜索树的节点定义,节点定义了原问题的solution和子问题的solution.Node节点定义如下: public class Node {private Ar ...

  5. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

  6. 图论——单源路径问题

    文章目录 图论--单源路径问题 问题分析 代码 指定终点代码 图论--单源路径问题 问题分析 对于本小节,我们只讨论简单无向无权图的单源路径问题. 单源路径是指从某个给定顶点出发找到一条路径到其他顶点 ...

  7. 云客Drupal源码分析之实体表单显示EntityFormDisplay

    以下内容仅是一个预览,完整内容请见文尾: 实体的显示分为表单显示和视图显示,前者用于不同情况下的信息输入,后者用于不同情况下的信息展示,本篇很多内容不止用于本篇所讲的表单主题,也是学习drupal视图 ...

  8. 分支界限算法【0-1背包问题】按照优先队列式(LC)分支限界法求解0-1背包问题, 并给出限界函数,并画出该实例的状态空间树。

    目   录 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 作业题(期末考试必考) 小结 回溯算法[0-1背包问题] 分支界限算法[0-1背包问题] 解决思路:采用优先队列式分支限界 Ø ...

  9. 麟龙指标通达信指标公式源码_通达信指标公式源码单阳不破主图指标公式

    做价值的传播者,一路同行,一起成长 问题:怎样才能每天都收到这类文章! 答案:只需点击上方<通达信公式指标> {通达信单阳不破}MA30: MA(C,30 ),COLORGREEN;MA3 ...

最新文章

  1. 【洛谷5251】[LnOI2019] 第二代图灵机(线段树+ODT)
  2. ML之ME/LF:机器学习之风控业务中常用模型评估指标PSI(人群偏移度指标)的的简介、使用方法、案例应用之详细攻略
  3. 数据竞赛:记录3天进入比赛Top3%的全过程
  4. spring自定义作用域 依赖注入之手动注入
  5. c#二叉树 取叶子节点个数_二叉树的最小深度+完全二叉树的节点个数
  6. 07、08 条件渲染、列表渲染
  7. MySQL常用语法记录
  8. 从源码角度看Spark on yarn client cluster模式的本质区别
  9. Linux系统学习: 用户和权限管理指令: 请简述 Linux 权限划分的原则
  10. 女朋友:你能给我讲讲单例模式吗?
  11. 为什么numba不能提高背包功能的速度?
  12. 李宏毅机器学习Homework1(代码简洁版)
  13. 学习笔记(03):Qt视频教程-基础实例进阶-多线程下载和断点续传
  14. 计算机配置路径,计算机基础~Windows工作路径、相对路径、绝对路径
  15. 【基础】格林尼治时间转化
  16. php对接一网通,Android招行一网通对接
  17. 小白算法练习 NYOJ 吝啬的国度 dfs+邻接表
  18. 深入理解connect by levelxxx
  19. GPS授时是什么意思
  20. 做为一个好人 你应该看这部电影

热门文章

  1. 字符串变量作mysql查询条件
  2. [小说]魔王冢(尾声)
  3. 20155339 Exp7 网络欺诈防范
  4. vmware 无法打开u盘
  5. 前端学习第三阶段-第3章 WebAPI编程
  6. iPhone iPad 如何播放网页调用Flash视频
  7. 报税时提示服务器验证证书失败,服务器证书验证失败 服务器证书验证地址出错怎么办...
  8. 不要全聚德!老北京人告诉你,该买什么“北京特产”带回家!
  9. 推广运营新应用:短网址的正确使用方式
  10. 【Pytorch with fastai】第 10 章 :NLP 深入探讨 RNN