目录

一、概念

1.1 分支限界法的基本思想

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

1.3 分支限界法的搜索方式

1.4 常见的两种分支限界法

二、举例

2.1 单源最短路径问题

三、代码实现

3.1 源程序

3.2 运行结果


一、概念

1.1 分支限界法的基本思想


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


1.3 分支限界法的搜索方式


1.4 常见的两种分支限界法


二、举例

2.1 单源最短路径问题

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

找到一条路径:

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

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

剪枝的策略:

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

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

最终结果:

所以从源顶点到终点的最短路径值为8,最短路径为:0 2 6 9 10。


三、代码实现

3.1 源程序

package SufaLjh.Exp1.Homework_8.Day_6_11;import SufaLjh.Exp1.Homework_8.Day_6_11.tool.Heap;
import SufaLjh.Exp1.Homework_8.Day_6_11.tool.HeapNode;/*** 分支限界法求单源最短路径问题*/
public class E2 {//定义变量int heapsize = 0,n=10,inf = 1000;//inf 表示距离为无穷int c[][] = new int[11][11],dist[]=new int[11],prev[]=new int[11];/*** 主方法 程序入口* @param args*/public static void main(String[] args) {new E2();}public E2(){for (int i = 0; i <= n; i++) {for (int j = 0; j <= n; j++)c[i][j] = inf;dist[i]=inf;}c[0][1]=2;c[0][2]=3;c[0][3]=4;c[1][2]=3;c[1][4]=7;c[1][5]=2;c[2][5]=9;c[2][6]=2;c[3][6]=2;c[4][7]=1;c[4][8]=2;c[5][6]=1;c[5][8]=3;c[6][8]=5;c[6][9]=1;c[7][10]=2;c[8][10]=2;c[9][8]=2;c[9][10]=2;Shostestpaths(0,10);System.out.printf("从源点到最后一个点的最短路径的值为:%d\n",dist[10]);print(10);}/*** 分支限界法* @param v 源点* @param end 终点*/private void Shostestpaths(int v,int end){Heap heap = new Heap();HeapNode E = new HeapNode(),N = new HeapNode();E.i=v;E.d=0;dist[v]=0;while (true){for (int j = 1; j <= n; j++) {//找当前节点(下标为E,i)的所有儿子节点//int d=E.d+c[E.i][j];//if (c[E.i][j]<inf&&d<dist[j]&&d<dist[end])if (c[E.i][j]<inf&&E.d+c[E.i][j]<dist[j]&&E.d<dist[end]){dist[j]=E.d+c[E.i][j];//更新到第j个顶点的最短距离prev[j]=E.i;//取到第j个顶点的最短距离时,第j个顶点的前一个顶点为E.iN.i=j;N.d=dist[j];//给堆的新节点赋值N.key=N.d;//用最短距离作为堆中关键值heap.minHeapInsert(N);//将所有节点插入堆中}}E=heap.minHeapDelete();//取出堆顶元素作为当前节点if (E.key==-1)break;//堆为空时退出}}/*** 打印输出的方法* @param v 源点*/private void print(int v) {int t[] = new int[11];int i = v,j=0;while (i>0){t[j++]=i;i=prev[i];}t[j]=0;System.out.printf("最短路径为:");for (; j >= 0; j--) {System.out.printf("%d ",t[j]);}}
}定义最大堆和最小堆的类文件Heap.java:
package SufaLjh.Exp1.Homework_8.Day_6_11.tool;//大顶堆
public class Heap {int heapsize=0;//堆的大小HeapNode A[]=new HeapNode[1000];//存放堆的数组/*** 主方法* @param args*/public static void main(String[] args) {new Heap();}/*public Heap(){}*//*** 构造器*/public Heap() {for(int i=0;i<1000;i++)A[i]=new HeapNode();/*System.out.println("小顶堆:");//System.out.println("大顶堆: ");for (int i = 0; i < 10; i++) {HeapNode heapNode = new HeapNode();heapNode.key = i;//maxHeapInsert(heapNode);minHeapInsert(heapNode);}*///HeapNode E = maxHeapDelete();HeapNode E = minHeapDelete();while (E.key!=-1){System.out.println(E.key+"  ");//E=maxHeapDelete();E=minHeapDelete();}}//大顶堆插入public  void maxHeapInsert(HeapNode a) {heapsize++;int i = heapsize;while (i > 1 && A[i / 2].key < a.key) {A[i].clone(A[i/2]);i=i/2;}A[i].clone(a);}//大顶堆返回堆顶元素public  HeapNode maxHeapDelete() {if (heapsize < 1) {A[0].key = -1;A[0].i = 0;return A[0];}HeapNode max = new HeapNode();max.clone(A[1]);A[1].clone(A[heapsize]);heapsize--;maxHeapify(1);//堆化return max;}//大顶堆堆化public  void maxHeapify(int i) {int L, R, max;L = 2 * i;R = 2 * i + 1;if (L <= heapsize && A[L].key > A[i].key)max = L;elsemax = i;if (R <= heapsize && A[R].key > A[max].key)max = R;if (max != i) {HeapNode t = new HeapNode();t.clone(A[i]);A[i].clone(A[max]);A[max].clone(t);maxHeapify(max);}}//小顶堆public void minHeapInsert(HeapNode a){heapsize++;int i=heapsize;while(i>1&&A[i/2].key>a.key){A[i].clone(A[i/2]);i=i/2;}A[i].clone(a);}public HeapNode minHeapDelete(){if(heapsize<1){A[0].key=-1;return A[0];}HeapNode min=new HeapNode();min.clone(A[1]);A[1].clone(A[heapsize]);heapsize--;minHeapify(1);return min;}//小顶堆堆化public void minHeapify(int i){int L,R,min;L=2*i;R=2*i+1;if(L<=heapsize&&A[L].key<A[i].key) min=L;else min=i;if(R<=heapsize&&A[R].key<A[min].key) min=R;if(min!=i){HeapNode  t=new HeapNode();t.clone(A[i]);A[i].clone(A[min]);A[min].clone(t);           minHeapify(min);}}}定义堆节点的类文件HeapNode.java:
package SufaLjh.Exp1.Homework_8.Day_6_11.tool;public class HeapNode {public int ew,wt,i,x,key,d;public double p, up;public void clone(HeapNode t) {this.i=t.i;this.ew=t.ew;this.wt=t.wt;this.x=t.x;this.p=t.p;this.up=t.up;this.key=t.key;this.d=t.d;}
}

3.2 运行结果


算法与程序设计的复习嘻嘻嘻蟹蟹٩('ω')و 

算法与程序设计(六):分支限界法相关推荐

  1. 算法复习第六章第七章

    算法复习第六章第七章 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后问题 第七章分支限界法 0-1bag问题 TSP问题 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后 ...

  2. 计算机算法对程序设计的作用,【程序设计论文】高中算法与程序设计教学意义及有效性(共3796字)...

    摘要:算法和程序设计教学会加深学生对计算机科学的认识,使他们从游戏.聊天.打字.表格处理等对计算机工具作用的认识上升到计算机科学的高度上来,对学生的编程教育起到启蒙作用.笔者通过具体教学实例探讨在课程 ...

  3. 江南大学考研专业课851算法与程序设计_2012年真题

    文章目录 第一题: 思路: 答案: 第二题: 思路: 答案: 第三题: 思路: 答案: 第四题: 思路: 答案: 第五题: 思路: 答案: 第六题: 思路: 答案: 第七题: 思路: 答案 第八题: ...

  4. 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt

    算法与程序设计实验最小生成树(c语言).ppt 最小生成树 问题分析: 由于在每两个城市之间都可以建立一条通信线路,n个城市之间最多可能设置n(n-1)/2条线路,而每条线路都要付出一定的经济代价,因 ...

  5. 高中计算机考试编程题,2020年高中信息技术模块测试卷5(算法与程序设计) 信息技术试题(PDF版无答案)...

    ID:12966002 分类: 单元测试 , 浙江 , 2020 资源大小:22433KB 资料简介: 模块测试卷 5 19 高中信息技术模块测试卷 5(算法与程序设计) 信息技术试题 一.选择题(本 ...

  6. 如何学好算法与程序设计

    如何学好算法与程序设计呢?假如你选择了C语言和对C语言,想要学好C语言,需要把握好以下几点: 1.确立离散性思维方式,摈弃连续性思维方式 在学习计算机语言时,一定要确立离散性的思维方式,这决定着你是否 ...

  7. 算法----计算机程序设计之魂

    毋庸置疑,算法是程序设计的灵魂,无论你使用哪种语言,哪种开发工具,都离不开算法,算法就是程序设计的思想,教你如何设计程序,他是一种方法,这就像我们小时候看武打小说,练武有内功和外功之分,开发工具和语言 ...

  8. 基于区域生长算法的图像分割python_图像分割中区域生长算法的程序设计与实现...

    论文编号:DZXX399  论文字数:12586,页数:30 摘要 本课题主要研究图像分割中区域生长算法的程序设计与实现.开发工具选用VC++6.0.通过VC++6.0开发环境中的常用向导和MFC类库 ...

  9. 一位同学想通过用计算机编程解决韩信点兵,高中信息技术《算法与程序设计模块》练习题...

    新课标高中信息技术<算法与程序设计模块>练习题 一.单选题(每题2分,共40分) 1.四川汶川地震过后,要对各个单位捐款救灾情况进行分组制表,并进行积分排序,一般使用的专业电子处理软件是( ...

最新文章

  1. 【Boost】boost库中function的用法
  2. Leetcode--881. 救生艇
  3. 【2017-12-12】Winform----Datagirdview使用
  4. 查看文件大小du -sh ./ ll -h
  5. windows bat 设置代理上网脚本bat
  6. 音视频开发系列(10):基于qt的音频推流
  7. 将知网格式的.caj文件转换为.pdf文件
  8. JavaScript循环数组
  9. 如何用wamp运行php代码,请问如何将已经写好的PHP代码部署到WAMP环境中
  10. CF Make Cents?
  11. Linux系统编程 | 01 -文件操作
  12. c语言 交通处罚单管理程序 typedef struct,交通罚单.doc
  13. JavaSE 8 离线API下载
  14. 手写 React 第 2 节 - 初探 React 实现机制
  15. STM32精英版(正点原子STM32F103ZET6开发板)学习篇15——RTC实时时钟+备份区域BKP
  16. android 验证邮箱格式,android开发中, 如何验证邮箱的格式 ?
  17. JS内存问题:栈和堆
  18. python 银行_python 银行系统
  19. 解决:Mac brew Error: Your CLT does not support macOS 11.2
  20. Cubieboard的U-boot以太网驱动移植

热门文章

  1. tensorflow2自制数据集实线猫狗分类
  2. c++ 大小写转换字符转数字
  3. QtQuick 移动端开发实战系列(3)_QtCreator的基础用法
  4. 假如有一天我们上不了学了
  5. C语言求两个数最大公约数和最小公倍数
  6. 计算机培训的教案,教师计算机培训-教案.doc
  7. Discuz模板多色设计 ZCOOL站酷素材源码
  8. 2021-06-29leetcode226.翻转二叉树
  9. 仅仅有走过的路 才懂她的内容
  10. ATmega16开发板教程(5)——外部中断