地图着色课程设计_第1页
地图着色课程设计_第2页
地图着色课程设计_第3页
地图着色课程设计_第4页
地图着色课程设计_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、算法分析与设计课程设计说明书地图着色学 院: 计算机与控制工程学院 专 业: 计算机科学与技术 学生姓名:xxxxx 学号: 成绩 学生姓名:xxxxx 学号: 成绩 指导教师: 内 容 提 要此题为地图着色问题,由地图着色问题很容易想到图的着色问题,因此可以把地图抽象为无向图来解决地图的着色问题。对地图的抽象相当于对图的抽象,即以邻接矩阵来实现地图的区域相邻的描绘,而对地图的区域数即以图的顶点数来描绘。设计说明书的内容包括需求分析,概要设计,详细设计,代码实现,后期测试等内容,需求分析是对此问题所需要实现的功能的介绍,概要设计是对所需要实现功能的模块划分,以及初步的实现思想,详细设计通过编写

2、大致的代码来实现功能,代码实现则是具体的解决问题,解决此问题设计了两个算法,贪心,回溯,在程序的测试阶段,回溯算法对同一个问题的解决速率高于贪心算法,但是结果都是以最少的颜色数来染色。课题实现的环境是在window环境下的eclipse中,通过在其中输入地图的区域数,图的连接情况,来选择相应的算法来实现染色,本次课题所采用的数据结构主要是二维数组来抽象图的邻接矩阵。目 录1引言(或绪论)12 需求分析22.1 问题分析 22.3问题解决22.3 运行环境及开发工具32.4 功能需求 32.4.1 地图的抽象及输入 32.4.2 地图着色的算法设计 32.4.3 界面设计 32.4.4 输出设计

3、 32.5任务分配 43概要设计 43.1 数据定义 43.2 功能模块定义 43.2.1 地图的抽象输入模块 43.2.2 输出模块 43.2.3 地图染色模块 43.2.4 界面设计模块 53.2.5 主模块 53.3 程序流程图 64 详细设计 74.1 地图输入模块 74.1.1 数据类型 74.1.2 具体实现 74.2 界面设计模块 74.2.1 数据类型 74.2.2 具体实现 74.3 算法设计模块 9 4.3.1 回溯法过程9 4.3.2 贪心法过程.105 程序设计模块115.1 界面设计代码115.2 染色实现模块156 程序测试196.1 运行结果196.2 贪心、回溯

4、着色结果及分析197 算法时间、空间复杂度分析227.1 递归回溯227.2 贪心算法228 课设总结 228.1 已实现功能及不足228.2 心得体会22参考文献241 引言(或绪论)此次课程设计的要求是已知某地图(如中国地图),对各区域进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。此问题就是经典的地图着色问题,地图着色问题与四色定理是紧密相关的。地图着色问题与著名四色定理:四色定理是一个著名的数学定理:如果在平面上划出一些邻接的有限区域,那么可以用四种颜色来给这些区域染色,使得每两个邻接区域染的颜色都不一样;另一个通俗简洁的说法是:每个地图都可以用不多于四种颜色来染色,而

5、且不会有两个邻接的区域颜色相同。这就是著名的四色定理,由四色定理可以想到只需要四种颜色就可以为一个区域的地图着上颜色,而且相邻区域的颜色不相同。2 需求分析2.1 问题分析:地图着色问题是一个抽象的图形学问题,用程序实现对各个区域进行着色,并且相邻省所用的颜色不同,同时保证颜色的总数最少,那么就是如何将这些抽象的进行数据化。如何将程序所需要的功能模拟着色在计算机中编程实现。2.2 问题解决:计算机中,图主要可以用两种方法表示:邻接矩阵和邻接链表。N个顶点的邻接矩阵是一个N*N的布尔矩阵,图中的每一个顶点都由一行或者一列来表示,如果从第i个顶点和第j个顶点之间有边连接,则矩阵第i行,第j列的元素

6、等于1,如果没有边连接,则等于0.这就是图的邻接矩阵表示那么地图也可以抽象为一个图,其可以用邻接矩阵来进行模拟:对于每一个地图, 我们可以把每一个区 区域或国家) 看作一个点, 而区与区之间的邻接关系看作点与点之间的连线。从而将地图抽象为一个图,然后就可以用邻接矩阵抽象。如下图:其邻接矩阵为:ABCDEA 01100B10111C11001D01001E011112.3运行环境及开发工具:运行环境:windows系统开发工具:eclipse编程工具2.4 功能需求:2.4.1:地图的抽象及输入:给定一个地图,要求画出绘制出其图的形式,并在计算机上用邻接矩阵实现。相应的顶点为0,则表示两点邻接,

7、否则,就不邻接,为1.2.4.2:地图着色的算法设计:回溯法:本题可采用回溯法进行着色。当t=1时,对当前第t个顶点开始着色:若t>n,则已求得一个解,输出着色方案即可。否则,依次对顶点t着色1-m, 若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试上一颜色。回溯法的主要就是选择各种颜色,直到把此点着完色为止。贪心法:选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的每个顶点,如果一个顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和一个未被着色的顶点作为开始顶点,用第二种颜色为

8、尽可能多的顶点着色,如果还有未着色的顶点,则选取颜色3并为尽可能多的顶点着色,依此类推,直到所有顶点都着上颜色。贪心法就是选择一种颜色,最大化的将图中的各点都用这种颜色着上。2.4.3:界面设计:地图着色的软件界面设计,选择何种算法,以及选择几种颜色来为相应的地图桌上颜色。2.4.4:输出设计按要求输出动态的着色过程以及最终的染色结果,同时输出最终的着色结果,以及最少颜色数,在输出框里面输出。2.5 任务分配:xxx:贪心法算法设计,界面设计xxx:回溯法算法设计3概要设计3.1 数据定义:int cn+1n+1:邻接矩阵的中的数据只为0.1int color n+1:存取对对应的点的颜色,颜

9、色用1,2,3,4表示int n:定义对应的点数int N 着色的颜色数3.2功能模块定义:3.2.1 地图的抽象输入模块:按操作者要求输入相应地图对应图的点数,以及相应点与其他点的连接情况,此输入在界面输入,其中点数表示某个区域的地区数,而连接情况表示各区域的相邻情况,用此来抽象地图。 3.2.2 输出模块:按操作者输入的数据,执行相应的算法,并且在界面上显示出来最终的结果,输出的有图的邻接矩阵,着色方案,还有图的着色的最少颜色数。3.2.3 地图的染色模块:利用贪心算法以及回溯算法来为地图进行着色,即判断相应的点应该着那种颜色。回溯法算法过程:设数组colorn+1表示各顶点的着色情况,其

10、中n表示相应的点数,回溯法: 1将数组colorn初始化为0;2s=1;3while (s<=n)3.1 依次考察每一种颜色,若顶点s的着色与其他顶点的着色不发生冲突,则转步骤3.2;否则,搜索下一个颜色;3.2 若顶点已全部着色,则输出数组colorn+1,以及数组colorn+1返回;3.3 否则, 3.3.1 若顶点s是一个合法着色,则s=s+1,转步骤3处理下一个顶点; 3.3.2 否则,重置顶点k的着色情况,换第二种颜色给顶点k着色,转步骤3。主要函数:hscolor()贪心法算法过程:设数组colorn+1表示各顶点的着色情况,算法如下:1m=0,sum=0; /m着色的最少

11、颜色数,sum已经着色的顶点数顶点12.while(sum<n)3m=m+14. for (i=1; i<=n; i+)5.寻找可以着颜色1的第一个点,找到就终止此循环6for (i=2; i<=n; i+)7循环用颜色m为尽量多的未着色顶点着色, 7.1 如果判断的点能着颜色m,则colori=m,sum+ 7.2 如果判断的点不能着此颜色,则找寻下一个能着此颜色得点 8.跳回第三步,直到sum>=n5输出colorn,已经最少的颜色数主要函数:txcolor3.2.4 界面设计模块:按题目要求在界面上输入地图的区域数,各区域的连接情况以及选择何种算法来进行着色。结果

12、输出在结果框。3.2.5 主模块:利用以上设计的各个模块来进行调用,其中要选择相应的算法(回溯,贪心)来实现着色,从而完成地图着色,并且直观的结果在屏幕上显示出来。3.3 程序流程图开始输入区域数n按钮?选择算法输入chscolor()txcolor()输出结果结束贪心算法回溯算法4 详细设计4.1 地图输入模块4.1.1数据类型:int n; 顶点数int cn+1n+1; 邻接矩阵String data;地图中各点的邻接连接情况,用0.1表示4.1.2 具体实现: n = textField.getText();/将定义的textField中的数据给n String data = text

13、Area1.getText().split(" ");/将textArea1中的0.1数组给data for (int i = 1; i < n+1; i+) for (int j = 1; j < n+1; j+) Array_1.cij = data(i-1)*Array_1.n+j-1 /将data一维数组赋值给c二维数组4.2 界面设计模块4.2.1 数据类型 public JTextField textField = new JTextField();public JTextArea textArea1 = new JTextArea();/设置文本域

14、public Jbutton button;/设置按钮 public static JTextArea textArea3 = new JTextArea();/文本域 private JLabel label_1;/输入文本标签private JPanel contentPane;/整个界面4.2.2 具体实现*设计主面板*setTitle("图的着色");/设置名字 setBounds(100, 100, 604, 380); /设置大小 contentPane = new JPanel(); setContentPane(contentPane); contentPa

15、ne.setBackground(Color.GREEN); /设置颜色 *设计结束*文本域1*JLabel label = new JLabel("请输入地图的区域数"); label.setFont(new Font("微软雅黑", Font.BOLD, 15); label.setBounds(23, 10, 166, 34); contentPane.add(label);textField.setBounds(23, 42, 192, 34); textField.setText("5");/设置初始值 contentPan

16、e.add(textField); textField.setColumns(10); *设计结束* *文本域2* label_1 = new JLabel("请输入各区域连接情况"); label_1.setFont(new Font("微软雅黑", Font.BOLD, 13); label_1.setBounds(23, 86, 166, 30); contentPane.add(label_1); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(23, 125, 1

17、92, 147); contentPane.add(scrollPane); textArea1.setText("0 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1");/设置文本域二的初始值 scrollPane.setViewportView(textArea1);*设计结束* *按钮设计* JButton button = new JButton("贪心法"); button.setFont(new Font("微软雅黑", Font.BOLD, 14); button.setB

18、ounds(23, 282, 92, 34); button.addActionListener(new MyEvent(); contentPane.add(button); JButton button = new JButton("回溯法");/设置按钮名字 button.addActionListener(new MyEvent(); button.setFont(new Font("微软雅黑", Font.BOLD, 14); button.setBounds(140, 282, 92, 34); contentPane.add(button)

19、; *设计结束*结果文本域* JLabel label = new JLabel("染色结果"); label.setFont(new Font("微软雅黑", Font.BOLD, 15); label.setBounds(369, 20, 84, 15); contentPane.add(label); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(248, 42, 321, 273); contentPane.add(scrollPane); scrollPane.

20、setViewportView(textArea3); *设计结束* 4.3 算法设计模块 4.3.1 回溯法主要代码 int i;int N=4;/设计颜色数为4,但是并不是用这么多颜色,程序最终的结果是最优的,即输出来的颜色数肯定最少,因为四色定理 if(s>n)/递归出口,递归的最终出口 output();/输出结果 else for(i=1;i<=N;i+)/对每一种色彩逐个测试 colors=i;if(colorsame(s)=0)/当测试这个颜色i=1为某个点着色不合格时,用第二种颜色着色,i=2进行判断,合格进行递归调用,不合格就使用第三种颜色,即i=3 trycol

21、or(s+1);/进行下一块的着色 break;/停止回溯,因为已经着色成功 4.3.2 贪心法主要代码while(sum< n)/最终的判定条件,即将所有点着色完毕 m+;/第一次循环,m=1,m即为颜色数 for(int i=1;i<=n;i+)/此循环用来查找第一个为着色的并且可以着色m的点 if(colori=0) j=i;/j=1 colorj=m; sum+; break;/结束当前循环 for(int i=j+1;i<=n;i+)/i=2 if(colori!=0) continue;/colori的起始值为零,false,不执行continue,表示没有着色,

22、因此执行下一步,否则起始值不为0,则表示已经成功着上颜色。 if (ok(i,m) continue;/ok(i,m),如果返回值为ture,表明有颜色与此点将要着的颜色相同,则执行continue,即不将i着色为m,结束本次循环,此点在之后着色。 else /点i可以着色为m,记录colori=m colori=m; sum+; 5 程序设计模块5.1 界面设计代码(Graph.java)import java.lang.System;import java.awt.Color;import java.awt.EventQueue;import javax.swing.JFrame;impo

23、rt javax.swing.JPanel;import javax.swing.JLabel;import javax.swing.JTextField;import javax.swing.JTextArea;import javax.swing.JButton;import java.awt.Font;import javax.swing.JScrollPane;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;/*类Graph*public class Graph extends JFrame

24、private static final long serialVersionUID = 1L;public static long startTime = 0; public static long estimatedTime = 0;private JPanel contentPane; public JTextField textField = new JTextField(); public JTextArea textArea1 = new JTextArea(); public static JTextArea textArea3 = new JTextArea(); privat

25、e JLabel label_1;/*主函数*public static void main(String args) EventQueue.invokeLater(new Runnable() public void run() try Graph frame = new Graph(); frame.setVisible(true); catch (Exception e) e.printStackTrace(); ); /*主函数结束*/*鼠标事件* class MyEvent implements ActionListener public void actionPerformed(A

26、ctionEvent e) Array_1.n = Integer.parseInt(textField.getText(); System.out.println(Array_1.n); String data = textArea1.getText().split(" "); System.out.println(textArea1.getText(); Array_1.c = new int(Array_1.n)+1(Array_1.n)+1; for (int i = 1; i < (Array_1.n)+1; i+) for (int j = 1; j &l

27、t; (Array_1.n)+1; j+) Array_1.cij = Integer.parseInt(data(i-1)*Array_1.n+j-1); Array_1.color=new intArray_1.n+1; for(int i=0;i<=Array_1.n;i+) Array_1.colori=0;/初始化 if (e.getActionCommand().equals("贪心法") Array_1.text_temp = Array_1.text_temp+"贪心详细的着色过程:" Array_1.text_temp = Arr

28、ay_1.text_temp+"n"startTime = System.nanoTime();Array_1.graphcolor(); if (e.getActionCommand().equals("回溯法") Array_1.text_temp = Array_1.text_temp+"回溯详细的着色过程:" Array_1.text_temp = Array_1.text_temp+"n"startTime = System.nanoTime(); Array_1.trycolor(1); /*事件结束*

29、/*界面设计*public Graph() setTitle("图的着色"); setBounds(100, 100, 604, 380); contentPane = new JPanel(); setContentPane(contentPane); contentPane.setLayout(null); contentPane.setBackground(Color.GREEN); JLabel label = new JLabel("请输入地图的区域数"); label.setFont(new Font("微软雅黑", Fo

30、nt.BOLD, 15); label.setBounds(23, 10, 166, 34); contentPane.add(label); textField.setBounds(23, 42, 192, 34); textField.setText("5"); contentPane.add(textField); textField.setColumns(10); label_1 = new JLabel("请输入各区域连接情况"); label_1.setFont(new Font("微软雅黑", Font.BOLD, 13

31、); label_1.setBounds(23, 86, 166, 30); contentPane.add(label_1); JButton button = new JButton("贪心法"); button.setFont(new Font("微软雅黑", Font.BOLD, 14); button.setBounds(23, 282, 92, 34); button.addActionListener(new MyEvent(); contentPane.add(button); JScrollPane scrollPane = new J

32、ScrollPane(); scrollPane.setBounds(23, 125, 192, 147); contentPane.add(scrollPane); textArea1.setText("0 1 1 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1"); scrollPane.setViewportView(textArea1); JButton button = new JButton("回溯法"); button.addActionListener(new MyEvent(); button.s

33、etFont(new Font("微软雅黑", Font.BOLD, 14); button.setBounds(140, 282, 92, 34); contentPane.add(button); JLabel label = new JLabel("染色结果"); label.setFont(new Font("微软雅黑", Font.BOLD, 15); label.setBounds(369, 20, 84, 15); contentPane.add(label); JScrollPane scrollPane = new

34、JScrollPane(); scrollPane.setBounds(248, 42, 321, 273); contentPane.add(scrollPane); scrollPane.setViewportView(textArea3); /*设计完毕*/*类Graph结束*5.2 染色实现模块(Array_1.java)/*Array_1类*public class Array_1 public static int n ; public static int c ; public static int color ; public static String text_temp=n

35、ew String("");/*回溯求解*public static int colorsame(int s) int j,flag=0; for(j=1;j<s;j+) if(cjs=1&&colorj=colors) flag=1;break; return flag;public static void output()text_temp = text_temp +"n" System.out.printf("区域的邻接矩阵为:n"); text_temp = text_temp +"区域的邻接矩

36、阵为:"+"n" for(int k=1;k<n+1;k+) for(int m=1;m<n+1;m+) System.out.print(ckm+" "); text_temp = text_temp + Integer.toString(ckm)+ " " System.out.print("n"); text_temp = text_temp +"n" text_temp = text_temp +"n" System.out.printf(&qu

37、ot;着色方案:n");text_temp = text_temp +"着色方案:"+"n"for(int i=1;i<=n;i+) System.out.print(colori+" "); text_temp = text_temp +"第"+Integer.toString(i)+"个区域着色:"+ Integer.toString(colori) + " "+"n" int j=color1; for(int k=2;k<=n

38、;k+) if(j<=colork) j=colork; System.out.print("n"); text_temp = text_temp+"n" System.out.println("能着的最少颜色数为:"); text_temp = text_temp + "能着的最少颜色数为:"+"n" System.out.println(j); text_temp = text_temp + Integer.toString(j)+"n" ; text_temp =

39、 text_temp +"运行时间:" + Graph.estimatedTime+"毫微秒(ns)" text_temp = text_temp +"n" Graph.textArea3.setText(text_temp);public static void trycolor(int s) int i; int N=4; if(s>n) Graph.estimatedTime = System.nanoTime() - Graph.startTime; output(); else for(i=1;i<=N;i+)

40、colors=i; if(colorsame(s)=0) System.out.println("颜色"+i+"能为区域"+s+"着色"); text_temp = text_temp +"颜色"+Integer.toString(i)+"能为区域"+Integer.toString(s)+"着色" text_temp=text_temp+"n" trycolor(s+1);break; else System.out.println("颜色&q

41、uot;+i+"不能为第"+s+"点着色"); text_temp = text_temp +"颜色"+Integer.toString(i)+"不能为区域"+Integer.toString(s)+"着色" text_temp=text_temp+"n" /*回溯完毕*/*贪心求解*public static boolean same(int k,int r)/判断顶点k的着色是否发生冲突 for(int i=1;i< n;i+) if(colori!=r) cont

42、inue; if(cki=1&&colori=r ) return true; return false;public static void graphcolor() int j=1,m=0,sum=0; while(sum< n) m+;/第一次循环,m=1 for(int i=1;i<=n;i+) if(colori=0)/color1=0 j=i;/j=1 colorj=m;/color1=1 System.out.println("颜色"+m+"能为第"+j+"点着色"); text_temp =

43、 text_temp +"颜色"+Integer.toString(m)+"能为区域"+Integer.toString(j)+"着色" text_temp=text_temp+"n" sum+; break; for(int i=j+1;i<=n;i+) if(colori!=0) continue; if (same(i,m) System.out.println("颜色"+m+"不能为第"+i+"点着色"); text_temp = text_

44、temp +"颜色"+Integer.toString(m)+"不能为区域"+Integer.toString(i)+"着色" text_temp=text_temp+"n" continue; else colori=m; System.out.println("颜色"+m+"能为第"+i+"点着色"); text_temp = text_temp +"颜色"+Integer.toString(m)+"能为区域"+

45、Integer.toString(i)+"着色" text_temp=text_temp+"n" sum+; Graph.estimatedTime = System.nanoTime() - Graph.startTime; text_temp = text_temp +"n" System.out.printf("区域的邻接矩阵为:n"); text_temp = text_temp +"区域的邻接矩阵为:"+"n" for(int k=1;k<n+1;k+) for(int l=1;l<n+1;l+) System.out.print(ckl+" "); text_temp = text_temp + Integer.toString(ckl)+ " " System.out

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论