数据结构        课程实验报告

实验题目: 33题,对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示。
实验学时:一周 实验日期:
实验目的:对给定AOV网络,产生所有的拓扑排序结果,并进行动态演示

硬件环境:
Win
软件环境:
Vs
Qt

目录
一. 任务概述 2
1.1背景描述 2
1.2题目描述 3
1.3实验目的 3
二. 需求分析 4
2.1 UML用例图 4
2.2功能性需求分析 4
2.2.1建立初始界面 4
2.2.2提供有向图信息的输入途径 4
2.2.3可视化展示通过用户输入信息建立的有向图 5
2.2.4实现用户控制动态演示 5
2.2.5明确显示拓扑排序的结果 5
2.3非功能性需求分析 6
2.3.1易用性 6
2.3.2效率 6
2.3.3可扩展性 6
2.4各界面需求分析 6
三.编程分析与设计 8
3.1项目制作流程设计 8
3.2 概念设计(ER图) 9
3.3模块设计 9
3.4 UI设计 9
3.5类设计(UML类图) 11
3.6数据结构设计 12
3.7难点分析与算法设计 13
3.7.1如何求出有向无环图所有的拓扑序列 13
3.7.2如何实现用户控制动态演示 14
3.7.3如何把顶点均匀的绘制在界面上 15
四.系统实现 15
4.1测试数据及结果 15
4.2遇到的错误及修改 19
4.2.1部分数据测试不正确----算法逻辑有问题 19
4.2.2动态演示不成功 19
4.2.3qt安装不成功 19
五.程序评价 20
5.1项目优点 20
5.2项目缺点 20
5.3项目改进与优化… 20
六.分析与体会 20

一. 任务概述
1.1背景描述
AOV网和拓扑排序:
AOV网是一个有向无环图,拓扑排序就是将有向无环图中的各个顶点排成一个序列,使得所有的前驱后继关系都得到满足。对于相互之间没有次序关系的顶点,在拓扑排序中可以处在任意的位置。因此,拓扑排序的结果往往不是唯一的。

比如在该图中,所有的拓扑排序为以及好几种
1 3 2 4 5
1 3 4 2 5
1 3 4 5 2
1 4 3 2 5
1 4 3 5 2
1.2题目描述
对给定的AOV网,产生所有的拓扑序列,给出求解过程的动态演示。
题目可分解为以下三点:
(1) 产生AOV网
(2) 对确定的AOV网,给出所有的拓扑序列
(3) 动态演示求解拓扑序列的过程
1.3实验目的
通过本次课程设计,进一步理解拓扑排序的原理,进一步体会递归方法的设计与使用,进一步掌握各种基本抽象数据类型的逻辑结构、存储结构和实现操作算法,以及它们的使用方法,提高编程能力,分析问题和解决问题的能力。
二. 需求分析

2.1 UML用例图

2.2功能性需求分析
2.2.1建立启动界面
启动界面即我们的ui操作界面。

2.2.2提供有向图信息的输入途径
(1) 项目主体(AOV网)的信息通过用户获取,通过控制台获得相关信息
2.2.3可视化展示通过用户输入信息建立的有向图
用户输入的信息均为数字化信息,很有可能输入错误,出现系统建立的有向图不是用户想要测试的有向图的情况。为使用户可以形象方便的观察:
(1) 在界面中将用户描述的有向图绘制出来,要求图中各点均匀分布,能清晰识别图中边点情况
(2) 展示有向图的邻接矩阵,向用户提供进一步检验有向图的途径,同时有利于当系统出错时能够排除有向图的建立过程出错的情况
2.2.4实现用户控制动态演示
在得到结果后,可以对所有的结果依次进行动态演示。也可以进行一次次点击操作进行,

2.2.5明确显示拓扑排序的结果
对于有向无环图,在动态演示之后,屏幕上应显示出全部的拓扑排序结果;
对于有环图,应给出“该有向图中存在环”的提示,且该提示的出现时间应该能够体现出拓扑排序的动态过程,即程序进行到没有可删除的顶点时再弹出该提示。

2.3非功能性需求分析

2.3.1易用性
(1)项目界面清晰明确,界面之间的切换都在按钮中说明,用户能根据自己的需求准确进行项目的操作,没有繁琐复杂的使用说明。
(2)项目流程清晰明了,用户浏览流程之后很容易上手
(3)对于所有可能的错误,项目对用户都会弹出提示窗口,用户根据窗口提示可立即定位问题、解决问题,使用便捷

2.3.2效率

本项目占用的空间较小,项目退出之后将自动调用析构函数释放空间。

2.3.3可扩展性

本项目的设计背景是最基础的拓扑排序,可通过对本项目进一步扩展完善,使其应用于一些基于拓扑排序原理的情景,比如课程安排等。个人日程安排等

2.4界面需求分析

三.编程分析与设计

3.1项目流程设计

1)理解拓扑排序的思想过程,明确具体步骤,同时进行控制台代码实现
2)要产生算法的所有可能结果,所以按照以前的产生单一结果的算法就不太够用,于是运用dfs回溯的思想,首先完成控制台代码实现,实现输出所有的可能结果。
3)在完成控制台代码实现后,通过qt完成界面设置,同时在代码思想的指导下,将控制台代码 符合逻辑的嵌入qt界面中,并加入相应的动态演示,
4)

1.2 概念设计(类图)

3.3模块设计

借鉴MVC这一设计模式,可以把整个项目代码文件分为如下几个模块:逻辑模块、数据模块、显示模块。
(1) 逻辑模块:逻辑模块主要是包括各个算法,比如求全部拓扑序列的核心算法、用户控制拓扑演示的逻辑部分等。
(2) 数据模块:主要用于数据存放,比如存放变边点信息的数组、存放拓扑排序结果的链表、存放顶点位置的二维数组等。
(3) 显示模块:显示模块是控制程序UI显示的模块,除我的主界面外还包含各种单独的、可重复利用的组件类。

3.4 UI设计

  1. 初始化界面,将输入的点和线段都在界面上显示出来
  2. 显示所有拓扑排序结果
  3. 演示动态排序过程
    所有的关键代码将在附录部分展示

一.初始化界面

  1. 根据输入,放置顶点
    一开始使用随机函数来确定位置,但界面输出效果不够清晰美观,很容易
    出现三点在平面内同一条线上,于是提前创建位置数组,每一次将新加入的顶点放在未被占据的位置上,同时调用画图,画点函数

添加线段,根据线段两端的的端点,通过相应函数封装,实现画线

  1. 根据点,绘制线段
    由于在qt的window里,界面的重绘函数update过于麻烦,于是创建一个线段类,设置成员属性inid,outid来代表线段两端的两点,同时重写绘画函数,用于绘图。

  2. 给线段加上箭头
    Qt本身没有带箭头的线段,于是箭头的实现通过获取线段的角度和终点坐标,通过几何函数计算,绘制箭头

  3. 减少误差,在实现ui画图时为啦减少误差,于是通过暴力逼近的思想,每次查找中间点,如果到顶点的距离来的比半径大,就一直二分取中点来尽力将线段的顶点和终点固定在圆点控件的边缘。如下图的Getin
    和getout函数

二.显示所有结果

通过之前的算法,合理的将算法加入进去,将输出结果放入结果表格中,更加直观
三.演示排序过程
原本想着直接将解法递归过程演示出来,但展示效果很让人糊涂,于是选择将结果信息记录下来,在演示事件中,遍历结果数据。展示拓扑排序的思路。
演示界面通过show和hide函数来实现点和线的出现与消失,
动态实现通过延迟函数来实现

3.5类设计

主要的自定义类
由于在qt的window里,界面的重绘函数update过于麻烦,于是创建一个线段类,设置成员属性inid,outid来代表线段两端的两点,同时重写绘画函数,使两点之间线段的绘制更加方便。

3.6数据结构设计

本项目用到的数据结构主要是数组和链表。
(1) 存放有向图信息:由于系统最先获取到顶点数量和边的数量,所以在存放顶点名称及各边的起点、终点时直接使用数组存放即可。在有向图可视化展示界面中,为使用户能够快速判断两个顶点之间是否存在边,选择用邻接矩阵(一个二维数组)存放有向图。
(2) 存放各顶点在图中的位置:使用二维数组存放拓扑序列区顶点的位置坐标:为实现动态演示拓扑排序的过程,需要一个区域存放拓扑排序的结果序列,此时分两种情况:
a. 有向图无环:此时在拓扑排序的核心算法中已经求得总的拓扑序列数,而每个拓扑序列中顶点的个数一定是有向图中顶点的个数,故使用两个二维数组存放x、y坐标即可
b. 有向图有环:此时拓扑序列个数为0,如果与a情况共用一套位置坐标,数组初始化时会报错,而且此时能放入拓扑序列区的顶点个数是未知的,所以采用链表存储
(3) 存放拓扑排序的结果,也分两种情况:
a. 有向图无环:拓扑排序的结果需要在拓扑算法中实时存储,虽然每个拓扑序列的顶点个数已知,但拓扑序列的个数在存储时未知,所以采用链表存储,链表的节点类型为一维数组
b. 有向图有环:此时只需要记录可以存入序列的顶点,用于动态演示时绘制在拓扑序列区,顶点数量未知,故采用链表存储,节点类型为整型数

3.7难点分析与算法设计

3.7.1如何求出有向无环图所有的拓扑序列

拓扑序列其实就是对顶点的一种排列,其结果其实是全排列的一种或几种,所以设计拓扑排序可以在全排列的基础上,对输出内容加以限制,伪代码如下:

*void topoSort(int n) //正在排拓扑序列的第i个位置
{
if(图中所有顶点都被访问)输出队列中的排序结果
else{if ( 图中不存在入度为0且未被访问的节点 ){图G存在回路,无法拓扑排序}else{for (图中每个入度为0且未被访问的节点v){先将v插入拓扑排序的队列中的第i个位置上然后将v及以它为起点的边从图G中删除topoSort(n+1);将刚才删除的v及其所有的边恢复}
}}}*

3.7.2如何实现用户控制动态演示
新加入一个move按钮,可以通过用户的每一次点击,移动相对应的线和点。更直观的感受
3.7.3如何把顶点均匀的绘制在界面上
考虑到让用户输入各个顶点的位置坐标太过繁杂,需要用户事先计算和安排好各顶点的分布,决定用产生随机数的方法产生顶点坐标,把它们限制在某个区域内,但是产生随机数也很容易造成分布不均匀,顶点和边互相覆盖造成有向图不清晰, 于是对顶点进行分组,然后在区域内分配固定位置,更好的思路应该hi是利用棋盘和八皇后的思想动态寻找位置,确保每一个点都合适。

四.系统实现

4.1测试数据及结果

(1)输入1→2,2→4,1→3,3→4:

(3)输入1→2,2→3,3→4,4→5,5→3:

4.2遇到的错误及修改

4.2.1部分数据测试不正确----核心算法有问题
(1)在设计动态演示算法的时候,因延迟函数处理失误导致代码演示未达到目标,最后再次理解核心dfs算法之后再设计其代码逻辑解决。
4.2.2动态演示不成功
在设计好并实现了动态演示的思路之后,发现点击“下一步”按钮并之后并不是预想的效果,会出现各种问题,比如输出拓扑序列的时候总是提前一步弹出提示窗口、最后一个顶点总是不出现在序列中,还有会报错数组越界等等,后来拿着纸笔跟着程序一步一步的进行,发现错误的原因是判断条件和更改变量的操作顺序不恰当导致的,比如topos的值未判断大小就进行了+1操作,还有应该在下一次点击时进行的操作会在这次点击时发生。在分析了问题之后,重新设计了更改变量和判断条件的顺序,解决了这个问题。
4.2.3qt安装错误
最初根据部分网络教程下载和配置qt路径,总是出错,一进入总是出现未响应界面,后来思考可能部分组件冲突,于是再一次重新下载时,在组建勾选栏没有再全选,而是谨慎选择,最终成功打开

五.程序评价

5.1项目优点

(1) 功能全面:提供了满足各种需求的功能;
(2) 界面区分清楚,交易操作,结果和过程都通俗易懂
(3) 关键代码部分思路清楚,通过对项目的模块化设计,使得编程效率更高而且维护性更强。

(4) 对点与线之间的坐标获取更加精准,获得更好的观感体验

5.2项目缺点

(1) 代码赘余:虽然代码思路比较清晰,但具体的实现方面采用了最笨的方法,还有一些变量应该可以得到更充分的二次利用
(2) 未能扩展:项目只是实现了最基本的实验要求,未能对拓扑排序的应用场景进行挖掘,使其更具有现实意义
(3) 录入信息界面依托的是控制台命令,太简陋。
(4) 初始化位置时,没有用较为完美的方法实现,用的方法比较简单,且不具有普适性

5.2项目改善和优化方向


1,加入啦只产生一种结果的动态演示过程,更方便理解整个拓扑排序过程,实现用户每点击一下,就能对满足条件的顶点和与该顶点关联的边进行操作。
2,将部分数组变为map,存储hash值,节省遍历时间,适用于for循环较多的情况

待改善: 在初始化的时候,创建一个棋盘,利用类似八皇后的算法来实现每一行每一列只有一个位置被选择。
在做完项目之后感觉还可以在一些方面进行使用性的扩展
比如课程系统,再比如个人计划安排软件。。。。。

六.分析与体会

附录,代码粘贴;
项目目录

Line.h

Mianwindow.h

Line.cpp


对给定的AOV网络,产生所有的拓扑排序结果,并进行解法的动态演示相关推荐

  1. AOV网络(有向图)----拓扑排序--判断有无环的问题--12月18日

    AOV网络 用顶点表示活动的网络 用有向图表示先修和后修的关系. 在有向图中,用顶点表示活动, 用有向边< vi, vj >表示vi 必须先于 v j进行. 如果有有向环则说明某项活动以自 ...

  2. 06.AOV网和图的拓扑排序

    一.AOV网: 相关代码地址:https://gitee.com/gudongkun/datestruct 用顶点表示活动,用弧表示活动的依赖关系,称之为顶点表示活动的网(activity on ve ...

  3. 图算法入门3:活动网络-AOV网络和拓扑排序

    AOV网络 通常一个工程可以分成若干个子工程,这些子工程被称为活动(activity),完成这些活动,整个工程就完成了.给一个简单的例子,如下图,大学专业课程存在依赖关系,对于一些课程必须选修其他课程 ...

  4. 活动网络——AOV网络

    一般一个工程可以分成若干个子工程,这些子工程称为活动.实际上,可以用有向图来表示一个工程,用有向边<u,v>表示活动u必须先于活动v完成.这种有向图叫做顶点表示活动的网络,记作AOV网络( ...

  5. 图论——AOV网络及拓扑排序

    引入 有向无环图(DAG) 如果一个有向图不存在环,也就是任意结点都无法通过一些有向边回到自身,那么称这个有向图为有向无环图 AOV 网络 在有向图中,用顶点表示活动,用有向边<Vi,Vj> ...

  6. 【数据结构笔记30】拓扑排序、AOV网络、AOE网络、关键工序

    本次笔记内容: 8.2.1 拓扑排序 8.2.2 关键路径 文章目录 拓扑排序 引例:计算机专业排课(AOV网络) 拓扑排序的概念与AOV网络 拓扑排序的算法 更加聪明的算法 关键路径问题 AOE(A ...

  7. 图的拓扑排序(AOV网络)

    文章目录 拓扑排序 概念 实现 邻接表(队列) 邻接矩阵(栈) 总结 源代码 邻接表 邻接矩阵 拓扑排序 概念 拓扑排序是对有向无环图的顶点的一种排序. AOV网络 : 在有向图中, 用顶点表示活动或 ...

  8. C++ 拓扑排序(AOV网络)

    一.思路 先扫描所有顶点,把入度为0的顶点(如C,E)进栈.然后,取栈顶元素,退栈,输出取得的栈顶元素v(即入度为0的顶点v).接着,把顶点v的邻接顶点w的入度减1,如果w的入度变为0,则进栈.接着, ...

  9. AOV网络——初了解

    有向图中,用顶点表示事件,用有向边表示活动之间开始的先后顺序,则称这种有向图为AOV(Activity On Vertex)网络:AOV网络可以反应任务完成的先后顺序(拓扑排序). 在AOV网的边上加 ...

最新文章

  1. java设置虚基类的目的_设置虚基类的目的是( )。
  2. Linux 基础知识(十)DNS服务器主从复制,子域授权
  3. 云函数连接mysql超时_云函数访问MYSQL数据库出错?
  4. ELK日志管理之——logstash部署
  5. 2016江苏省盗取计算机技术,2016年江苏省职业学校技能大赛物联网技术应用与维护公开题库...
  6. kafka直连方式消费多个topic
  7. 39 FI配置-财务会计-固定资产-组织结构-定义号码范围间隔
  8. 编写HTML代码常见错误以及解决方法?
  9. 关于Java中的GUI事件处理
  10. 何小鹏总结2017:小鹏汽车融资近50亿,上市车型下月亮相CES
  11. CUDA精进之路(零):CUDA开篇
  12. MCAFEE卸载软件测试初学者,迈克菲卸载软件怎么用(手把手教你彻底卸载干净)...
  13. 事实胜于雄辩,经典中的经典,经久…
  14. 【R语言】结巴分词与词性提取(以“提取知乎问题标题的频繁词前100个形容词”实战为例)(3月25日学习笔记)
  15. 在 Linux 中查找用户帐户和登录详细信息的 11 种方法
  16. 《微信小游戏远程服务器本地搭建》——本地搭建IIS静态文件服务器
  17. python 微信公众号发文章_如何使用 Python 爬取微信公众号文章
  18. 搭建Kubernetes多节点集群
  19. [LeetCode] Sqrt(int x)解题报告之无限逼近(牛顿法)
  20. 植物神经紊乱的影响,你知道有哪些吗?

热门文章

  1. 生产计划为何难实施?
  2. 区块链中节点和区块的关系区块链的基本概念
  3. 如何用计算机制作统计图,如何在EXCEL里做条形统计图?
  4. 数据库以及Mysql入门
  5. 【转载】Cygwin安装
  6. 证明:1/n调和级数为何是发散的
  7. adc0808模数转换实验报告_模数转换实验报告
  8. 【学习笔记】Windows格式文档转换成Unix格式
  9. Long tailed 长尾分布论文汇总
  10. 虚拟服务器共享文件夹禁用,虚拟机共享文件夹禁用,vm虚拟机共享文件夹