第二次结对作业

结对作业 (二)


结对情况


项目链接

项目点这里


设计说明

  • 接口设计(API)
     class match
     {
          void Readjs();//读取输入文件
          void heatmatch();//第一种匹配算法
          void make_distribution_bytags();//第二种匹配算法
          void Print();//输出
      }
  • 内部实现设计(类图)

    o_%e5%86%85%e9%83%a8%e5%ae%9e%e7%8e%b0.png

  • 匹配算法思路

    我们在设计这道题时设想了两种处理方式,一种是通过生成的兴趣标签,通过学生与部门之间互相匹配的兴趣标签的数量,来匹配学生与部门。首先先根据学生的成绩进行排序,成绩高的学生优先进行选择。通过时间匹配先把不满足时间要求的部门剔除,再选一个兴趣标签匹配最多的部门加入,然后取下一个学生进行同样的操作。这样进行两轮,每轮每个学生只能加入一个部门。
    另一种是为了保证学生能够尽可能的加入部门,计算每个学生的志愿中最“空闲”的部门,然后如果学生自身有空余时间参与部门活动,则该学生进入该部门。在学生中,通过每个学生志愿中“最闲”部门的“空闲”程度比较,得出最“空闲”的学生,是他先选择部门,这样就可以尽可能保证学生能够进入志愿中的某个部门了。

  • 评价自己的匹配算法

    我设计的是第二种匹配算法,我觉得从实现的角度上来说,我的算法的思路还是不错的,但是我在实现时却没能把完整的算法实现出来,只实现了大体部分(二轮之后结果错误,所以只有一轮,即学生只加入了一个部门),感觉不好吧,其实还有提升空间的。


测试数据生成

输入的数据,另外写生成程序随机实现。

部门与学生姓名:生成数据时,为了保持美观,在网上复制了100个和5000个学生名字,通过随机数的方法,从这些姓名中挑出足够的数量去生成数据(对不起是我偷懒了...)
部门与学生时间:一开始生成的时候我将所有时间都设置成了随机形成,结果发现这样的后果是时间太零散,且部门与学生之间可能匹配到的几率非常低,所以修改之后,设置了几个时间段,通过随机选取时间段的方法,产生学生空闲时间以及部门活动时间(为了靠近现实,我们将学生空余时间调的比较多,便于匹配)
部门与学生标签生成: 我们通过随机生成固定种数的标签后,对部门以及学生随机分配,保证学生或部门不会出现一个人或者一个部门有重复标签,同时保证部门标签数量上限高于学生标签数量。


遇到的困难及解决办法

1.在对学生进行排序的时候比较头疼吧,一开始想用简单冒泡之类的,后面发现实在不好用,于是使用了最小堆实现,比起之前的冒泡用起来更方便。
2.尝试使用了Hash来解决部门到名字的映射吧,但是使用的不太好,后面还耍了一些小手段,对于个别几个冲突我们直接通过具体名字去解决了,很尴尬。。。
3.还有问题其实是我个人的问题,在使用第二种算法(通过“空闲”度匹配)时,在二轮匹配时会出现匹配结果错误,大多是部门人数已满,但是学生强行进入的错误,然后还没改成功,就只能用一轮结果当作最终结果,算是我个人能力的问题吧...


对队友的评价

优点和值得学习的地方
1.非常认真负责,交给他的部分完全放心
2.完全没有抱怨的负面情绪
不好或需要改进的地方
1.代码格式看着难受不喜欢
2.贼固执,某些事完全无法说服他


运行结果及展示

测试数据点这里

  • 测试200位同学,20个部门的情况
    算法1算法2
  • 测试500位同学,30个部门的情况
    算法1算法2
  • 测试1000位同学,50个部门的情况
    算法1算法2
  • 测试5000位同学,100个部门的情况
    算法1算法2

关键代码

int count = (int)root["students"].size();
    while (count > 0)
    {
        int chose_student = students_maxs[1];
        int chosen_department = students_wishmax[chose_student][1];
        if (students_wishmax[chose_student][0] == 0) //学生所有志愿部门皆满则无法加入任意部门
        {
            count = 0; break;
        }
        else
        {
            students_departments[chose_student][5] = chosen_department;
        }
        departments_heat[chosen_department]--;
        //联动更新
        for (int i = 0; i < departments_students[chosen_department][0]; i++)
        {
            int temp_student = departments_students[chosen_department][i + 1];
            if (temp_student != chose_student) // 如果候选学生不是已选学生,更改其中热度
            {
                if (students_wishmax[temp_student][1] == chosen_department)
                {
                    students_wishmax[temp_student][0]--;
                    for (int j = 0; j < (int)root["students"][temp_student]["departments_wish"].size(); j++)
                    {
                        int temp= dNameHash(root["students"][temp_student]["departments_wish"][j].asString());
                        if (students_wishmax[temp_student][0] < departments_heat[temp])
                        {
                            students_wishmax[temp_student][0] = departments_heat[temp];
                            students_wishmax[temp_student][1] = temp;
                        }

                    }
                }
            }
        }
        swap(students_maxs[1], students_maxs[count]);
        count--;
        for (int i = count/ 2; i >= 1; i--)
        {
            maxsmaintain(students_maxs, count, i); //维护最大堆
        }
}

PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划
· Estimate· 估计这个任务需要多少时间55
Development开发
· Analysis· 需求分析 (包括学习新技术)2030
· Design Spec· 生成设计文档2030
· Design Review· 设计复审 (和同事审核设计文档)1020
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)1020
· Design· 具体设计3050
· Coding· 具体编码100120
· Code Review· 代码复审2030
· Test· 测试(自我测试,修改代码,提交修改)3060
Reporting报告3040
· Test Report· 测试报告2030
· Size Measurement· 计算工作量1010
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划2020
合计325465

学习进度条

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
13303301313触类旁通,学习到了一个优化思想
2120450619接触了原型设计的相关知识
3-556010103453接触了JSON文件,同时复习了一些基础的算法

转载于:https://www.cnblogs.com/joke15/p/7674044.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值