结对项目第二次作业

时间:2021-10-06 12:58:42

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队列

核心代码

DSSystem.java
Util.java

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,我问的一些问题,他都耐心+详细的讲解了,而且还通俗易懂,也对我提的一些傻问题作出解答。感觉这次作业收获很多。