第六次作业--结对编程第二次

成员: 504 非易 539 峻雄


队友博客:http://www.cnblogs.com/Typhon/p/7669082.html


Git:https://github.com/MeKChen/Software-Engineering/tree/master/DepStuMatch


设计说明:

接口设计

//对输入文件的各种数据的解析
void parseDepno(Json::Value& root, int i)
{
    string department_no = root["departments"][i]["department_no"].asString();
    dept[i].dept_no = department_no;
    dept[i].choose = 0;
}

void parseLimit(Json::Value& root, int i)
{
    int deplimit = root["departments"][i]["member_limit"].asInt();
    dept[i].maxnum = deplimit;
    dept[i].passnum = 0;
}

void parseDtags(Json::Value& root, int i)
{
    Json::Value dtags = root["departments"][i]["tags"];
    int sizeofdtags = dtags.size();
    for (int j = 0; j < sizeofdtags; j++)
    {
        string str = dtags[j].asString();
        dept[i].tags.push_back(str);
    }
}

void parseStuno(Json::Value& root, int i)
{
    string stu_no = root["students"][i]["student_no"].asString();
    stu[i].stu_no = stu_no;
    stu[i].bechoosen = 0;
}

void parseGpa(Json::Value& root, int i)
{
    double gpa = root["students"][i]["gpa"].asDouble();
    stu[i].gpa = gpa;
}

void parseStags(Json::Value& root, int i)
{
    Json::Value stags = root["students"][i]["tags"];
    int sizeofstags = stags.size();
    for (int j = 0; j < sizeofstags; j++)
    {
        string str = stags[j].asString();
        stu[i].tags.push_back(str);
    }
}

void parseStuDept(Json::Value& root, int i)
{
    Json::Value adep = root["students"][i]["available_dep"];
    int sizeofadep = adep.size();
    for (int j = 0; j < sizeofadep; j++)
    {
        string str = adep[j].asString();
        stu[i].dept_no.push_back(str);
    }
}

内部实现设计
1220247-20171015185752762-146246218.png


匹配算法设计
首先根据学生的的志愿情况(第几志愿),绩点,兴趣与部门标签等的符合情况部门对其有一个满意度打分,然后进行匹配,一个部门一个部门进行选择,倘若人满了则根据评分决定是否替换,以此类推。
1220247-20171015195256652-1063959509.png


关键代码

//部门对学生打分
double score(Student stu, Dept dept, int pos)
{
    double points = 0;
    points = points + 20 - (5 * pos);
    points = points + stu.gpa * 5;
    int tag = tagsnum(stu, dept);
    points = points + 6 * (tag > 5 ? 5 : tag);
    return points;
}
//匹配算法
bool cmp(Student a, Student b)
{
    return a.stupoint > b.stupoint;
}

void matching(int ssize, int dsize)
{
    for (int t = 0; t < dsize; t++)
    {
        int total = 0;
        for (int i = 0; i < ssize; i++)
        {
            for (int k = 0; k < stu[i].dept_no.size(); k++)
                if (deptnum(stu[i].dept_no[k], dsize) == t && stu[i].flag == 0)
                {
                    list[total].stu_index = i;
                    list[total].point = stu[i].stupoint;
                    total++;
                }
        }
        sort(list, list + total);
        for (int i = 0; i < dept[t].maxnum && i < total; i++)
        {
            int stu_index = list[i].stu_index;
            v.push_back(pii(dept[t].dept_no, stu[stu_index].stu_no));
            dept[t].choose = 1;
            stu[stu_index].bechoosen = 1;
        }
    }
}

输入数据生成结果
886001-20171015201538762-1541685586.png

测试运行结果

  • 输出采用的是部门学生一对一的形式
  • 测试200位同学,20个部门的情况
    1220247-20171015191807340-925281095.png
  • 测试500位同学,30个部门的情况
    1220247-20171015191822684-58782894.png
  • 测试1000位同学,50个部门的情况
    1220247-20171015191838340-1064764312.png
  • 测试5000位同学,100个部门的情况
    1220247-20171015191844059-946043965.png

性能分析
1220247-20171015195422512-1199388759.png


遇到的问题:

  • 卡了最久的还是匹配算法
  • 采用的方法是设置一个满意度得分,即每个学生对其所选的部门的一个评分,将选择第i个部门的学生以得分排列,选择前n个进入此部门,再考虑第i+1个部门。
  • 编码过程中遇到了问题,通过询问舍友的方式解决,主要还是对结构体中vector的应用不太理解
  • 编码能力不足,要不断提高

对队友的评价:

  • 队友主要负责了博客的完成,在匹配算法上也给到了不错的建议

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划2025
Estimate估计任务时间3030
Development开发--
Analysis需求分析100120
Design生成设计文档--
Design Review设计复审--
Coding Standard代码规范4560
Design具体设计--
Coding具体编码120160
Code Review代码复审--
Test测试6080
Reporting报告4560
Test Repor测试报告--
Size Measurement计算工作量2030
Postmortem & Process Improvement Plan事后总结, 并提出过程改进计划2530
合计465595

转载于:https://www.cnblogs.com/kurisu/p/7673951.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐