欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

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

    • 资源ID:9110266       资源大小:125KB        全文页数:30页
    • 资源格式: DOC        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    传播优秀Word版文档 ,希望对您有帮助,可双击去除!算法分析与设计课程设计说明书地图着色学 院: 计算机与控制工程学院 专 业: 计算机科学与技术 学生姓名:xxxxx 学号: 成绩 学生姓名:xxxxx 学号: 成绩 指导教师: 内 容 提 要此题为地图着色问题,由地图着色问题很容易想到图的着色问题,因此可以把地图抽象为无向图来解决地图的着色问题。对地图的抽象相当于对图的抽象,即以邻接矩阵来实现地图的区域相邻的描绘,而对地图的区域数即以图的顶点数来描绘。设计说明书的内容包括需求分析,概要设计,详细设计,代码实现,后期测试等内容,需求分析是对此问题所需要实现的功能的介绍,概要设计是对所需要实现功能的模块划分,以及初步的实现思想,详细设计通过编写大致的代码来实现功能,代码实现则是具体的解决问题,解决此问题设计了两个算法,贪心,回溯,在程序的测试阶段,回溯算法对同一个问题的解决速率高于贪心算法,但是结果都是以最少的颜色数来染色。课题实现的环境是在window环境下的eclipse中,通过在其中输入地图的区域数,图的连接情况,来选择相应的算法来实现染色,本次课题所采用的数据结构主要是二维数组来抽象图的邻接矩阵。目 录1引言(或绪论)12 需求分析22.1 问题分析 22.3问题解决22.3 运行环境及开发工具32.4 功能需求 32.4.1 地图的抽象及输入 32.4.2 地图着色的算法设计 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 染色实现模块156 程序测试196.1 运行结果196.2 贪心、回溯着色结果及分析197 算法时间、空间复杂度分析227.1 递归回溯227.2 贪心算法228 课设总结 228.1 已实现功能及不足228.2 心得体会22参考文献241 引言(或绪论)此次课程设计的要求是已知某地图(如中国地图),对各区域进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。此问题就是经典的地图着色问题,地图着色问题与四色定理是紧密相关的。地图着色问题与著名四色定理:四色定理是一个著名的数学定理:如果在平面上划出一些邻接的有限区域,那么可以用四种颜色来给这些区域染色,使得每两个邻接区域染的颜色都不一样;另一个通俗简洁的说法是:每个地图都可以用不多于四种颜色来染色,而且不会有两个邻接的区域颜色相同。这就是著名的四色定理,由四色定理可以想到只需要四种颜色就可以为一个区域的地图着上颜色,而且相邻区域的颜色不相同。2 需求分析2.1 问题分析:地图着色问题是一个抽象的图形学问题,用程序实现对各个区域进行着色,并且相邻省所用的颜色不同,同时保证颜色的总数最少,那么就是如何将这些抽象的进行数据化。如何将程序所需要的功能模拟着色在计算机中编程实现。2.2 问题解决:计算机中,图主要可以用两种方法表示:邻接矩阵和邻接链表。N个顶点的邻接矩阵是一个N*N的布尔矩阵,图中的每一个顶点都由一行或者一列来表示,如果从第i个顶点和第j个顶点之间有边连接,则矩阵第i行,第j列的元素等于1,如果没有边连接,则等于0.这就是图的邻接矩阵表示那么地图也可以抽象为一个图,其可以用邻接矩阵来进行模拟:对于每一个地图, 我们可以把每一个区 区域或国家) 看作一个点, 而区与区之间的邻接关系看作点与点之间的连线。从而将地图抽象为一个图,然后就可以用邻接矩阵抽象。如下图:其邻接矩阵为:ABCDEA 01100B10111C11001D01001E011112.3运行环境及开发工具:运行环境:windows系统开发工具:eclipse编程工具2.4 功能需求:2.4.1:地图的抽象及输入:给定一个地图,要求画出绘制出其图的形式,并在计算机上用邻接矩阵实现。相应的顶点为0,则表示两点邻接,否则,就不邻接,为1.2.4.2:地图着色的算法设计:回溯法:本题可采用回溯法进行着色。当t=1时,对当前第t个顶点开始着色:若t>n,则已求得一个解,输出着色方案即可。否则,依次对顶点t着色1-m, 若t与所有其它相邻顶点无颜色冲突,则继续为下一顶点着色;否则,回溯,测试上一颜色。回溯法的主要就是选择各种颜色,直到把此点着完色为止。贪心法:选择一种颜色,以任意顶点作为开始顶点,依次考察图中的未被着色的每个顶点,如果一个顶点可以用颜色1着色,换言之,该顶点的邻接点都还未被着色,则用颜色1为该顶点着色,当没有顶点能以这种颜色着色时,选择颜色2和一个未被着色的顶点作为开始顶点,用第二种颜色为尽可能多的顶点着色,如果还有未着色的顶点,则选取颜色3并为尽可能多的顶点着色,依此类推,直到所有顶点都着上颜色。贪心法就是选择一种颜色,最大化的将图中的各点都用这种颜色着上。2.4.3:界面设计:地图着色的软件界面设计,选择何种算法,以及选择几种颜色来为相应的地图桌上颜色。2.4.4:输出设计按要求输出动态的着色过程以及最终的染色结果,同时输出最终的着色结果,以及最少颜色数,在输出框里面输出。2.5 任务分配:xxx:贪心法算法设计,界面设计xxx:回溯法算法设计3概要设计3.1 数据定义:int cn+1n+1:邻接矩阵的中的数据只为0.1int color n+1:存取对对应的点的颜色,颜色用1,2,3,4表示int n:定义对应的点数int N 着色的颜色数3.2功能模块定义:3.2.1 地图的抽象输入模块:按操作者要求输入相应地图对应图的点数,以及相应点与其他点的连接情况,此输入在界面输入,其中点数表示某个区域的地区数,而连接情况表示各区域的相邻情况,用此来抽象地图。 3.2.2 输出模块:按操作者输入的数据,执行相应的算法,并且在界面上显示出来最终的结果,输出的有图的邻接矩阵,着色方案,还有图的着色的最少颜色数。3.2.3 地图的染色模块:利用贪心算法以及回溯算法来为地图进行着色,即判断相应的点应该着那种颜色。回溯法算法过程:设数组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表示各顶点的着色情况,算法如下:1m=0,sum=0; /m着色的最少颜色数,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 界面设计模块:按题目要求在界面上输入地图的区域数,各区域的连接情况以及选择何种算法来进行着色。结果输出在结果框。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 = textArea1.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();/设置文本域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); contentPane.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");/设置初始值 contentPane.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, 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.setFont(new Font("微软雅黑", Font.BOLD, 14); button.setBounds(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); *设计结束*结果文本域* 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.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 trycolor(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,表示没有着色,因此执行下一步,否则起始值不为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;import 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 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(); private 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(ActionEvent 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 < (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 = 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 = 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 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, 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, 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); 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.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=new 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 +"区域的邻接矩阵为:"+"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.pr

    注意事项

    本文(地图着色课程设计Word版.doc)为本站会员(rrsccc)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




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

    三一文库
    收起
    展开