地图着色课程设计Word版.doc

上传人:rrsccc 文档编号:9110266 上传时间:2021-02-02 格式:DOC 页数:30 大小:125KB
返回 下载 相关 举报
地图着色课程设计Word版.doc_第1页
第1页 / 共30页
地图着色课程设计Word版.doc_第2页
第2页 / 共30页
地图着色课程设计Word版.doc_第3页
第3页 / 共30页
地图着色课程设计Word版.doc_第4页
第4页 / 共30页
地图着色课程设计Word版.doc_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《地图着色课程设计Word版.doc》由会员分享,可在线阅读,更多相关《地图着色课程设计Word版.doc(30页珍藏版)》请在三一文库上搜索。

1、传播优秀Word版文档 ,希望对您有帮助,可双击去除!算法分析与设计课程设计说明书地图着色学 院: 计算机与控制工程学院 专 业: 计算机科学与技术 学生姓名:xxxxx 学号: 成绩 学生姓名:xxxxx 学号: 成绩 指导教师: 内 容 提 要此题为地图着色问题,由地图着色问题很容易想到图的着色问题,因此可以把地图抽象为无向图来解决地图的着色问题。对地图的抽象相当于对图的抽象,即以邻接矩阵来实现地图的区域相邻的描绘,而对地图的区域数即以图的顶点数来描绘。设计说明书的内容包括需求分析,概要设计,详细设计,代码实现,后期测试等内容,需求分析是对此问题所需要实现的功能的介绍,概要设计是对所需要实

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

3、法设计 32.4.3 界面设计 32.4.4 输出设计 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 染色实现模块15

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

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

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

7、算机上用邻接矩阵实现。相应的顶点为0,则表示两点邻接,否则,就不邻接,为1.2.4.2:地图着色的算法设计:回溯法:本题可采用回溯法进行着色。当t=1时,对当前第t个顶点开始着色:若tn,则已求得一个解,输出着色方案即可。否则,依次对顶点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

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

10、设数组colorn+1表示各顶点的着色情况,其中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表示各顶点的着色情况,算法如下:

11、1m=0,sum=0; /m着色的最少颜色数,sum已经着色的顶点数顶点12.while(sumn)3m=m+14. for (i=1; i=n; i+)5.寻找可以着颜色1的第一个点,找到就终止此循环6for (i=2; i=n5输出colorn,已经最少的颜色数主要函数:txcolor3.2.4 界面设计模块:按题目要求在界面上输入地图的区域数,各区域的连接情况以及选择何种算法来进行着色。结果输出在结果框。3.2.5 主模块:利用以上设计的各个模块来进行调用,其中要选择相应的算法(回溯,贪心)来实现着色,从而完成地图着色,并且直观的结果在屏幕上显示出来。3.3 程序流程图开始输入区域数n按

12、钮?选择算法输入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 = textArea1.getText().split( );/将textArea1中的0.1数组给data for (int i = 1; i n+1; i+) for (int j = 1; j n)/递归出

13、口,递归的最终出口 output();/输出结果 else for(i=1;i=N;i+)/对每一种色彩逐个测试 colors=i;if(colorsame(s)=0)/当测试这个颜色i=1为某个点着色不合格时,用第二种颜色着色,i=2进行判断,合格进行递归调用,不合格就使用第三种颜色,即i=3 trycolor(s+1);/进行下一块的着色 break;/停止回溯,因为已经着色成功 4.3.2 贪心法主要代码while(sum n)/最终的判定条件,即将所有点着色完毕 m+;/第一次循环,m=1,m即为颜色数 for(int i=1;i=n;i+)/此循环用来查找第一个为着色的并且可以着色m

14、的点 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,表示没有着色,因此执行下一步,否则起始值不为0,则表示已经成功着上颜色。 if (ok(i,m) continue;/ok(i,m),如果返回值为ture,表明有颜色与此点将要着的颜色相同,则执行continue,即不将i着色为m,结束本次循环,此点在之后着色。 else /点i可以着色为m,记录colori=m colori

15、=m; sum+; 5 程序设计模块5.1 界面设计代码(Graph.java)import java.lang.System;import java.awt.Color;import java.awt.EventQueue;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JLabel;import javax.swing.JTextField;import javax.swing.JTextArea;import javax.swing.JButton;import java.awt.Font;im

16、port javax.swing.JScrollPane;import java.awt.event.ActionListener;import java.awt.event.ActionEvent;/*类Graph*public class Graph extends JFrame private static final long serialVersionUID = 1L;public static long startTime = 0; public static long estimatedTime = 0;private JPanel contentPane; public JTe

17、xtField textField = new JTextField(); public JTextArea textArea1 = new JTextArea(); public static JTextArea textArea3 = new JTextArea(); private JLabel label_1;/*主函数*public static void main(String args) EventQueue.invokeLater(new Runnable() public void run() try Graph frame = new Graph(); frame.setV

18、isible(true); catch (Exception e) e.printStackTrace(); ); /*主函数结束*/*鼠标事件* class MyEvent implements ActionListener public void actionPerformed(ActionEvent e) Array_1.n = Integer.parseInt(textField.getText(); System.out.println(Array_1.n); String data = textArea1.getText().split( ); System.out.println

19、(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 (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.getActionC

20、ommand().equals(贪心法) Array_1.text_temp = Array_1.text_temp+贪心详细的着色过程:; Array_1.text_temp = Array_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

21、= System.nanoTime(); Array_1.trycolor(1); /*事件结束*/*界面设计*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

22、Font(微软雅黑, Font.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); label_1.setBounds(23

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 JScrollPane(); scrollPane.setBounds(23, 125, 192

24、, 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.setFont(new Font(微软雅黑, Font.BOLD, 14); button.setBounds(140, 282, 92, 34

25、); 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 JScrollPane(); scrollPane.setBounds(248, 42, 321, 273); contentPane.add(scrollPane); scrollPane.setViewport

26、View(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=new String();/*回溯求解*public static int colorsame(int s) int j,flag=0; for(j=1;js;j+) if(cjs=1&colorj=colors)

27、flag=1;break; return flag;public static void output()text_temp = text_temp +n; System.out.printf(区域的邻接矩阵为:n); text_temp = text_temp +区域的邻接矩阵为:+n; for(int k=1;kn+1;k+) for(int m=1;mn+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.pr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1