1、算法课程设计说明书算法实验周*利用分治法求解空中飞行管理问题 所做任务说明及题目相关知识说明文档编号:NUC-2013-C02-01版 本:1.0作 者:杨晓晨打印日期:2013.12.26拷贝份数:12013中北大学计算机与控制工程学院 1.1 飞机管理任务说明随着空中各种飞机数量的增加,飞行安全控制变得尤为重要,要想提高空中飞行的安全系数,其中一个亟需解决的问题就是预先知道空中哪两架飞机之间具有最大碰撞危险。如果知道了这两架具有最大碰撞危险的飞机,我们就预先通知飞行员进行相应的安全飞行,以避免碰撞。从穷举法的角度很容易解决这个问题,但是效率太低,时间复杂度是O(n2),不符合实际需要,利用
2、分治法分而制之的思想,降低问题复杂度,通过建模求解,把时间复杂度降到O(nlogn),可以较好地解决实际问题。1分治法分治法基本思想:任何一个用计算机求解的问题时间复杂度都与其规模N有关。求解该问题,至少使用蛮力法和分治法求解,并比较时间复杂性。1.2 相关知识说明1.2.1 蛮力法蛮力法基本思想为计算所有点之间的距离,计算出所有点的距离之后,进行比较,得出距离最近的两点。同时为了少进行重复操作,以y轴为标准,只计算Yi小于Yj的点。1.2.2 分治法所谓分治法就是把问题划分成多个子问题来进行处理。这些子问题,在结构上与原来的问题一样,但在规模上比原来的小。如果得到的子问题相对来说还大,可以反
3、复地使用分治策略,把这些子问题再划分成更小的、结构相同的子问题。这样就可以使用递归的方法,分别求解这些子问题,把这些子问题的解结合起来,从而获得原来问题的解。基本的思想为找一条中垂线m(坐位S集合x坐标的中位数)把n个元素分成左右两部分元素,然后分别求得两边的最短距离的d1,d2,然后取两者中的最小者记为d,在中线两边分别取d的距离,记录该距离范围内点的个数,中线左边有L个元素,右边有R个元素,分别将两边的点按y坐标升序排列m=,在左边集合中每一个点,找右边集合的点,找到与之距离小于d的点,更新最短距离,直到循环结束,即可求出最短距离。*利用分治法求解空中飞行管理问题 数据结构设计说明文档编号
4、:NUC-2013- C02-02版 本:1.0作 者:杨晓晨打印日期:2013.12.26拷贝份数:12013中北大学计算机与控制工程学院2.1空中飞行管理问题数据结构程序使用java语言进行编写。定义point类以生成点,并对点的x、y、z轴坐标进行定义,并使用pointpair说明点之间的距离,说明各个点的id与距离。分别使用FenZhiDealClass类和ManliDealClass类进行空中飞行管理问题的蛮力法与分治法的解决。使用ClosestpairMainClass类定义点的输入方式,并从InputClass类引用随机生成数。同时CaculateDist提供计算两点之间距离的方
5、法。在main类中,可以对使用方法进行选择,选择使用蛮力法与分治法。public static void main(String args) Scanner scanner = new Scanner(System.in); System.out.println(请选择点的产生方式,输入1生产随机点,或者3从文件引入:); int a = scanner.nextInt(); System.out.println(请选择方法:1为蛮力法,2为分治法); int b = scanner.nextInt(); ClosestPairMainClass.ChooseInputPoint(a); Cl
6、osestPairMainClass.ChooseDeal(b); *利用分治法求解空中飞行管理问题 程序模块及流程设计文档编号:NUC-2013- C02-03版 本:1.0作 者:杨晓晨打印日期:2013.12.26拷贝份数:12013中北大学计算机与控制工程学院3.1飞机管理流程图*利用分治法求解空中飞行管理问题 源程序清单及说明文档编号:NUC-2013- C02-04版 本:1.0作 者:杨晓晨打印日期:2013.12.26拷贝份数:12013中北大学计算机与控制工程学院4.1飞机管理源程序清单Main.java:程序入口Point.java:点集函数Point1.java:点命名函
7、数PointPair.java:连线函数ManliDealClass:蛮力最近对函数FenZhiDealClass:分治最近对函数Caculatedist.java:距离求解函数InputClass.java:随机点生成函数4.2主要代码4.2.1主函数代码import java.util.Random;import java.util.Scanner;public class Main public static void main(String args) Scanner scanner = new Scanner(System.in); System.out.println(请选择点的产
8、生方式,输入1生产随机点,或者3从文件引入:); int a = scanner.nextInt(); System.out.println(请选择方法:1为蛮力法,2为分治法); int b = scanner.nextInt(); ClosestPairMainClass.ChooseInputPoint(a); ClosestPairMainClass.ChooseDeal(b); 4.2.2蛮力法求解最近对函数import java.io.File;import java.util.Scanner;public class ManliDealClass private double d
9、; private double min_d ; private int order1; private int order2; public static int excuteNum; public static double useTime; public ManliDealClass() d = 0; min_d = Double.POSITIVE_INFINITY; order1 = 0; order2 = 0; / 蛮力法求最近对 public void FindClosestPair(Point1 p) excuteNum = 0; double time1 = System.cu
10、rrentTimeMillis(); for (int i = 0; i p.length; i+) for (int j = i + 1; j p.length; j+) d = CaculateDist.dist(pi,pj); excuteNum +; if (d min_d) min_d = d; order1 = pi.getId(); order2 = pj.getId(); double time2 = System.currentTimeMillis(); useTime = time2 - time1; String s1 = toString(); /LeftDownPan
11、el.jtA1.setText(s1); Print(); /得到类中的属性值 public double getMin_d() return min_d; public int getOrder1() return order1; public int getOrder2() return order2; public String toString() return 蛮力法求得的三维立体空间中的最近点对为: + 点 + order1 + 和点 + order2 +n + (蛮力法)两点的距离为: + min_d; public void Print() System.out.println
12、(蛮力法求得的三维立体空间中的最近点对为: + 点 + order1 + 和点 + order2); System.out.println((蛮力法)两点的距离为: + min_d); public static String toString1() return 使用蛮力法求三维立体空间中的最近对所用的时间为:+useTime+n+基本操作执行的次数为:+excuteNum; 4.2.3分治法求最近对函数public class FenZhiDealClass public static double useTime2; public static int excuteNum2; publi
13、c static int excuteNum3; public static PointPair closestPair(Point1 source) double startTime = System.currentTimeMillis(); excuteNum2 = 0; excuteNum3 = 0; if(source.length 2) return null; /对原始输入的空间点集数组source按照Y坐标进行排序 DealClass.sortY(source); PointPair pp =realclosestPair(source,0,source.length-1); d
14、ouble endTime = System.currentTimeMillis(); useTime2 = endTime - startTime; return pp; /寻找最近点对的静态函数 public static PointPair realclosestPair(Point1 x,int l,int r) excuteNum2 +; /当数组中只有两个点 if(r - l = 1) return new PointPair(xl,xr,CaculateDist.dist(xl,xr); else if(r - l = 2)/当数组中只有3个点时 double d1 = Cacu
15、lateDist.dist(xl, xl+1); double d2 = CaculateDist.dist(xl+1, xr); double d3 = CaculateDist.dist(xl, xr); if(d1 d2&d1 d3) return new PointPair(xl,xl+1,d1); if(d2=d3) return new PointPair(xl+1, xr, d2); else return new PointPair(xl, xr, d3); else if(l = r)/只有一个点 return new PointPair(xl, xr, Double.MAX
16、_VALUE); else /数组中的点多于3个 /找出点集中以Y坐标为标准的分界平面,以此平面为界对空间点集进行划分 double mid_Y = DealClass.FindMid(x,l,r); int m = DealClass.Divide(x, mid_Y); /分别找出左右两个空间点集的最近对best和right PointPair right,best; best = realclosestPair(x, l, m-1); right = realclosestPair(x, m, r); /比较左右两个点集的最近对距离,找出距离最短的一对点 if(right.getDist(
17、)best.getDist() best = right; /将到平面Y=m的距离小于dist的点放在数组Z中 int k = 0; /初始化数组长度 Point1 z = new Point1x.length; /数组Z中存放X数组中距离平面距离小于合并前最小距离的点 for(int i = l;i = r; i +) if(Math.abs(mid_Y - xi.getY() best.getDist() zk+ = xi; /从三对点中找到距离最近的点 for(int i = 1;i k; i +) for(int j = i+1; j k&Math.abs(zj.getY() -zi.
18、getY() best.getDist(); j+) double dp = CaculateDist.dist(zi, zj); if(dpbest.getDist() best = new PointPair(xzi.getOrder()-1,xzj.getOrder()-1,dp); return best; /输出最近点对及其距离 public static void print(PointPair pp) String s = toString(pp); /LeftDownPanel.jtA2.setText(s); System.out.println(分治法求得的空间点集的最近对
19、为:点 + pp.getPa().getId() + 和点 + pp.getPb().getId(); System.out.println((分治法)两点之间的距离为:+pp.getDist(); public static String toString(PointPair pp) return 分治法求得的空间点集的最近对为:点 + pp.getPa().getId() + 和点 + pp.getPb().getId()+n+(分治法)两点之间的距离为:+pp.getDist(); public static String toString1() return 使用分治法求三维立体空间中
20、的最近对所用的时间为:+useTime2+n+基本操作执行的次数为:+(excuteNum2+excuteNum3); *利用分治法求解空中飞行管理问题 算法效率分析说明文档编号:NUC-2013- C02-05版 本:1.0作 者:杨晓晨打印日期:2013.12.26拷贝份数:12013中北大学计算机与控制工程学院5.1空中飞行管理问题蛮力法效率分析算法描述:已知集合S中有n个点,一共可以组成n(n-1)/2对点对,蛮力法就是对这n(n-1)/2对点对逐对进行距离计算,得出所有点对之间的距离,通过循环求得点集中的最近点对。算法时间复杂度:算法一共要执行 n(n-1)/2次循环,因此算法复杂度
21、为O(n2)。5.2 空中飞行管理问题分治法效率分析算法描述: 首先对所有点d(x,y,z)进行从y轴升序排列,取midY为分割面,将所有点分到L和R两个空间块中,分别计算L与R中的最近点距离d1、d2,并取其中较小的d为dmin,在分割面左右距离为dmin的空间内寻找最近点对,并进行比较,最终得出最近点。算法时间复杂度:首先进行排序,为O(2nlogn)接下来在分治过程中, O(n)= 2O(n/2) + (n/2)*6最终可得O(n) O(3nlogn)* 总结文档编号:NUC-2013- C02-06版 本:1.0 作 者:杨晓晨打印日期:2013.12.26拷贝份数:12013中北大学计算机与控制工程学院6.1课程设计总结通过对题目的分析,确定出问题的实质,并与算法相联系,分别运用蛮力法与分治法对最近对问题进行求解。通过程序可以明显看出,对同一组点集,分治法的运行时间要小于蛮力法,并且二者的时间差距随着点数的增多而增大,说明分治法在算法上要优于蛮力法。但是分治法要为多个数组开辟更多的空间,而蛮力法对空间需求较小。这次课程设计已经是学习算法一年之后了,发现对算法的相当一部分知识掌握的很不好,同时对一些算法中的重要基础已经忘掉了。对编程语言的应用上有很多不足,需要重新学习、研究。这次课程设计提高了我对算法的认识,加强了我对于专业知识的理解,并增强了自己的动手能力,非常有用。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1