第二次结对作业
姓名:郭剑南 学号031502609
队友姓名:胡武成 学号031502610
Github:https://github.com/winforbest/Dep-Stu
生成程序:
原理:
因为这次作业的背景是部门筛选问题,所以我们讨论出最后生成的数据还是要接近实际。
首先是学生的空闲时间段和部门的活动时间段。考虑到生活作息,我们规定两者的时间段在早8am-10pm之间选出连续的两个小时。一天可能有多个空闲时间或活动时间,同一天的时间段不会重复或重叠。
其次是兴趣标签。每个部门和学生的兴趣标签个数为T(2≤T≤10),同一部门或同一学生不存在重复标签。
- 先随机生成K个兴趣标签。
- 每个部门从K个标签中随机选取T个标签,所有的部门从K个标签中共选出L个标签(L<K)。
- 每个学生再从L个标签中随机选取T个标签,所有学生从L个标签中共选出M个标签(M<L),这样保证学生的兴趣标签一定是部门标签中的一个。
- 接着是随机生成部门编号和学生编号,部门格式为Dxxxxxx,学生格式为Sxxxxxx
- 最后是随机生成每个学生的部门意愿,数量在0-5之间。
数据:input_data
匹配程序:
原理:
- 首先是部门选择的先后顺序,学生意愿选择最多的部门最先开始选择。
- 其次是部门选择学生的算法思路
- 先考虑部门活动时间与学生空闲时间冲突情况,不冲突或冲突较少的优先选择。
- 再考虑学生的兴趣标签与部门标签相同的数量,数量多的优先选择。
- 接着考虑学生意愿,像填报志愿一样,意愿靠前(第一志愿)优先考虑。
代码规范:
- 每个函数实现一个功能,保证函数独立性。
- 使用注释,结构清晰。
部分代码:
// ----------------------------- 计算标签度 -----------------------------------
// 标签度 = 吻合的兴趣标签个数 / 部门兴趣标签数
double calTag(int a, int b) {
int i, j, cnt = 0;
int len = dep[b].tlen;
for (i = 0; i < len; ++i) {
int len2 = stu[a].tlen;
for (j = 0; j < len2; ++j) {
if (dep[b].tags[i] == stu[a].tags[j]) {
++cnt;
}
}
}
return 1.0*cnt / len;
}
// ----------------------- 计算重视程度(第几志愿) -----------------------
// 重视程度 = 第x志愿 / 总志愿数
double calChoose(int a, int b) {
int i;
int len = stu[a].alen;
string dno = dep[b].department_no;
for (i = 0; i < len; ++i) {
if (stu[a].applications_department[i] == dno) break;
}
return 1.0*i / len;
}
结果评测:
x = 中选学生数/总学生数
y = (各部门接收人数/各部门纳新人数上限)/总部门数
执行测试样例, 计算结果 x = 0.73 , y = 0.64. 还算可以。
结对感想:对我来说,这次结对作业印象最深的地方就是在看到题目后两个人探讨的部分。我们分析了许多可能存在的因素和问题,并在基于实际情况下,提出解决各种问题的方案,就像是让这个程序在现实使用中可以发挥出作用。一个人提出观点,另一个人改进这个观点,在不断的改进的过程中往往能发现解决问题的方法。
当然代码部分还是要紧紧抱住大佬的大腿。。生成程序的代码多亏了大佬的帮助才得以完成。大佬也教了我许多代码的小技巧以及规范方面的东西。希望能在以后的作业和两人的头脑风暴中不断收获和进步。