第二次结对作业

姓名:郭剑南 学号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. 还算可以。


结对感想:对我来说,这次结对作业印象最深的地方就是在看到题目后两个人探讨的部分。我们分析了许多可能存在的因素和问题,并在基于实际情况下,提出解决各种问题的方案,就像是让这个程序在现实使用中可以发挥出作用。一个人提出观点,另一个人改进这个观点,在不断的改进的过程中往往能发现解决问题的方法。
当然代码部分还是要紧紧抱住大佬的大腿。。生成程序的代码多亏了大佬的帮助才得以完成。大佬也教了我许多代码的小技巧以及规范方面的东西。希望能在以后的作业和两人的头脑风暴中不断收获和进步。

 posted on 2017-10-09 21:55  micheallll  阅读(128)  评论(0编辑  收藏  举报