算法与程序设计(六):分支限界法
目录
一、概念
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 运行结果
算法与程序设计的复习嘻嘻嘻蟹蟹٩('ω')و
算法与程序设计(六):分支限界法相关推荐
- 算法复习第六章第七章
算法复习第六章第七章 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后问题 第七章分支限界法 0-1bag问题 TSP问题 第六章回溯法 TSP问题 0-1bag问题 图着色问题 八皇后 ...
- 计算机算法对程序设计的作用,【程序设计论文】高中算法与程序设计教学意义及有效性(共3796字)...
摘要:算法和程序设计教学会加深学生对计算机科学的认识,使他们从游戏.聊天.打字.表格处理等对计算机工具作用的认识上升到计算机科学的高度上来,对学生的编程教育起到启蒙作用.笔者通过具体教学实例探讨在课程 ...
- 江南大学考研专业课851算法与程序设计_2012年真题
文章目录 第一题: 思路: 答案: 第二题: 思路: 答案: 第三题: 思路: 答案: 第四题: 思路: 答案: 第五题: 思路: 答案: 第六题: 思路: 答案: 第七题: 思路: 答案 第八题: ...
- 最小生成树实验报告c语言,算法与程序设计实验最小生成树(c语言).ppt
算法与程序设计实验最小生成树(c语言).ppt 最小生成树 问题分析: 由于在每两个城市之间都可以建立一条通信线路,n个城市之间最多可能设置n(n-1)/2条线路,而每条线路都要付出一定的经济代价,因 ...
- 高中计算机考试编程题,2020年高中信息技术模块测试卷5(算法与程序设计) 信息技术试题(PDF版无答案)...
ID:12966002 分类: 单元测试 , 浙江 , 2020 资源大小:22433KB 资料简介: 模块测试卷 5 19 高中信息技术模块测试卷 5(算法与程序设计) 信息技术试题 一.选择题(本 ...
- 如何学好算法与程序设计
如何学好算法与程序设计呢?假如你选择了C语言和对C语言,想要学好C语言,需要把握好以下几点: 1.确立离散性思维方式,摈弃连续性思维方式 在学习计算机语言时,一定要确立离散性的思维方式,这决定着你是否 ...
- 算法----计算机程序设计之魂
毋庸置疑,算法是程序设计的灵魂,无论你使用哪种语言,哪种开发工具,都离不开算法,算法就是程序设计的思想,教你如何设计程序,他是一种方法,这就像我们小时候看武打小说,练武有内功和外功之分,开发工具和语言 ...
- 基于区域生长算法的图像分割python_图像分割中区域生长算法的程序设计与实现...
论文编号:DZXX399 论文字数:12586,页数:30 摘要 本课题主要研究图像分割中区域生长算法的程序设计与实现.开发工具选用VC++6.0.通过VC++6.0开发环境中的常用向导和MFC类库 ...
- 一位同学想通过用计算机编程解决韩信点兵,高中信息技术《算法与程序设计模块》练习题...
新课标高中信息技术<算法与程序设计模块>练习题 一.单选题(每题2分,共40分) 1.四川汶川地震过后,要对各个单位捐款救灾情况进行分组制表,并进行积分排序,一般使用的专业电子处理软件是( ...
最新文章
- 【Boost】boost库中function的用法
- Leetcode--881. 救生艇
- 【2017-12-12】Winform----Datagirdview使用
- 查看文件大小du -sh ./ ll -h
- windows bat 设置代理上网脚本bat
- 音视频开发系列(10):基于qt的音频推流
- 将知网格式的.caj文件转换为.pdf文件
- JavaScript循环数组
- 如何用wamp运行php代码,请问如何将已经写好的PHP代码部署到WAMP环境中
- CF Make Cents?
- Linux系统编程 | 01 -文件操作
- c语言 交通处罚单管理程序 typedef struct,交通罚单.doc
- JavaSE 8 离线API下载
- 手写 React 第 2 节 - 初探 React 实现机制
- STM32精英版(正点原子STM32F103ZET6开发板)学习篇15——RTC实时时钟+备份区域BKP
- android 验证邮箱格式,android开发中, 如何验证邮箱的格式 ?
- JS内存问题:栈和堆
- python 银行_python 银行系统
- 解决:Mac brew Error: Your CLT does not support macOS 11.2
- Cubieboard的U-boot以太网驱动移植