结对项目第二次作业
成员
031502309 侯振源
031502339 叶港晨
Git链接
数据实例
intput: 完整数据
{
"students": [
{
"free_time": [
"Sat.0:00~2:00",
"Sat.13:00~15:00",
"Tues.3:00~5:00",
"Wed.8:00~10:00",
"Sat.12:00~14:00",
"Fri.9:00~11:00",
"Thur.21:00~23:00"
],
"student_no": "031502339",
"applications_department": [
"D019",
"D009",
"D007"
],
"tags": [
"basketball",
"study",
"chess",
"Game"
]
},
......
],
"departments": [
{
"event_schedules": [
"Mon.9:00~10:00",
"Sun.7:00~8:00",
"Wed.11:00~12:00",
"Sun.19:00~20:00",
"Wed.14:00~15:00",
"Sat.10:00~11:00",
"Sun.1:00~2:00",
"Fri.5:00~6:00"
],
"member_limit": 11,
"department_no": "D001",
"tags": [
"study",
"film",
"English",
"football",
"reading",
"chess",
"basketball"
]
},
{
"event_schedules": [
"Mon.6:00~7:00",
"Wed.4:00~5:00"
],
"member_limit": 13,
"department_no": "D002",
"tags": [
"football",
"reading",
"music",
"film",
"English",
"basketball",
"dance",
"Game",
"study"
]
},
......
]
}
output: 完整数据
{
"unlucky_student": [
"031502339",
"031502341",
"031502342",
"031502343",
"031502346",
"031502347",
"031502348",
......
"031502638" ],
"admitted": [
{
"member": [
"031502422",
"031502430",
"031502631" ],
"department_no": "D001"
},
{
"member": [
"031502486",
"031502559",
"031502614",
"031502631" ],
"department_no": "D002"
},
.......
],
"unlucky_department": [
"D006" ]
}
"数据生成"程序的原理以及所考虑的因素
在c++中利用rand()函数的使用来随机生成json格式的数据。利用Json::Value来生成一个个节点,然后再调用append()函数把一个个节点接到他们的父节点上,最后形成一个完整的json对象,之后利用toStyledString()函数把这个对象转换为字符串,之后就把字符串输出到文件就完成了数据生成的任务。
其中学生信息和部门的信息都是在已经制定好的标签中随机选取一个或多个数据。数据随机生成的数值按生活中实际的区间范围选取。如时间在【00:00~24:59】之间随机选取。
数据建模及匹配程序的思路及实现方式
我们采用了兴趣优先匹配的算法。首先创建两个类,
学生类
(
- 学生编号 student_no;
- 空闲时间段 free_time;
- 兴趣标签 tags;
- 部门意愿 applications_department;
),
部门类
(
- 部门编号 department_no;
- 学生数的要求的上限 member_limit;
- 特点标签 tags;
- 常规活动时间段 event_schedules_n;
)。
将所有数据分别存入各个学生类和部门类中。从第一个学生开始,遍历他所申请的部门,如果这是第一个志愿,则记录score值为10,第二个志愿则score值为9,以此类推。然后分别进入相应的部门类,查询活动时间是否和学生空闲时间匹配(学生时间不一定完全在部门活动时间的范围内,只要学生空闲时间有百分之八十在活动时间内即算匹配成功。),如果匹配,则进入下一个判断,否则直接淘汰。活动时间匹配之后,进行的是兴趣标签的判定,如果该学生兴趣标签中有一个标签与该部门标签所包含的标签相同,则score+1,如果两个相同则score+2,以此类推来进行优先级分类。然后之后再根据score的大小进行排序,实现优先录取,完成匹配。
代码规范
格式是vs自动排版,适当的使用注释来帮助理解代码:
```
void Input()
{
//给Student类赋值
for (int i = 0; i < root["students"].size(); i++)
{
Student[i].student_no = root["students"][i]["student_no"].asString();
for (int j = 0; j < root["students"][i]["free_time"].size(); j++)
......
//给Department类赋值
for (int i = 0; i < root["departments"].size(); i++)
{
Department[i].department_no = root["departments"][i]["department_no"].asString();
for (int j = 0; j < root["departments"][i]["event_schedules"].size(); j++)
......
}
###结果评估
不太满意。因国庆假期的原因,作业开始时间比较晚,所以时间来说比较赶,而且在配置json库的时候总是遇到各种各样的问题,浪费了太多的时间,导致对于匹配算法的考虑和编写的时间都大大不足。只能在志愿优先和兴趣标签的匹配的程度来决定优先级,个人感觉不够智能化,而且对于当前的优先级的代码编写也不够优美,只能说大概的实现的要求而已。而且没有时间来修改代码,导致代码太过于冗长等原因。总之并没有达到一开始的预期效果。
###结对感受
第二次和队友完成作业,在几天内不断的遇到问题,磕磕碰碰的粗糙的完成作业要求。由于这次作业工程量较大,所需要的代码也较长,所以和队友的讨论,修改,再讨论,再修改,不断的循环着。从一开始两个人想法的不一致到逐渐的意见一致。最主要的问题是太长的代码,导致另一个人看起来很困难,所以编写过程中需要不断的解释自己的编写的逻辑以及变量的含义。可是说整个过程到时一个人写加不断解释,另一个旁听,然后两人在角色互换。说实话是有点累人,但是当最后完成工作室,便会发现两个人的完成的作品会比一个人完成的更加的智能。
总的来说,过程很累,结果还不错。