1.结对成员:
黄浩 031502310
刘晓 081500124
2.项目链接:项目地址
3.生成最“好”的数据链接:input_data.txt
数据生成原理:
学生信息:
- 学号增量生成
- 空闲时间生成:
- 遍历一周时间,随机选定周几空闲
- 随机获取学生空闲时间个数,区间[1,3]
- 字符串随机生成1~3个互斥的空闲时间段区间[8:00,21:00]
- 如果生成的时间为空,则默认空闲时间为"Sat.19:00~21:00" 这个比较常见的空闲时间
- 志愿部门申请:
- 随机获取申请部门个数
- 随机选定部门(遍历方式随机(正序,逆序,随机区间正序,随机区间逆序))
- 选择完调用shuffle函数打乱顺序,模拟随机优先级.
- 如果最后生成的为空,则在部门中随机挑一个
- 兴趣标签:
在兴趣标签表里面,随机选取兴趣标签
部门信息:
- 编号增量生成
- 限定人数:随机选一个数,区间[10,15]
- 活动时间生成:
- 遍历一周时间,随机选定周几活动
- 随机获取部门活动时间个数,区间[1,3]
- 对于活动日,字符串随机生成1~3个互斥的活动时间段区间[8:00,21:00]
- 如果生成的时间为空,则默认活动时间为"Sat.19:00~21:00"
- 兴趣标签:
在兴趣标签表里面,随机选取兴趣标签
考虑因素:
空闲时间区间,部门的活动时间个数,对于时间的生成、部门申请表的生成尽可能公平
4.数据建模及匹配程序的思路及实现方式
数据建模
- 数据集:
- 选择变量( 输入数据抽象为类)
- Department类
部门编号department_no
各部门需要学生数的要求的上限member_limit
各部门的特点标签tags
各部门的常规活动时间段event_schedules
部门录取学生成员members- Student类
学生编号student_no
学生空闲时间段free_time
兴趣标签tags
部门意愿applications_department
未被部门选中的学生finalUnluckyStudent
未被分配到学生的部门unluckyDepartment- Util类
基本的IO操作和数据处理- 目标:输入实现部门与学生智能自动匹配
- 算法——匹配程序的思路:
需要为智能匹配算法确立分配原则,综合考虑兴趣、部门意愿优先级、和时间冲突情况。通过匹配值count的计算来排序得到部门录取学生的序列。
匹配公式:
//如果超过1/2活动时间未能到达,则淘汰(返回0)。
if(conflict>(timeSize*1/2)) {
return 0;
}
count=3*(5-choosed)+4*(hobbies)+3*(5-priority)+10*(timeSize-conflict+1);//考虑的因素:已加入部门的个数+兴趣匹配+优先级匹配+时间冲突个数
- 实现方式:
(1)每一个部门都有有一个候选队列,对学生队列遍历,将有意向的学生加入部门的候选队列
(2)对候选队列中的学生计算匹配值count,进行排序
(3)由各部门需要学生数的要求的上限member_limit选出成为部门录取学生成员members队列的学生,被录取学生choosed标志位置1,空闲时间扣除活动时间,并将没有入选的学生加入unluncky集合
(4)遍历所有部门后,选出未被分配到学生的部门unluckyDepartment。再遍历unluncky集合将其中未被部门选中的学生挑出(依据被部门选中标志位choosed==0)加入 finalUnluckyStudent队列
核心代码
5.你们在代码遵循了一定的规范,在博客中描述结对团队遵循的代码规范,并截取部分关键代码佐证说明。
之前一直没有一定的代码规范,队友说java有语言规范,才开始学着写注释、类名首字母大写,方法、变量用小驼峰式书写格式。
public class Student
private int choosed;
private ArrayList<FreeTime>freeTimeByTimeFormat;
ArrayList<String> eventsSchedules = departmentTimeGenerator();
//随机生成限定人数
6.结果评估。对于程序的匹配结果,你们是否满意?请对你们程序处理结果进行分析。
比较满意:
1.未匹配人数:192人,占比64%;
2.未匹配部门:1个,占比5%;
3.部门最多招纳人数:14人;
4.部门平均招纳人数:6.3人。
7.总结
结对感受
我们应该都是第一次尝试结对编程的方式,国庆长假过了5天就约着返校进行结对作业的交流(数计的学生永不低头==)。。。在网络交流中,因为要使用jackson包进行json处理所以使用java语言,开始了java语言的学习,还有一些工具的学习使用,感谢队友,带着我入门加上手eclipse.在交流过程中,发现一些思维的不同之处,在匹配程序思路上,我就是板板的按照题目,在时间优先还是兴趣优先之间犹豫,而队友比较有想法,用综合考虑的匹配值来计算。还有和队友结对的过程中,我也学习到开发的流程,先建框架、在逐步细化。在交流方式方面,我感觉见面交流的效率比较高,也要谢队友结对之恩,小伙伴很nice,我问的一些问题,他都耐心+详细的讲解了,而且还通俗易懂,也对我提的一些傻问题作出解答。感觉这次作业收获很多。