1、结对队员
1.吴海林(031502430)
2.苏伟鹏(031502331)
2、Github以及作业链接
3、最好的数据及数据生成原理
最好的数据:
300个学生只有56个人没有选中部门 而部门有选到自己想要的学生
数据生成原理:
随机数生成法,然后就是将生成的数据以json格式写入到input_data.txt中去
所考虑的因素:
1.要考虑学生选多个部门时,不能生成相同的部门编号
2.学生所选的多个tags标签以及一个部门所拥有的多个标签应该不同
3.学生以及部门的多个时间应该有所限制,就是不能有太多的时间个数
4.要考虑部门的限制人数
5.部门是按顺序生成 D1-D20
不足:
1.受限制条件多
2.随机生成差
4、数据建模以及匹配程序的思路及实现方式
流程图:
数据建模:
1.选部门存在学生的选择决策权,学生可选填写多个志愿,部门可选多个学生,但是我们这里明确规定一个学生可选择一个部门(其他同学可能一个学生可选多个部门 可能会比较麻烦)
2.学生所选部门在该学生的第几个志愿以及志愿个数会影响学生对部门的选择以及部门对该学生的选择
3.学生的课余时间与部门活动时间越是匹配,部门就越喜欢该学生
4.学生的标签与部门标签越是匹配, 部门越是喜欢
5.从以上的分析我们可以计算出学生对该部门的喜欢权值,分三部分计算 rank1 rank2 rank3,其中rank1代表志愿数和第几志愿所有有的权值 ,rank2代表时间匹配所拥有的权值,rank3代表标签匹配所拥有的权值,最后把三个加起来 即rank_value[i][k] = rank1 + rank2 + rank3 表示第i个同学对第k个部门的权值 ,最后根据这个权值进行部门学生匹配
匹配程序思路:
1.我们先计算出每个学生对每个部门的权值
2.对部门进行遍历,没遍历到一个部门,就计算出所有学生对该部门的权值 存在一个结构体当中去,然后排序(权值大的优先),该部门没进入一个学生,则member_limit-- 即限选人少减一,然后将该学生的学号添加到该部门的member数组中去,并将该学生flag(有无选部门)设置为true 说明已选中部门,不能在被其他部门选中,因为我们规定一个学生只能选一个部门。
3.然后跑一遍admitted结构体 该结构体存每个部门选到的学生,如果所选到的学生为0 则将该部门的department_sno添加到unluck_department中去
4.最后跑一遍stu结构体 该结构体存每个学生的信息 假如该学生的flag为false 说明没被选中,则添加到unlucky_student中去
匹配程序的实现方式:
先计算权值
然后遍历跑一遍
void match_program::match_algorithm() {
for (int i = 0; i < dep_num; i++) {
memset(wishtmp, 0, sizeof(wishtmp)); // 每一次都初始化该数组
for (int j = 0; j < stu_num; j++) {
wishtmp[j].dep_index = i; //存取部门下标
wishtmp[j].stu_index = j; // 存取 学生下标
wishtmp[j].value = rank_value[j][i]; //存取该学生对该部门的权值
}
sort(wishtmp, wishtmp + stu_num, cmp1); //排序 根据权值 学生对该部门
addmitted[i].department_no = dep[i].department_no;
for (int j = 0; j < stu_num; j++) {
//cout << wishtmp[j].dep_index << " " << wishtmp[j].stu_index << " " << wishtmp[j].value << endl;
//if (stu[wishtmp[j].stu_index].flag == true) continue;
if (dep[i].member_limit == 0) break;
if (wishtmp[j].value != 0) {
if (stu[wishtmp[j].stu_index].flag == false) {
addmitted[i].member[addmitted[i].memeber_num++] = stu[wishtmp[j].stu_index].student_no; //该部门添加 学生学号 说明选中学生
stu[wishtmp[j].stu_index].flag = true; //将该学生被部门选中的标志置true
dep[i].member_limit--; //限制人数减一
}
else
continue;
}
if (wishtmp[j].value == 0) break;
}
}
// 查找unlucky_department
for (int i = 0; i < dep_num; i++) {
if (addmitted[i].memeber_num == 0) {
unlucky_depa[unluck_dep_num++].department_no = addmitted[i].department_no; //添加到unlucky_depa中去
}
}
//查找unlucky_student
for (int i = 0; i < stu_num; i++) {
if (!stu[i].flag) {
unlucky_student[unluck_stu_num++].student_sno = stu[i].student_no; //添加到unlucky_student中去
}
}
}
5、团队遵循代码规范
1.主要包括规范注释、合理运用空行、代码格式化、无冗余代码及无废弃代码等
佐证:
6、结果评估
1.本次作业,我们所考虑的就是一个学生只能添加一个部门,但是报志愿的时候最多可以报五个,这样实现会简单一点;
2.在实现匹配的过程中我觉得还是有些不足的地方,就是该学生的选择多个部门,对不同部门的权值不一样,但是我们在匹配过程中,只从头到尾遍历部门,然后对其进行选择,这可能会将这位学生选择到他所有所选部门中权值较低的一个中去,这可能对该学生还是蛮不公平;
3.计算权值,我觉得还还可以改进一下,就是将部门的限制人数也考虑到计算权值中去,这样匹配程序可能会更好
4.因为自动生成数据,每次匹配完后unlucky_department都为null 就是每次部门都是能选中人的 ,感觉这样还是可以去改进的。
5.每次生成的数据都是300名学生和20个部门。
7、结对感受
1.我的感受:本次作业比起上次作业,确实有趣了很多,毕竟能敲代码,上次作业也就画画图什么的,结对最大的好处就是可以共同讨论问题,共同解决问题,每当遇到bug的时候可能自己找到眼花缭乱,队友可能只需要一会儿的功夫,这就节约了很多时间,还有就是分工合作,加大了作业的效率。当然为了这个作业,也和队友熬了一夜,想想多么可怕,但是又是开心的,因为学习是一件快乐的事,哈哈哈哈!!!!作业固然重要,从中能学到很多东西。不仅可以从网络学,还可以从队友身上学习。所以啊,结对给我的最好的感受是:分忧解难,增强效率
2.队友的感受:一句话评价结队的最大好处————当局者迷,旁观者清,在项目收官的时候,接连出现了好几个未知的bug,一般都是当局者一直找不到bug,然后旁观者看着看着就突然发现了,当然也有出现两个人都找不到的情况,这种就比较尴尬了,总之,DeBug能力尚待提高,结队效率远远高于一个人。然后就是说说个人,上一篇博客队友信息描述实力预言了这次作业的分工,这次作业代码主力输出都在队友身上,我就~~端端茶倒倒水~~写了工作量比较小的数据生成程序,总体还是非常感谢队友的付出,毕竟有五年的同窗之谊,~~好像说了太多废话~~,总而言之,言而总之,结队编程,不试不知道,一试吓一跳。嗯 收工~~~~
3.闪光点: 熬夜写代码不容易啊,当然还是队友挺给力的,每当找不到bug ,队友能及时找出来,省了一大把部分时间去实现其他程序。还有就是分工协作明确,高效。
4.建议:多多交流,多多研究。
附录
画面: