生成抽点名单

要求

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

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

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

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

评价标准:

输入
五门课程的全部人员到勤信息

输出
E、五门课程的抽点方案

要求
最大化E,该标准将作为确定本次作业作业得分的主要依据之一
输入的数据,另外编写生成程序随机实现。
为输入输出设计标准化、通用化、可扩展的接口,能为该智能匹配程序模块后期可能的整合入系统提供便利。
输入输出的格式,如采用文本文件或数据库的方式输入,可自由讨论确定。
可为智能抽点算法额外的添加一些合理的辅助搜索信息,如绩点等,可自由讨论确定。
代码具有规范性。
实现的程序语言不做限制性要求。

一、输入输出处理问题

我们计划使用excel表格作为输入形式,需要自学如何实现文件读写。

二、算法设计

在考虑如何最大化E值上并尽量覆盖全体学生,我们经讨论后,思路为:
a.依据学生个人E值和个人总请求次数作为划分标准,将学生分为两类;
b.按不同比例从两类学生中抽点学生。

三、使用过程

(一)环境搭建

请自行搭建java环境

(二)数据生成

将项目克隆到本地,找到CreateData.jar 文件(一般情况下在此路径:second_teamwork–>RandInfo–> CreateDate.jar)。

双击运行或在此目录下打开命令窗口输入 java -jar CreateData.jar 。运行之后在D盘生成了5个班级信息表,如果运行后没有效果或者报错,请将此目录下的5个班级信息表(class1.xls ~ class5.xls)复制到D盘中。

(三)抽点方案

运行CreateData.jar文件后,在项目中找到CreateList.jar文件(一般情况下在此路径:second_teamwork–>CreateList–> CreateList.jar)。

在此目录下打开命令窗口输入 java -jar CreateList.jar,即可输出名单。

三、Github仓库地址及commit记录。

地址