第二次结对编程作业-毕设导师智能匹配
031402203 陈齐民
031402505 陈少铭
第二次结对编程的体会
需求阐述
看了第二次结对编程作业的题目的要求后,我们总结提炼了以下几个要点:
- 共有30名导师,100名学生
- 导师可以选择所带的学生上限为[0,8]
- 学生应该包含的信息包括绩点以及志愿情况,共有五个志愿,且志愿可以重复但不可以空缺
- 每个学生必须分配到一个导师,而导师所带的学生应当小于等于上限
- 我们需要实现一个智能分配算法,实现最后未被分配到的学生数最少
- 为输入输出设计标准化、通用化、可扩展的接口,为该智能匹配程序模块后期可能的整合入系统提供便利
- 输入输出的格式,如采用文本文件或数据库的方式输入
矛盾分析
看完题目的需求后,我们总结出了几个矛盾的产生点,以及攻克点:
- 共有30名导师,100名学生,正常情况下是可以分配足够的
- 产生有的学生没有被分配到导师的主要情况有以下几点:
- 1.导师所选择的上限数之和小于学生总数,但这种可能性较小,几乎可以排除
- 2.志愿太过集中,导致部分导师被集中选择,而选择其他导师的志愿数偏少,导致分配不平衡
- 3.存在学生的志愿重复现象,经过我们的分析,这种现象最容易导致学生未被分配到导师
矛盾解决
罗列出以上矛盾后,我们也对解决矛盾的方法进行了分析:
- 经过分析,我们发现矛盾并不在于绩点优先排序或者其他条件的排序
- 矛盾点主要在于填报志愿的问题
- 如果没能从志愿方面解决,仅仅利用绩点优先、或者其他条件优先、依旧会出现学生没有分配到导师的情况
- 经过分析,我们认为填报了重复志愿的学生,是最有可能没有分配到导师的群体
- 所以我们认为,可能需要优先解决具有重复志愿的同学的情况
- 但是优先解决这种情况的话,有可能损害到没有重复志愿但是绩点等其他条件更优先的同学的利益
实现方案
经过以上分析后,我们提出了我们的解决方案,并且使用PHP进行算法的实现
算法思路:
- 利用类似于GaleShapley算法的方案实现
- 按轮次来处理分配问题
- 1.按照志愿顺序分配,第一轮为第一志愿,按照绩点排序分配导师,最终会出现分配到导师的学生以及未被分配到导师的学生,以及分配满学生的导师和未分配满学生的导师
- 2.未被分配到导师的学生和未分配满学生的导师进入第二轮分配,以此类推
- 3.将不采用志愿重复数优先,因为这样一来就损害了其他同学的利益**
- 这样一来就可以尽量使未被分配到导师的学生数越小
PHP(是世界上最好的语言):
- 使用ThinkPHP3.2框架
- 采用标准化、通用化、可扩展的接口,接口可以提供给Web、Andriod、IOS等使用,且在设计接口时考虑到后续的接口修改,提供可以满足各种查询的接口
- 返回的JSON数据格式采用标准格式
- 在ShowDoc上添加项目,写了详细的接口使用说明,包括API和返回JSON数据说明,下面有链接
JSON数据格式
/**
* 返回 json 数据
* @param int $code 状态码
* @param string $msg 反馈信息
* @param array $data 数据
* @return json
*/
public function jsonReturn($code,$msg,$data = null) {
$arr = array(
'code' => $code,
'data' => $data,
'msg' => $msg
);
return $arr;
}
- 详细的代码已提交到coding.net中,项目链接中可查看
结果分析
本来打算用OneAPM对PHP进行代码效能分析,但是安装了好久都没有成功,所以就用手动测试数据来测试结果并分析:
导师数量 | 学生数量 | 未分配到导师的学生数 | 匹配率 | |
---|---|---|---|---|
1 | 30 | 100 | 2 | 98% |
2 | 30 | 100 | 4 | 96% |
3 | 30 | 100 | 7 | 93% |
4 | 30 | 100 | 0 | 100% |
5 | 30 | 100 | 6 | 94% |
6 | 30 | 100 | 3 | 97% |
7 | 30 | 100 | 4 | 96% |
8 | 30 | 100 | 2 | 98% |
9 | 30 | 100 | 5 | 95% |
10 | 30 | 100 | 1 | 99% |
11 | 30 | 100 | 3 | 97% |
12 | 30 | 100 | 2 | 98% |
13 | 30 | 100 | 0 | 100% |
14 | 30 | 100 | 0 | 100% |
15 | 30 | 100 | 4 | 96% |
16 | 30 | 100 | 6 | 94% |
17 | 30 | 100 | 1 | 99% |
18 | 30 | 100 | 0 | 100% |
19 | 30 | 100 | 2 | 98% |
20 | 30 | 100 | 5 | 95% |
学生的绩点和五个志愿的导师编号,导师的所需最大学生人数都是随机生成的,并且经过20次的结果测试分析,这20次导师匹配的匹配率平均为97.15%,而对于未被分配到的学生,我们也提供查看导师的学生数情况的接口,系主任可以根据导师的学生数进行微调,人工工作量大大减少;测试的导师信息和学生信息是随机生成的,而我们的接口也提供通过表单提交,或者文档经过后台处理直接存入数据库,其实通过学生自己填写绩点、志愿信息等收集信息更快,更加省去人工数据收集操作。
结对感受
经过这次结对编程的初体验,我们有了一些不一样的感受
- 结对一起开发的过程中,两个人坐在一起,感觉对方如果在工作的话,自己就会不好意思休息
- 其次,两人一同开发的过程中,有什么疑问点就会及时的沟通与反馈
- 再次,结对开发过程中,容易产生思维的碰撞,容易发现新东西
闪光点和建议
陈少铭:
- 在结对编程的过程中,齐民一直都很积极,做事神速,看到他这么积极的做事,我也不敢怠慢
- 强行被治好了自己多年来的拖延症
- 唯一的一些建议其实是对我们两个人的,第一次需求分析的时候,要开发app的想法是由于我们从自己的技能出发考虑的
- 这个问题,我觉得还是出在我们两人身上,我们没有更多地从用户的角度考虑问题
陈齐民:
- 我觉得少铭很有想法,算法思路很清晰,我在使用PHP实现的时候就相对比较轻松
- 写的标准化、通用化的接口,而且可以随意根据需求修改,感觉灵活度会好点,使用也很方便
- 我觉得既然做了就要做好,所以接口写好后,我也写了详细的接口说明
- 感觉结对编程对两个人的配合沟通要求比较高,但是也能更多的学习到,因为两个人交流很方便,也很有效率,我个人不喜欢把事情拖到最后,所以一直在构思,从少铭那里也学习了很多,感觉收获很大