2022秋软工实践 第二次结对编程作业

这个作业属于哪个课程fzusdn社区
这个作业要求在哪里2022秋软工实践 第二次结对编程作业
这个作业的目标设计一个算法,在最小化向后端发送的请求次数的同时,最大化抓出缺勤同学的数量
学号032002530
结对成员学号032002342
结对成员博客美女队友链接

背景

栋哥对大家第一次结对编程作业的原型设计感到很满意,为了尽快让同学们使用上软件,于是栋哥花一晚上时间开发了一个点名小程序。但是在上线运行过后,发现了一些问题:

  1. 大多数老师习惯在每次上课后或下课前的一小段时间内进行点名。
  2. 如果采用全点的方式,在这段时间里,后端服务器需要处理大量的请求,拥塞导致响应速度变慢,给点名小程序带来极差的使用体验。
  3. 采用随机抽点的方式,能够有效减少并发量,但是无法保证点名的质量,难以有效抓出没有到教室的同学。

所以栋哥急需大家设计一个算法来解决这个问题,要求能够最小化向后端发送的请求次数,最大化抓出缺勤同学的数量。

具体要求

定义5门课程,每个课程班级人数为90人,一学期共20次课。每门课程均有5-8位同学缺席了该学期80%的课,此外每次课程均还有0-3位同学由于各种原因缺席。

参数定义:

  • 请求次数:定义在一次点名中,获取一位同学是否到达课堂的情况为一次请求
  • 有效点名:一位同学缺席该课程的一次课,算法在这次课上抽点到该同学,视为一次有效点名,一次课可包含多次有效点名。

评价标准

E = 五门课程有效点名次数 总请求次数 \frac {五门课程有效点名次数}{总请求次数} 总请求次数五门课程有效点名次数

重点、难点分析

数据集的生成

该算法的输入是五门课程每门课程20次课的全部出勤情况,所以首先我们需要根据要求去生成符合实际的五门课程每门课程20次课的全部出勤情况。
同时,我们还需要考虑合理的辅助信息,如绩点、是否担任职务、历史逃课信息等,如何根据辅助信息合理地去生成符合要求的出勤文件,是算法设计初期的重点难点


点名算法的实现

点名算法的指标就是E值。点名的方案,直接影响了向后端发送的请求次数,这也将影响到用户的体验。
如果采用全点的方案,这样的用户体验是最差的,E值也是最小的
如果采用抽点的方案,这样虽然能够有效减小并发量,但仍够无法保证点名的质量,也就是E值具有较大的不确定性。
点名算法实现的重点难点就在于如何寻找请求次数和有效点名次数之间的动态平衡


一千个不用机器学习算法的理由

在机器学习领域,一个基本的定理就是 没有免费的午餐。换言之,就是没有算法能完美地解决所有问题,尤其是对监督学习而言(例如预测建模)。
机器学习算法训练出来的模型会受到很多因素的影响,比如数据集的规模结构

而在这次结对作业当中,我们也曾就是否使用机器学习算法进行过深入的讨论,进而得出了我们的结论:

在我们的问题背景当中,每一名学生的拓展特征(如缺课的概率性等)只表现在当次的数据集当中五门课程20次课的出勤情况,而为了更加贴合实际,每次数据集当中学生的拓展特征是在不断地改变的,虽然学生的基本特征(如绩点,是否担任职务等)没有发生改变,但每一名同学每门课程的出勤情况仍然具有很大的随机性,绩点非常低或者没有担任职务的同学虽然缺课概率会大于绩点高的或者担任职务的同学,仍然也可能每门课程每次课都到位。

同时,我们还考虑到,机器学习的算法需要经过大量的数据集的训练后才能够得到较为理想的模型,理想情况下模型的拟合度度会随着训练的数据量的增加而上升。而考虑到实际的生活当中并没有那么多的数据可以提供给我们训练,这可能会导致我们训练出来的模型是不够理想的。

我们考虑的是,我们每次根据学生基本特征生成的五门课程出勤情况数据集仍然具有很大的不可预见性
我们需要通过在每门课程的前几次点名当中获得学生缺勤名单,通过比对学生的基本特征后,进而得到学生的拓展特征

这也就是我们没有使用机器学习算法的原因。在我们设定的问题背景当中,是适合通过给机器学习算法喂大量的数据集来实现对缺勤名单的预测,我们需要以确定的算法在一门课程前几次点名当中就获得名单中学生的拓展特征。


编程思考

1. 算法的设计思路

设定五门课程分别为A、B、C、D、E,每周轮一次课,上课顺序固定为 A → \rightarrow B → \rightarrow C → \rightarrow D → \rightarrow E,单学期总共20周

算法模拟点名过程,在第一周点名当中,绩点低于2且没有担任职务的学生全点,前几周点名过程当中,通过联合五门课程分析学生的拓展特征(缺勤的概率)确定每门课程5-8人整体缺课80%的学生,在后续的点名过程当中,只点每门课程5-8人整体缺课80%的学生

正常来说,最多不超过6周就能够确定每门课程当中5-8人整体缺课80%的学生名单

但值得注意的是,因为联合分析了五门课程每周的学生出勤情况,在一学期内我们认为在一门课程缺课的学生在其他门课程缺课的概率要更大,所以往往在比6周更少的时间内就能够确定每门课程当中5-8人整体缺课80%的学生名单


2.生成数据集

  • 五门课的每门课对应一个数据集,每个数据集包含了:学生id(用来唯一识别一名学生)20次课的到勤情况(到为0,没到为1)

  • 其中每门课程均有5-8位同学缺席了该学期80%的课,此外每次课程均还有0-3位同学由于各种原因缺席。

  • 在此基础上,我们认为,绩点低于2、在班级当中没有担任职务且为非党员的同学的逃课概率要比其他同学高

  • 生成的步骤为:

  1. 生成基本数据集(包括学生的基本信息)

    1. 设定辅助信息,包括绩点、是否担任职务
    2. 设定学生基本信息结构。我们定义总共有6个班每个班50个人,该年段总共300名学生。6个班当中,绩点符合生态分布,值域为[1, 4],同时在绩点2以上的学生当中随机设置15个担任职务的学生
    3. 生成基本数据集,由学生id,绩点,担任职务(若不担任职务,则值为0)
  2. 生成测试数据集(包括五门课程每门课程20次课的出勤情况)

    1. 对于每门课,在绩点小于2的学生当中随机生成5-8名缺课80%的学生,标记其为缺勤。(单次课到位值为1,缺勤则置为0)
    2. 每次课在其他学生当中随机0-3名学生标记其为缺勤。

生成的数据集如下:
在这里插入图片描述

在这里插入图片描述


3. 输出

在这里插入图片描述
在这里插入图片描述

  • 算法执行结束后,在data文件夹当中生成了本次实验相对应的五门课每门课的点名名单

4. 测试执行算法得到的E值的稳定性

在这里插入图片描述

  • E的均值=0.839796878,方差=0.0000545242
  • 可以看到,E的值具有较强的稳定性,同时E的值维持在相对较高的水平

5. 代码编写规范


PSP 和 学习进度条

PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划90100
· Estimate· 估计这个任务需要多少时间2020
Development开发12851290
· Analysis· 需求分析 (包括学习新技术)9090
· Design Spec· 生成设计文档6060
· Design Review· 设计复审 (和同事审核设计文档)1530
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)3030
· Design· 具体设计9060
· Coding· 具体编码600800
· Code Review· 代码复审120150
· Test· 测试(自我测试,修改代码,提交修改)6090
Reporting报告90120
· Size Measurement· 计算工作量2020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划4040
合计13951410

学习进度条

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
11501501010第一次接触码量大的项目,除规划项目本身设计之外,还学会规划代码规范
240055013.523.5编写核心分析代码,并进行数据测试、代码优化

白天到黑夜

在这里插入图片描述
在这里插入图片描述


程序模块运行的视频演示

程序模块演示视频


GitHub 仓库地址和 commit 记录

GitHub 仓库地址:2022 Second Pairing Assignment in Software Engineering

commit 记录:
在这里插入图片描述

在这里插入图片描述


两个人的所思所想

帅哥美女有话说

其实我们不难发现,编程耗时最多的方面就是debug。在我们得出设计思路,并将它们初次转化成代码后,编程之路其实才走了一小段。由于个人的疏忽,输入的错误,以及设计思路的偏差,往往会让我们的程序陷入无止尽的BUG泥潭中,难以挣脱,这将会消耗我们大量的时间。
而结对编程的好处就在于此。在编程的过程当中,由于有个领航员角色的存在,在编写代码时,一旦出现输入错误,就会有人及时的提醒。并且,在设计代码时,有个同伴可以一起讨论,融合两个人不同的见解和观点,我们往往可以得出更加准确且更加高效的设计思路。这一切都为我们在完成代码后的debug过程省去了大量的时间。
就我们本次实验的编程而言,有了领航员的存在,我们在完成代码后,花在debug上的时间大大缩减,甚至很多阶段性的代码都是一次通过,这大大提高了我们编程的效率,而且我们两个人一起讨论出来的编程思路,也使得我们的代码功能更全面,效率更高。
我们一致认为,结对编程的优势主要就在于设计思路的共享,和我们互相为对方避免错误。总的来说,自己在编程时犯下的错误,有些尽管很简单,但却难以发现,而这些在另一个人眼中,却会十分明显。
因为结对编程可以很大程度上提高编程效率,而且两人轮流编程,不会太过疲惫,因此十分适合敏捷开发。如果未来我们从事软件开发的工作,我们会十分乐于进行结对编程,因为这会极大的改善我们的编程体验,是编程不再那么枯燥,debug之路也不会那么恐怖。

互相眼中的闪光点

  • 帅哥眼中美女的闪光点:

    • 思维敏捷
    • 代码高手
    • 坚持不懈
    • 不怕困难
    • 美丽动人
  • 美女眼中帅哥的闪光点:

    • 还是帅
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jinfeng Pan

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值