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

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

成员: 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);
	}
}

内部实现设计


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


关键代码

//部门对学生打分
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;
		}
	}
}

输入数据生成结果

测试运行结果

  • 输出采用的是部门学生一对一的形式
  • 测试200位同学,20个部门的情况
  • 测试500位同学,30个部门的情况
  • 测试1000位同学,50个部门的情况
  • 测试5000位同学,100个部门的情况

性能分析


遇到的问题:

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

对队友的评价:

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

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 25
Estimate 估计任务时间 30 30
Development 开发 - -
Analysis 需求分析 100 120
Design 生成设计文档 - -
Design Review 设计复审 - -
Coding Standard 代码规范 45 60
Design 具体设计 - -
Coding 具体编码 120 160
Code Review 代码复审 - -
Test 测试 60 80
Reporting 报告 45 60
Test Repor 测试报告 - -
Size Measurement 计算工作量 20 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 25 30
合计 465 595
posted @ 2017-10-15 20:17  MeKChen  阅读(201)  评论(2编辑  收藏  举报