BUAA2020个人项目作业小结

BUAA2020软工个人项目小结

零、小结说明

作业链接: 个人项目作业

本次小结四-六部分由子渊学长编写!

一、评分规则

总体分数构成

本次个人项目分数由三部分组成,分别是:

  1. 博客 — 15 分;
  2. 程序 — 35 分;
  3. 附加题 — 2 分。附加题不参与总分映射,直接进入期末成绩。

博客评分规则

发表在你的个人博客上,也可以同时转发到你的团队博客上来增加你们团队博客的人气。博客共 15 分,具体要求如下:

  1. 在文章开头给出教学班级和

    可克隆

    的 Github 项目地址(例子如下)。(1')

  2. 在开始实现程序之前,在下述 PSP 表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5')

  3. 解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。(3')

  4. 设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?单元测试是怎么设计的?(4')

  5. 记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由 VS 2019 的性能分析工具自动生成),并展示你程序中消耗最大的函数。(3')

  6. 代码说明。展示出项目关键代码,并解释思路与注释说明。(3')

  7. 在你实现完程序之后,在 PSP 表格(详见作业要求)记录下你在程序的各个模块上实际花费的时间。(0.5')

程序评分规则

  • 源代码管理 — 5 分。具体关注点为:
    • 源代码目录管理。源代码目录管理是否清晰。:测试须知中给出的目录结构除了 /bin/ 为强制要求外,其余仅为示例。同学可以自行选择合适的目录的结构进行源代码管理。
    • Git 工具使用情况。Commit 信息是否区分标题和详细描述,是否清晰易懂,增量修改是否合适等。
    • 运行说明。是否有运行说明,运行说明的质量等。
    • 是否消除 Code Quality Analysis 中的所有警告。请在博客中给出相应截图。
    • 单元测试。单元测试的数目,测试粒度等。
  • 正确性评分 — 20 分。正确性测试中输入的几何对象个数满足 1 <= N <= 1000,要求程序在 60 秒内给出结果,超时则认定运行结果无效。
  • 性能评分 — 10 分。性能测试中输入的几何对象个数满足 1000 <= N <= 500000,交点个数 h 满足 0 <= h <= 5000000,要求程序在 60 秒内给出结果。性能评分将采取档级评分制度,助教将根据同学们的程序跑同一数据耗费的时间长度将程序分为若干档,第 n 档的同学得到的分数为 10 / n。:当程序的正确性评分等于 20 分时才可以参与性能评分环节,所以请各位同学务必保证自己程序的正确性。

附加题评分规则

  • 正确性评分 — 1 分。正确性测试中输入的几何对象个数满足 1 <= N <= 1000,要求程序在 60 秒内给出结果,超时则认定运行结果无效。
  • 性能评分 — 1 分。性能测试中输入的几何对象个数满足 1000 <= N <= 500000,交点个数 h 满足 0 <= h <= 5000000,要求程序在 60 秒内给出结果。性能评分将采取档级评分制度,助教将根据同学们的程序跑同一数据耗费的时间长度将程序分为 3 档,第 n 档的同学得到的分数为 0.5 * (3 - n)。:当程序的附加题正确性评分等于 1 分时才可以参与性能评分环节。

:只有当程序在基础需求的正确性评分达到 20 分时才参与附加题评分环节,所以请各位同学务必保证自己程序在基础需求的正确性。

二、得分情况

本次评分点比较多,故评分表格较宽。部分浏览器需调整比例才可完整查看

学号后四位 作业链接 提交时间 博客印象 1.文章开头 2.PSP-估计 3.解题思路描述 4.设计实现过程 5.改进与性能 6.代码说明 7.PSP-实际 源代码管理 评论的回复 博客分数 正确性通过测试点数目 性能得分 正确性得分 总分
1025 软工个人项目作业 2020-03-09 16:42 中上 0.5 0.5 1 3 3 2 0.5 4 1 11.5 39 0 16.25 31.75
5001 BUAA软件工程个人项目作业 2020-03-09 22:55 中上 0.5 0.5 3 3.5 2.5 3 0.5 3 1 14.5 48 3.333333333 20 40.83333333
5016 软工个人项目作业 2020-03-10 13:00 0.5 0 2 2.5 2.5 3 0.5 3 -1 10 0 0 0 13
5044 个人项目作业 2020-03-09 21:37 中上 0.5 0.5 3 2.5 2.5 3 0.5 3 1 13.5 39 0 16.25 32.75
5046 BUAA SE 个人项目作业 2020-03-10 18:24 中上 0.5 0.5 3 2 2.5 3 0.5 2 1 13 0 0 0 15
1088 个人项目作业 求交点个数 2020-03-10 14:55 中上 1 0.5 3 3 2.5 3 0.5 5 1 14.5 48 10 20 49.5
1142 2019软件工程-个人项目作业 2020-03-10 07:26 0.5 0.5 2 3 2 1.5 0.5 5 1 11 37 0 15.41666667 31.41666667
1169 软工个人项目:平面直线交点 2020-03-10 15:44 0.5 0.5 3 3 0.5 0 0.5 3 -1 7 44 0 18.33333333 28.33333333
1051 软件工程个人项目作业 2020-03-10 15:58 0.5 0.5 3 3.5 2.5 3 0.5 5 1 14.5 48 10 20 49.5
1263 NULL NULL 0 0 0 0 0
1122 软工个人项目作业 2020-03-09 19:01 中上 1 0.5 2 2.5 2.5 3 0.5 5 1 13 37 0 15.41666667 33.41666667
1145 【软工】个人项目作业——个人软件流程(PSP) 2020-03-10 18:49 1 0.5 3 3.5 2.5 3 0.5 5 1 15 48 2 20 42
1151 个人项目作用 2020-03-10 18:59 0.5 0.5 1 2 2 2 0.5 5 1 9.5 48 5 20 39.5
1162 【BUAA 软工个人项目作业】玩转平面几何 2020-03-10 18:44 中上 0.5 0.5 3 3.5 0.5 1 0.5 5 1 10.5 48 2 20 37.5
3010 2020BUAA软工个人项目作业 2020-03-10 18:15 中上 0.5 0.5 2 2.5 2 1 0.5 5 1 10 48 10 20 45
3015 BUAA 软件工程个人作业 2020-03-10 17:07 中上 0.5 0.5 2 3 1.5 1.5 0.5 3 1 10.5 48 5 20 38.5
3051 BUAA 2020 软件工程 个人项目作业 2020-03-10 13:29 中上 0.5 0.5 3 3 2 1.5 0.5 5 1 12 39 16.25 33.25
3052 软工-第一次个人项目作业 2020-03-09 20:04 0.5 0.5 3 4 3 1.5 0.5 5 1 14 39 16.25 35.25
3053 个人项目作业(1) 2020-03-10 14:34 中上 0.5 0.5 2 2.5 2 3 0.5 5 -1 10 48 5 20 40
3059 [敏捷软工个人项目博客]几何对象公共点 2020-03-10 18:43 中上 1 0.5 3 3 1.5 2 0.5 5 1 12.5 39 16.25 33.75
3061 个人项目作业 2020-03-10 12:37 中下 0.5 0.5 1 2 1.5 1.5 0.5 4 1 8.5 48 2.5 20 35
3067 【软件工程】个人项目作业 2020-03-10 18:29 0.5 0.5 3 2 1.5 1.5 0.5 5 1 10.5 48 2 20 37.5
3071 【BUAA_2020_软工】个人作业 2020-03-10 15:25 0.5 0.5 3 3.5 3 3 0.5 5 1 15 48 10 20 50
3072 BUAA软工__个人项目作业 2020-03-08 14:40 0.5 0.5 2 2.5 2 2 0.5 5 1 11 48 10 20 46
3078 个人项目作业-求交点个数 2020-03-10 13:29 中上 1 0.5 2 2.5 2.5 3 0.5 5 1 13 48 10 20 48
3086 个人项目作业 2020-03-10 18:45 中下 0.5 0.5 3 2.5 0 1.5 0.5 5 -1 7.5 0 0 12.5
3100 个人项目作业 2020-03-10 18:49 0.5 0.5 2 3 1.5 2 0.5 5 1 11 48 10 20 46
3106 个人项目博客 2020-03-10 08:06 0.5 0.5 2 2.5 2 2 0.5 5 1 11 48 3.333333333 20 39.33333333
3111 交点问题 2020-03-09 22:21 中下 0.5 0.5 2 1 2 1.5 0.5 3 1 9 37 15.41666667 27.41666667
3118 软工个人项目作业 2020-03-10 17:32 中下 0.5 0.5 2 2.5 0 1.5 0.5 4 1 8.5 0 0 12.5
3124 软件工程个人项目作业——平面交点个数 2020-03-10 18:53 中上 0.5 0.5 2 3.5 2.5 2.5 0.5 4 1 13 44 18.33333333 35.33333333
3146 个人项目 2020-03-10 18:31 1 0.5 2 3 0 3 0.5 4 1 11 0 0 15
3165 2020软工个人项目作业 2020-03-10 17:50 中上 1 0.5 2.5 3.5 2.5 2.5 0.5 4 1 14 48 2.5 20 40.5
3167 软工个人项目(图形交点) 2020-03-10 17:36 中上 0.5 0.5 2.5 3.5 2 3 0.5 5 1 13.5 48 3.333333333 20 41.83333333
3170 个人项目作业 2020-03-10 18:32 0.5 0.5 2.5 1.5 1 2 0.5 2 -1 7.5 3 1.25 10.75
3172 个人项目作业 2020-03-10 18:31 0.5 0.5 1.5 2.5 2.5 1.5 0.5 2 1 10.5 0 0 12.5
3174 软工作业——求交点 2020-03-10 16:22 中下 0.5 0.5 1.5 1.5 0.5 1.5 0.5 2 -1 5.5 48 2.5 20 30
3178 BUAA_2020_软件工程_个人项目作业 2020-03-10 16:50 中上 1 0.5 2 3.5 2.5 3 0.5 5 1 14 48 10 20 49
3182 个人项目作业 2020-03-10 18:05 中下 0.5 0.5 2.5 1.5 0 2 0.5 4 -1 6.5 48 5 20 35.5
3187 【软工】个人项目作业 2020-03-09 21:04 1 0.5 3 3.5 3 2.5 0.5 5 1 15 48 3.333333333 20 43.33333333
3190 个人项目作业——交点检测 2020-03-10 18:47 中下 0.5 0.5 2 2 0 1.5 0.5 4 -1 6 0 0 10
3192 17373192 段正旭 2020-03-09 19:37 中上 1 0.5 3 3 2 2.5 0.5 4 1 13.5 37 15.41666667 32.91666667
3194 17373194陈丛文第一次项目作业 2020-03-10 11:05 中上 0.5 0.5 2 3 2.5 2 0.5 4 1 12 39 16.25 32.25
3224 北航软工项目作业(一) 2020-03-10 16:44 0.5 0.5 2 2.5 1 1.5 0.5 2 1 9.5 0 0 11.5
3239 软件工程--个人项目作业 2020-03-10 17:18 0.5 0.5 3 4 1 2 0.5 3 1 12.5 48 2.5 20 38
3250 软工个人项目 2020-03-09 08:20 0 0.5 1.5 2 2 2 0.5 3 -1 7.5 48 10 20 40.5
3253 软工第一次个人作业 2020-03-10 15:54 中上 0.5 0.5 3 2 0 2 0.5 4 1 9.5 0 0 13.5
3259 SE_Work2_交点个数 2020-03-07 11:26 中上 0.5 0.5 3 3 2 2 0.5 3 1 12.5 44 18.33333333 33.83333333
3260 第一次软件工程个人项目作业——algo for intersection 2020-03-10 17:45 中上 0.5 0.5 2 4 3 1.5 0.5 2 -1 11 48 10 20 43
3262 软件工程个人项目作业 2020-03-10 18:09 0.5 0.5 2.5 2.5 2 1.5 0.5 2 -1 9 48 2.5 20 33.5
3263 个人项目作业 2020-03-10 10:02 0.5 0.5 2 2 0 1 0.5 5 1 7.5 48 5 20 37.5
3266 个人项目 2020-03-10 18:09 0.5 0.5 2.5 2.5 1.5 1 0.5 5 1 10 48 5 20 40
3267 软工个人项目博客 2020-03-10 17:06 0.5 0.5 2 2 2.5 2 0.5 2 -1 9 48 3.333333333 20 34.33333333
3275 个人项目博客 2020-03-10 02:10 中上 0.5 0.5 3 3 2 2 0.5 4 1 12.5 39 16.25 32.75
3282 个人项目 2020-03-10 01:17 中上 0.5 0.5 2.5 3 3 2 0.5 4 1 13 48 2.5 20 39.5
3287 软工个人项目作业 2020-03-10 01:44 中上 0.5 0.5 2.5 3 2 2 0.5 4 1 12 48 10 20 46
3292 软工个人项目作业 2020-03-10 11:08 中上 0.5 0.5 3 3 2 2 0.5 5 1 12.5 48 3.333333333 20 40.83333333
3299 软工个人项目 2020-03-10 17:07 0.5 0.5 3 3.5 2.5 2 0.5 5 1 13.5 48 3.333333333 20 41.83333333
3308 个人项目作业 2020-03-17 08:05 中下 0.5 0.5 2 1 1 2 0.5 2 -1 3.25 0 0 0 5.25
3312 个人项目博客作业 2020-03-10 16:41 中上 0.5 0.5 2.5 2.5 2.5 2 0.5 5 1 12 48 3.333333333 20 40.33333333
3318 PSP初体验:求交点 2020-03-09 14:41 中上 0.5 0.5 3 3 2.5 2 0.5 5 1 13 0 0 18
3321 软件工程 - 个人项目(平面交点个数) 2020-03-10 18:56 中上 0.5 0.5 3 3.5 2 1 0.5 5 1 12 48 5 20 42
3323 交点计数 -- 软工个人项目作业 2020-03-10 18:22 中上 0.5 0.5 2.5 2.5 1 2 0.5 5 1 10.5 48 10 20 45.5
3325 [2020 BUAA 软件工程]个人项目作业 2020-03-09 21:52 中上 0.5 0.5 3 3.5 1 2.5 0.5 5 1 12.5 48 2 20 39.5
3331 软工个人项目-求交点数目 2020-03-10 18:58 0.5 0.5 2.5 3.5 0 2.5 0.5 5 -1 9 17 7.083333333 21.08333333
3349 软工个人项目 2020-03-10 00:56 中上 0.5 0.5 3 3 2 2 0.5 5 1 12.5 48 10 20 47.5
3362 交点——软工第一次个人项目作业 2020-03-10 12:07 中上 0.5 0.5 3 3 2 2 0.5 4 1 12.5 48 10 20 46.5
3373 第一次个人项目 2020-03-10 14:02 中上 0.5 0.5 2.5 3 1.5 2 0.5 4 1 11.5 37 15.41666667 30.91666667
3375 个人项目作业 2020-03-10 11:54 0.5 0.5 2 3 1 1.5 0.5 3 -1 8 0 0 11
3380 软工个人作业 2020-03-10 11:30 中上 0.5 0.5 2 3 1.5 2 0.5 4 -1 9 0 0 13
3407 个人项目作业 2020-03-10 17:30 中上 0.5 0.5 2 3 2 2 0.5 5 1 11.5 48 2.5 20 39
3417 软件工程个人项目 2020-03-10 18:45 中上 0.5 0.5 3 2.5 3 2 0 5 1 12.5 42 17.5 35
3432 个人项目作业 2020-03-10 16:50 中上 0.5 0.5 3 3 3 2 0.5 5 1 13.5 48 10 20 48.5
3434 北航软工个人项目作业 2020-03-10 10:28 0.5 0.5 3 2 2 1.5 0.5 5 -1 9 42 17.5 31.5
3439 2020软工个人项目作业-平面几何图形交点统计 2020-03-10 01:32 0.5 0.5 3 3.5 3 2 0.5 5 1 14 48 5 20 44
3448 软工个人项目作业 2020-03-09 21:21 中上 0.5 0.5 3 2 2 2 0.5 4 1 11.5 48 5 20 40.5
3452 BUAA2020软工作业(三)——个人项目 2020-03-10 18:46 中上 0.5 0.5 2 2 1.5 2 0.5 5 1 10 0 0 15
3456 2020软工个人项目作业 2020-03-10 09:15 中上 0.5 0.5 3 2.5 1 2 0.5 5 1 11 48 5 20 41
3459 软件工程基础 第3次个人作业 2020-03-10 18:24 0.5 0.5 3 3.5 2 2 0.5 5 1 13 48 3.333333333 20 41.33333333
3461 软工个人项目作业 2020-03-10 18:29 中上 0.5 0.5 2.5 2 1 2 0.5 3 1 10 37 15.41666667 28.41666667
3492 上手软件工程,PSP初体验!——记2020BUAA软工个人项目作业 2020-03-10 18:59 中上 0.5 0.5 3 3 2.5 2 0.5 4 1 13 48 3.333333333 20 40.33333333
3493 软工第三次作业——个人项目作业 2020-03-10 17:29 中上 0.5 0.5 2 3 2 2 0.5 5 1 11.5 39 16.25 32.75
3524 2020软工个人项目作业 2020-03-09 19:05 中上 0.5 0.5 2.5 2.5 3 2 0.5 5 1 12.5 48 5 20 42.5
3532 2020软工-个人项目作业 2020-03-10 17:26 中上 0.5 0.5 2.5 2 2 2 0.5 5 1 11 48 3.333333333 20 39.33333333
1102 软件工程个人项目作业 2020-03-10 18:26 中上 0.5 0.5 2 2.5 1 1.5 0.5 4 -1 7.5 0 0 11.5

三、累计得分图

累计得分图

四、小黄衫

在本次作业中,课程组决定给总分数最高的三位同学颁发领跑小黄衫,以资鼓励:

五、算法

朴素算法

对于所有几何对象两两配对求出交点后排序去重。时间复杂度 $O(n^2 + n^2 \log n^2)$。

扫描线算法

扫描线算法的关键思想为假设有一条被称为扫描线的竖直线从 x 轴负无穷远处向正无穷远处移动,同时用数据结构维护几何对象在竖直线上交点的位置相对关系。

关于交点的探测,由于扫描线会从左到右扫描过所有状态,因此只需要关注“局部”的未来是否有交点即可(这些交点也是会改变扫描线上交点相对位置的关键点),即只需要探测相邻对象是否有交点即可。

由于只有在事件点上(几何对象同扫描线从有交点状态到无交点状态,几何对象之间的相交等等)几何对象在竖直线上交点的相对顺序才会发生变化,因此扫描线的状态改变量级为 $O(n + m)$,其中 $n$ 为几何对象个数,$m$ 为交点数目。如果采用单次操作 $O(\log)$ 级别的数据结构维护竖直线上的交点位置,则总复杂度为 $O((n + m) \log n)$。

一些实现上的注意事项:

  • 对于 $x$ 相同的事件点,假设扫描线有一个无限小的倾角考虑这些事件点造成的影响;
  • 对于 $x$ 坐标相同的关键点需要一同处理,否则复杂度不对。考虑所有直线相交于一点,如果每次只调整两条线在扫描线上的位置,则复杂度退化为 $O(n^2 \log n)$;
  • 将圆切割成两个半圆。

这里给出算法层面上的一些参考资料:

精度

浮点数精度

首先可以运用语言提供的 double 类型替换默认的 float 提高精度。

其次由于浮点数的计算是有误差的,因此即使答案是同一个数,根据计算途径的不同,其最终结果的机器表示也有可能不同,导致在用语言的比较操作符对比结果时产生不一致的结果。

为了容忍这部分误差,需要设定一个可允许的误差量 $\epsilon$,在该误差的基础上重写浮点数的比较操作。

关于浮点数如何进行比较也需要格外注意,因为浮点数的表示方式,因此在计算时只能保持相对精度。对于绝对精度,除非问题本身有相应的数值界,否则很难保证。因为前述的原因,所以在比较大数之间的误差和小数之间的误差的时候,所能容忍的范围是不同的,此处给出相关资料供同学们参考:https://stackoverflow.com/questions/4915462/how-should-i-do-floating-point-comparison/32334103#32334103。

算法所需精度

十分出人意料的是,扫描线算法需要的数值精度十分高。一个朴素的扫描线算法实现需要的精度为输入坐标表示的 5 倍(https://en.wikipedia.org/wiki/Bentley–Ottmann_algorithm#Numerical_precision_issues)。

考虑到本次项目在实现扫描线算法时已达到了所需要的区分度,没有必要在精度的问题上为难大家,因此除了一些验证相交正确性的类似单元测试的小数据为手工构造外,其余所有数据均以随机的方式生成。然而即使如此,各位同学在实现的同时也需要尽力去提升精度,尤其是关于圆的附加题。

六、源代码管理

README

一个项目的 README 是使人了解项目的第一步,也是整个项目资料的一个索引。通常一个好的 README 会描述以下事项:

  • 项目名称,
  • 项目动机,
  • 项目特点,
  • 如何安装,
  • 如何从源代码构建,
  • 如何使用,
  • ...

一些项目可能会适当增减上述所列的条目,不过核心是让人对项目有一个全局的大致了解,同时可以很快作为用户/开发者上手。

在本次项目中,有一些同学的 README 写的相对较好,这里给出对应的项目链接供同学们参考:

除此以外,这里有一些很好的阅读材料供同学们参考:

项目结构

项目结构(即何种代码置于哪个文件夹下)具体如何组织在实践中通常是一个观点导向的问题,主要的影响因素包括语言、行业习惯和个人观点等。然而拥有一个清晰的项目则无一是一个共识。这里给出一些 C/C++ 的项目结构阅读材料,仅供参考:

commit 信息

commit 信息是对改动的一个总结,拥有结构良好的 commit 信息对于开发者熟悉项目历史以及提供改动的上下文信息非常有帮助。

git commitmanpage 中推荐将 commit 信息分为两部分:标题行和内容。其中标题行简述本次 commit 的作用,内容则对本次 commit 进行较为详细的描述。由于标题行通常用作一些 git GUI 的显示,因此在长度上有推荐的上限。

这里给出一些有关 commit 信息的阅读材料:

在本次项目中,有一些同学的 commit 信息写的相对较好,这里给出对应的项目链接供同学们参考:

Git 仓库应维护的内容与 .gitignore

Git 仓库应该维护的内容

通常来说,一个代码的 Git 仓库应该维护所有和项目相关的“源”文件,其中包括:

  • README,
  • 源代码,
  • 测试源代码,
  • 第三方依赖的源代码/二进制(比如特定版本的 DLL 库),
  • 编译链相关配置文件(比如 CMakeLists.txt),
  • .gitignore 文件,
  • Linter 相关配置文件,
  • ...

不应该维护所有中间生成文件以及一些和开发环境强相关的内容,包括:

  • 一些只对本机起作用的绝对路径,
  • 编辑器维护的备份文件(比如 Vim 的以 ~ 结尾的文件),
  • 中间的编译结果,
  • ...

.gitignore

.gitignore 文件是一个纯文本文件,其作用是指定 Git 忽略其内描述的特定文件。

通过适当的维护 .gitignore 文件,可以避免将上节中提到的不应维护的内容以外添加进 Git 仓库,同时也可以是使 git status 的信息更加精简。

通常,对于项目相关的一些可能产生但不需要维护的文件,比如中间的编译结果,需要添加至 .gitignore。同时,.gitignore 也应该成为 Git 仓库维护的部分。

对于另外一些和项目不直接相关,同时不应该被仓库维护的文件,是否需要添加至 .gitignore 中视开发所在环境存在商榷的余地。https://stackoverflow.com/a/5765663/710050 分享了一些这方面的看法。

以下是关于 .gitignore 的相关一些阅读资料:

作者: braveTester(作业总结部分)、馥世吾爱(得分部分)

posted @ 2020-04-29 23:28  馥世吾爱  阅读(501)  评论(0编辑  收藏  举报