成员:
031502328 骆景钊
031502337 肖小强
Github链接
问题描述:
实现一个智能自动分配算法,根据输入信息,输出部门和学生间的匹配信息(一个学生可以确认多个他所申请的部门,一个部门可以分配少于等于其要求的学生数的学生) 及 未被分配到学生的部门 和 未被部门选中的学生。
提供输入包括:
- 20个部门
- 部门编号(唯一确定值),字符;
- 各部门需要学生数的要求的上限,单个,数值,在[10,15]内;
- 各部门的特点标签,多个(两个以上),字符;
- 各部门的常规活动时间段,多个(两个以上),字符。
- 300个学生
- 学生编号(唯一确定值),字符;
- 学生空闲时间段,多个(两个以上),字符;
- 兴趣标签,多个(两个以上),字符(学生的兴趣标签一定是所有部门特点标签其中的一个)
- 每个学生有不多于5个的部门意愿
数据生成
程序生成方法:
- 程序采用java语言实现,加入json依赖库来实现json的格式的读取和输出。
- 将问题分为三个类,分别是student,department,entry类,其中主要是entry类来实现
- 输入输出采用了相对路径的方法
匹配算法思想
- 学生角度:
学生的部门意愿被作为主要大头,标签可以作为学生的技能特长,空闲时间可与部门时间相互比较。其中算法采用的是学生选择部门的顺序也作为匹配的一个考虑因素。
- 部门角度:
部门考虑的因素主要是学生对部门选择的顺序是否靠前,学生的空闲时间的匹配,以及学生的标签(特长)是否符合部门的方向。
- 评分标准 = 志愿占50% + 时间占40% + 标签占10%
一开始我们只是想将学生先循环去找部门,后来考虑到那要是先循环的学生可以先选择部门,这对后循环的学生不公平。
之后经过讨论,我们讨论出了一个评价标准。将学生的各个志愿部门取出来,与对应的部门去求一个分数值。分值为100,志愿占50% + 时间占40% + 标签占10%,志愿按顺序百分比逐渐减少。算出的分值再去循环部门,部门按从高到底的规则去挑选学生。
但是这样也会存在一定的问题:1.首先这个算法有点类似于高考志愿填报,在前面的志愿权重比较大,但这样也存在一定的弊端;2.某个学生要是被录取后,空闲时间必然减少。这个在后面的部门的选择上也会有影响,但是在我们认识的这个问题的时候,时间来不及去改了。
代码规范:
代码规范之前没说好,后来为了降低对接难度,双方在商量后,规定了一下类的变量名后,就各自只提供了api,来完成这个工程。
结果评估:
结对感受:
本次作业因为在假期的缘故,虽然之前有过讨论,但是假期中都去玩了,在结对作业上没有放太多的心思。这次实验我负责json的解析和输出,小强负责的是累的编写。虽然这个工程不算很大,但是在json依赖包的使用也花费了我很多时间。这次实践也让我体会到了两个人的结对编程是完全不同于一个人的编程的,两个人编程更加依赖于双方的交流。希望下次合作可以更加上手。