[2017BUAA软工助教]个人项目小结
2017BUAA个人项目小结
一、作业链接
http://www.cnblogs.com/jiel/p/7545780.html
二、评分细则
0.注意事项
- 按时间完成并提交——正常评分
- 晚交一周以内——0分
- 晚交一周以上或不交——倒扣本次作业分数
- 抄袭——倒扣本次作业分数
1.博客细则
博客共15分,分布如下:
- 在文章开头给出Github项目地址。(1')
- 在开始实现程序之前,在下述PSP表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5')
- 解题思路描述。即刚开始拿到题目后,如何思考,如何找资料的过程。(3')
- 设计实现过程。设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?单元测试是怎么设计的?(4')
- 记录在改进程序性能上所花费的时间,描述你改进的思路,并展示一张性能分析图(由VS 2017的性能分析工具自动生成),并展示你程序中消耗最大的函数。(3')
- 代码说明。展示出项目关键代码,并解释思路与注释说明。(3')
- 在你实现完程序之后,在下述PSP表格记录下你在程序的各个模块上实际花费的时间。(0.5')
2.程序细则
程序共35分,分布如下:
-
源代码管理评分,该评分主要通过源代码管理中的commit注释信息,增量修改的内容,是否有运行说明等给分。(2')
-
正确性评分,正确性测试中输入范围限制在 1-1000,要求程序在 60 s 内给出结果,超时则认定运行结果无效。(20')
-
错误处理,对-c参数进行一系列错误参数进行测试,根据程序是否能正常运行给分。(3')
-
性能评分,性能测试中输入范围限制在 10000-1000000,没有时间的最小要求限制。(10')
- 当程序的正确性评分等于20分时才可以参与性能评分环节,所以请各位同学务必保证自己程序的正确性。
- 性能评分将采取档级评分制度,助教将根据同学们的程序跑同一数据耗费的时间长度将程序分为若干档,每一档的同学得到的分数为 10/档级数。
-
附加题。(5')
三、博客分数列表
注:点击表头元素可进行排序
INDEX | 作业地址 | Github | PSP前 | 思路 | 设计 | 优化 | 关键代码 | PSP后 | 总分 |
---|---|---|---|---|---|---|---|---|---|
1 | 15061183 | 1 | 0.5 | 3 | 4 | 3 | 3 | 0.5 | 15 |
2 | 15061144 | 1 | 0.5 | 3 | 4 | 2.5 | 2.5 | 0.5 | 14 |
3 | 15061104 | 1 | 0.5 | 3 | 3 | 1 | 2.5 | 0.5 | 11.5 |
4 | 15061132 | 1 | 0.5 | 3 | 2.5 | 3 | 2.5 | 0.5 | 13 |
5 | 15231196 | 1 | 0.5 | 2 | 3 | 3 | 3 | 0.5 | 13 |
6 | 15061111 | 1 | 0.5 | 2.5 | 3 | 2 | 2.5 | 0.5 | 12 |
7 | 15231058 | 1 | 0.5 | 3 | 3 | 2 | 2.5 | 0.5 | 12.5 |
8 | 15271106 | 1 | 0.5 | 3 | 3 | 3 | 2.5 | 0.5 | 13.5 |
9 | 15061199 | 1 | 0.5 | 3 | 4 | 3 | 3 | 0.5 | 15 |
10 | 15061188 | 1 | 0.5 | 2.5 | 3 | 3 | 2.5 | 0.5 | 13 |
11 | 15061074 | 1 | 0.5 | 2.5 | 3 | 3 | 2.5 | 0.5 | 13 |
12 | 15061119 | 1 | 0.5 | 2.5 | 3 | 2 | 2.5 | 0.5 | 12 |
13 | 15061080 | 1 | 0.5 | 2.5 | 2.5 | 2 | 3 | 0.5 | 12 |
14 | 15061180 | 1 | 0.5 | 2.5 | 3.5 | 2.5 | 2.5 | 0.5 | 13 |
15 | 15061075 | 1 | 0.5 | 3 | 2.5 | 2.5 | 2 | 0.5 | 12 |
16 | 15061187 | 1 | 0.5 | 2.5 | 3 | 3 | 3 | 0.5 | 13.5 |
17 | 15061101 | 1 | 0.5 | 2 | 2.5 | 1 | 2.5 | 0.5 | 10 |
18 | 15061129 | 1 | 0.5 | 3 | 3.5 | 3 | 3 | 0.5 | 14.5 |
19 | 15061186 | 1 | 0.5 | 2 | 3 | 2.5 | 2.5 | 0.5 | 12 |
20 | 15061189 | 1 | 0.5 | 2.5 | 4 | 2.5 | 3 | 0.5 | 14 |
21 | 15231177 | 1 | 0.5 | 3 | 2.5 | 2.5 | 2.5 | 0.5 | 12.5 |
22 | 15061067 | 1 | 0.5 | 2.5 | 2.5 | 3 | 0 | 0.5 | 10 |
23 | 15061151 | 1 | 0.5 | 2 | 3 | 2.5 | 3 | 0.5 | 12.5 |
24 | 14011100 | 1 | 0.5 | 3 | 3 | 3 | 3 | 0.5 | 14 |
25 | 15061175 | 1 | 0.5 | 2 | 3 | 2 | 3 | 0.5 | 12 |
26 | 14061213 | 1 | 0.5 | 2.5 | 2.5 | 1 | 3 | 0.5 | 11 |
27 | 15061069 | 1 | 0.5 | 2.5 | 3 | 2 | 3 | 0.5 | 12.5 |
28 | 15061085 | 1 | 0.5 | 1 | 0 | 0 | 0 | 0.5 | 3 |
29 | 15061122 | 1 | 0.5 | 3 | 3.5 | 3 | 3 | 0.5 | 14.5 |
30 | 15061077 | 1 | 0.5 | 2.5 | 2.5 | 0 | 2 | 0.5 | 9 |
四、自动测试得分列表
测试结果详见:http://www.cnblogs.com/ChildishChange/p/7609751.html
得分说明:
- 如果进行一次额外的修改,修改系数减0.1
- 每一项测试的前五项为正确性测试,每项2分满分
- 每一项测试的后两项为性能测试,每项2.5分满分
- “-c 50000”测试中,以1s划档
- “-c 1000000”测试中,以10s划档
- “-s 50000puzzle.txt”测试中,以10s划档
- “-是1000000puzzle.txt”测试中,以60s划第一档,300s划第二档
最终得分为:(“-c”正确性得分+“-c”性能得分)ד-c”修改系数+(“-s”正确性得分+“-s”性能得分)ד-s”修改系数
INDEX | 作业地址 | 正确性得分 | 性能分1(1s分档 | 性能分2(10s分档 | -c总分 | “-c”修改系数 | 正确性分 | 性能分1(10s | "性能分2(60s,300s" | -s总分 | “-s”修改系数 | 总分 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 14011100 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
2 | 14061213 | 10 | 1.25 | 0 | 11.25 | 1 | 10 | 1.25 | 0 | 11.25 | 1 | 22.5 |
3 | 15061067 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 28.75 |
4 | 15061069 | 0 | 0 | 0 | 0 | 1 | 10 | 1.25 | 0 | 11.25 | 1 | 11.25 |
5 | 15061074 | 4 | 0 | 0 | 4 | 0.9 | 10 | 1.25 | 1 | 12.25 | 1 | 15.85 |
6 | 15061075 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 27.5 |
7 | 15061077 | 10 | 0 | 0 | 10 | 1 | 10 | 0 | 0 | 10 | 0.8 | 18 |
8 | 15061080 | 10 | 0 | 0 | 10 | 1 | 10 | 1.25 | 1 | 12.25 | 1 | 22.25 |
9 | 15061085 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 |
10 | 15061101 | 4 | 0 | 0 | 4 | 1 | 2 | 0 | 0 | 2 | 1 | 6 |
11 | 15061104 | 10 | 1.25 | 0 | 11.25 | 1 | 10 | 0 | 0 | 10 | 1 | 21.25 |
12 | 15061111 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 1.25 | 1.25 | 12.5 | 1 | 26.25 |
13 | 15061119 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
14 | 15061122 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
15 | 15061129 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 0.9 | 27.375 |
16 | 15061132 | 10 | 2.5 | 0 | 12.5 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 26.25 |
17 | 15061144 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
18 | 15061151 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 1.25 | 0 | 11.25 | 1 | 25 |
19 | 15061175 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
20 | 15061180 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
21 | 15061183 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
22 | 15061186 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
23 | 15061187 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
24 | 15061188 | 10 | 0 | 0 | 10 | 0.9 | 10 | 1.25 | 1 | 12.25 | 1 | 21.25 |
25 | 15061189 | 10 | 2.5 | 2.5 | 15 | 0.9 | 10 | 1.25 | 0 | 11.25 | 0.9 | 23.625 |
26 | 15061199 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
27 | 15231058 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 2.5 | 15 | 1 | 30 |
28 | 15231177 | 10 | 2.5 | 1.25 | 13.75 | 1 | 10 | 1.25 | 0 | 11.25 | 0.9 | 23.875 |
29 | 15231196 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
30 | 15271106 | 10 | 2.5 | 2.5 | 15 | 1 | 10 | 2.5 | 1.25 | 13.75 | 1 | 28.75 |
五、总分
INDEX | 作业地址 | 博客分数 | Github | 自动测试得分 | 错误处理 | 附加题 | 总分(不计附加 | 总分 |
---|---|---|---|---|---|---|---|---|
1 | 14011100 | 14 | 2 | 30 | 3 | 5 | 49 | 54 |
2 | 14061213 | 11 | 2 | 22.5 | 2.5 | 5 | 38 | 43 |
3 | 15061067 | 10 | 2 | 28.75 | 2 | 0 | 42.75 | 42.75 |
4 | 15061069 | 12.5 | 0 | 11.25 | 3 | 0 | 26.75 | 26.75 |
5 | 15061074 | 13 | 2 | 15.85 | 3 | 5 | 33.85 | 38.85 |
6 | 15061075 | 12 | 0 | 27.5 | 3 | 0 | 42.5 | 42.5 |
7 | 15061077 | 9 | 1 | 18 | 2.5 | 0 | 30.5 | 30.5 |
8 | 15061080 | 12 | 0 | 22.25 | 3 | 0 | 37.25 | 37.25 |
9 | 15061085 | 3 | 0 | 0 | 2 | 0 | 5 | 5 |
10 | 15061101 | 10 | 0 | 6 | 3 | 0 | 19 | 19 |
11 | 15061104 | 11.5 | 1 | 21.25 | 0.5 | 0 | 34.25 | 34.25 |
12 | 15061111 | 12 | 2 | 26.25 | 3 | 0 | 43.25 | 43.25 |
13 | 15061119 | 12 | 2 | 28.75 | 3 | 0 | 45.75 | 45.75 |
14 | 15061122 | 14.5 | 2 | 28.75 | 3 | 0 | 48.25 | 48.25 |
15 | 15061129 | 14.5 | 2 | 27.375 | 2.5 | 0 | 46.375 | 46.375 |
16 | 15061132 | 13 | 0 | 26.25 | 3 | 0 | 42.25 | 42.25 |
17 | 15061144 | 14 | 2 | 30 | 3 | 0 | 49 | 49 |
18 | 15061151 | 12.5 | 0 | 25 | 3 | 0 | 40.5 | 40.5 |
19 | 15061175 | 12 | 2 | 30 | 1.5 | 0 | 45.5 | 45.5 |
20 | 15061180 | 13 | 2 | 30 | 3 | 0 | 48 | 48 |
21 | 15061183 | 15 | 2 | 30 | 3 | 5 | 50 | 55 |
22 | 15061186 | 12 | 1 | 28.75 | 3 | 0 | 44.75 | 44.75 |
23 | 15061187 | 13.5 | 1 | 28.75 | 3 | 5 | 46.25 | 51.25 |
24 | 15061188 | 13 | 2 | 21.25 | 3 | 0 | 39.25 | 39.25 |
25 | 15061189 | 14 | 1 | 23.625 | 2 | 0 | 40.625 | 40.625 |
26 | 15061199 | 15 | 2 | 28.75 | 0 | 5 | 45.75 | 50.75 |
27 | 15231058 | 12.5 | 0 | 30 | 3 | 0 | 45.5 | 45.5 |
28 | 15231177 | 12.5 | 2 | 23.875 | 2.5 | 0 | 40.875 | 40.875 |
29 | 15231196 | 13 | 2 | 28.75 | 2.5 | 0 | 46.25 | 46.25 |
30 | 15271106 | 13.5 | 2 | 28.75 | 3 | 0 | 47.25 | 47.25 |
六、一些问题
1.晚交、错交
本次作业有两位同学在截止日期后才交上作业,原因分别是:
- xxx同学:完成了程序与博客,忘记在班级博客中提交。
- xx同学:完成了程序与博客,却提交至个人作业week1中。
希望大家以后能注意:D
2.正确性测试
大家出乎意料的,程序效率都很高,但是第一轮测试之后也暴露了不少问题:
2.1审题出现了问题:
- 左上角固定数字出错
2.2程序鲁棒性问题:
- 若题目文件最后一个题目的最后一个数字后有两个回车,则会多输出一个自己生成的数独;若只有一个回车,则正常
- 若题目文件最后一个题目的最后一个数字后只有有一个个回车,则不会求解最后一题;若有两个个回车,则正常
- 若题目文件最后一个题目的最后一个数字后有两个回车,则程序崩溃,若只有一个回车,则正常
2.3出题者的问题:
- 作业在要求时没有明确说明生成文件时是追加在原文件后还是覆盖原文件
这主要是我的问题,但希望下次对题目有异议时,请联系助教或老师:D
2.4程序算法的问题:
- 有几个同学在测试大数时生成了重复的数独
正如某位同学在更正了程序之后在博客中说的一样:
这就是多写一个测试程序的事
因此,我建议不论你的算法是否能从原理上避免重复数独,最好进行一下相关测试。这样你也安心,我也省事,不是很好吗:D
然后我猜有人问:“助教,我不知道怎么判重,两个两个比较太麻烦了”
这里根据同学们的博客整理三种判重的方法:
- 使用hashset暴力判重
- 使用字典树进行判重
- 将一个数独打成长度为81的字符串,然后每17位一组变成6个long long,排序之后进行判重
不管你是否还用得到,学习一下别人的思路,也是极好的:D
3.性能测试
这次性能测试使用的题目是我自己生成的,然后从生成的终局中随机挖掉一半的空。
也就是说这个测试样例实际上是对一些朴素的算法,比如回溯法,是相当友好的。
后来某位同学给了我一份含有49121个只有17个已确定的数字的数独,于是我又测了一遍,结果是这样的,大家随意感受一下:
我没有否认大家的算法和优化,毕竟这次测试并没有算分,而且大多数同学都在自动测试的部分得到了较高的分数。这次测试主要体现了大家的程序是否能在极端情况下正常地工作。因此在这里对通过了这个测试的同学提出表扬:D,其他同学也不要气馁,毕竟你们的程序也很好地完成了基础的要求:D
4.错误处理
错误处理测试了这六个参数,每个0.5分:
- "-c"
- "-c -100"
- "(空参数"
- "-c 1000000000000000"
- "-abc"
- "-c asd"
虽然大多数同学都拿到了错误处理的分数,但是有那么些问题:
- 对错误的分类处理出了问题,导致不同的错误得到了相同的反馈
- 反馈结果让人莫名其妙
- 没有反馈
- 直接崩溃
错误处理做得越好,用户体验就越好。希望大家能重视。
这里表扬一下:
15061074
15061186
14061213
这三个同学的错误处理,[捂脸]但是因为他们博客里没有错误处理的部分,所以我这里推荐一下福大郑浩辉同学的博客作为他山之石:
这是他的错误提示:
-【开始校验参数】【校验参数中】请输入生成数量
-【开始校验参数】【校验参数中】生成数量只能是数字
-【未知指令】试试 -help ?
-【请输入指令及相关参数】试试 -help ?
-【开始校验参数】【校验参数中】请勿输入多余参数
同时郑同学的博客排版美观,思路清晰,建议大家去学习一下。链接:http://www.cnblogs.com/andwho/p/7500515.html
5.Github提交规范
这次提交的作业里,有这种画风的:
还有这种画风的:
本次作业要求的是“代码有进展即签入”稍有出入,也就是说,签入记录大体上应该是这样的:
以下摘自:[福大软工] Z班 第2次成绩排行榜
这是陈翔同学的博客:他的项目不仅有完整的运行说明,可读的commit信息注释,恰当的commit频率,还配置了集成测试。这个简直是一份完美的Github项目范例,推荐给各位同学。链接:http://www.cnblogs.com/qq952693358/p/7487056.html
这里推荐大家学习福州大学的陈翔同学整理的Github提交规范心得:D
https://github.com/Wasdns/github-example-repo
七、一些总结
1.算法
同学们使用的算法大概有这几种:
- 随机+回溯
- 行列变换
- 数字重新映射
- DLX
在中小数据上,随机产生与回溯的方法较为简单同学们优化做得太好了导致中小数据上看不出差别[捂脸]。部分同学使用了生成等价数独的方法,这个方法的好处是从根本上避免了重复数独的出现(尽管一些同学出现了重复的问题);同时也有同学考虑到求解和生成终局实际上可以使用同一个算法来解,这是也一个很好的思路。
2.优化
同学们进行的优化大概有这么几种:
- DEBUG -> RELEASE
- 优化IO
- 优化算法
第一个改进是最容易的,在生成时使用RELEASE模式而不是DEBUG模式。
简单说一下这两个模式的区别:
你们编译课大概在下半个学期会学到“编译优化”的部分(包括循环优化,控制优化,活跃变量分析等)。在DEBUG模式下编译器是不会对程序做优化的,但是RELEASE模式下会,但是编译速度会受到影响。
感兴趣的同学可以参看:DEBUG和RELEASE模式的区别
第二个则是大多数同学都会进行的优化,比较简单,而且修改幅度也不大,大致有以下的方法:
- 1.一次输出一个数->一次输出一个终局->把终局存起来一次性输出
- 2.使用string->使用字符数组
- 3.使用 ofstream 与 << ->使用fwrite,fprint
第一种方法减少了IO次数,第二、三种方法使用了底层的数据类型或方法,减少了开销,因此会使性能大大上升
第三个则是算法的优化,这里不再赘述
3.推荐博客
15061183-[2017BUAA软工]个人项目-数独
15061189-个人项目-数独
15061129-[2017BUAA软工]第一次个人项目 数独的生成与求解
15061122-个人作业 数独
posted on 2017-10-07 11:22 ChildishChange 阅读(567) 评论(10) 编辑 收藏 举报