第二次结队作业

第二次结对作业-部门学生智能匹配系统

  • 170320078 孙敏铭
  • 170327076 余国鹏

Github地址

https://github.com/sunminming/match

数据模型

部门的数据模型包括部门编号(int型,1-20),部门纳新人数(0-15),部门特色标签(字符串向量),部门活动时间(字符串),已确定学生(int型向量)。这部分需要特别注意的是部门编号不能重复,应该从1开始,每次加1。已确定学生向量record中保存已加入部门的学生学号,这个属性是在算法执行的过程中赋值的。

学生的数据模型包括学生学号(int型,1-300),学生绩点(int型,1-5),学生兴趣标签(字符串向量),学生报名意愿(int型向量),学生空闲时间(字符串向量)。另外学生还有一个特别的属性intmatch,用来表示学生和当前部门的标签匹配程度,这个属性是在算法执行的过程中赋值的。学生数据模型中,学号不能重复。

部门数据格式

	/部门
		/部门编号
		/活动时间
		/部门特点标签
		/部门纳新人数
		/部门确定学生

部门数据截图

学生数据格式

	/学生
		/学号
		/绩点
		/学生意愿
		/学生兴趣标签			
		/学生空闲时间
		/与当前部门匹配程度

学生数据截图

数据生成方式

除了上面提到的部门编号和学生学号,每个学生或部门的兴趣个数随机生成,然后从一个“兴趣池”中随机抽取。部门活动时间和学生活动时间同理。学生的部门意愿则是随机生成一个小于5的数l(学生报名不能多于5个),而后在1-20(部门编号)中随机抽取一个数x,学生的部门意愿即为[x,x+l];部门纳新人数随机生成[0-15]中的一个,所以在我的数据中出现了3个不纳新的部门(纳新人数为0)。

以上为在生成数据文件中随机生成的数据。还有两个属性:“部门的确定学生”和“与当前部门匹配程度”是在匹配算法中确定的。留在下一部分介绍。
输入输出采用文本文件.txt的方式。

匹配算法

基于结队中两人的算法并不是很好,我们在结队中使用简单的暴力算法,两重循环。第一层遍历部门,第二层遍历学生。具体过程如下:

其中,学生排序时需要用到“与当前部门匹配程度(intmatch)”,这个属性可以根据优先规则进行赋值,比如兴趣越接近值越大等;而“加入部门”要将学生加入“部门确定学生(reord)”,同时将学生从列表中删除,避免两个部门同时选中同一个学生。

  • 缺点和改正方法:
    1.这个算法使用暴力循环,耗时大。更好的匹配算法我们目前还没有想出来;
    2.由于时间紧迫,类的定义中缺少构造,析构和一些操作符的定义。

代码规范

类中操作选择规范为“操作+属性”。比如:添加学生的兴趣,addinterset;获得学生学号,getnum等;

结果分析

优先条件 匹配学生个数 未匹配学生个数 实际耗时 输出文件路径
兴趣优先 125 6 10.6 https://github.com/sunminming/match/blob/master/record.txt
绩点优先 125 6 10.9 https://github.com/sunminming/match/blob/master/BIN/record.txt

注1:由于部门纳新人数随机生成,故总共只有131个纳新名额。

对于不同优先条件变更的适应能力:若要修改优先条件,比如从兴趣优先改成绩点优先或从绩点优先改成兴趣优先,只要修改排序函数中调用的两个函数即可。

体会

第一次看到这个项目感觉很轻松,就是两个类的事。自己慢慢上手后才发现仅仅两个类的定义就足够让我焦头烂额。总是一遍又一遍的修改类的属性和操作,不停的查阅资料来找出bug。对于结队的余国鹏同学非常感谢他就算退选了也帮我梳理思路,一起完成这份作业。另一个感受就是时间太短,工作量太大,导致有一些功能没有实现。不过这次对于面向对象编程的体验让我发现很多以前没有注意到的细节,以后会多加注意。

原文地址:https://www.cnblogs.com/sunminming/p/7726768.html