您的位置:首页 > 其它

结对项目——第二次作业

2017-10-09 21:59 295 查看

0、欢迎食用

作业链接:https://edu.cnblogs.com/campus/fzu/SoftwareEngineering2015/homework/999

GitHub链接:https://github.com/H-BING/SoftwareEngineeringPractice/tree/master/Match

对友联盟:

031502324 林诗尧

031502411 胡冰

1、生成数据

数据示例

生成依据

部门

部门编号:按 D000 - D019 顺序生成。

接收个数:按题目要求随机设置为[10, 15]中任意一个数。

常规时间:随机一个不超过6的数字作为部门常规活动的总时间段,分别由星期+时间段随机组合而成对应个数的常规时间。

部门标签:总标签分为三组,部门标签任选一组,并在该组内随机选择[1, 7]个标签作为部门标签。

部员

部员编号:按 S031502000 - S031502299 顺序生成。

部门意愿:随机生成一个不超过5的数字作为意愿部门个数,并在20个部门中随机抽取相应个数的部门作为意愿。

空闲时间:随机一个不超过12的数字作为部门常规活动的总时间段,分别由星期+时间段随机组合而成对应个数的常规时间。

部员标签:在总标签中进行随机选择[2, 6]个标签作为自身标签。

2、算法匹配

主要思想:

类似高考志愿录取的思路,将所有学生根据所填志愿拆分成最多5轮的录取。即对每个部门而言,优先收取填报了第一志愿且符合要求的学生,再收取第二志愿的学生……以此类推,直至最后一轮。在每轮中,优先考虑常规活动时间符合要求的学生,同等条件下再根据标签匹配个数进行录取。与高考志愿录取不同的是,一名学生可被多个部门录取。

具体算法:

Macth1.0

1、根据志愿拆分成单轮匹配。

2、对学生时间进行一定的合并,将所有空闲时间处理成不相交的、孤立的时间段。时间匹配的问题即可转换为两组时间段的包含问题。

3、以时间优先为原则,先判断部门的所有常规时间段是否都包含在学生的空闲时间段中,不符合条件则筛去。在均满足部门常规活动时间的情况下,将按标签匹配的个数从高到低排序。最后根据学生优先级从高到低进行筛选。

4、存在情况:可能存在某学生已被多个部门录取,但由于匹配程度高,在当前轮次中,仍处于较高的优先级,仍有被录取的机会。这将可能使得部分学生因为匹配程度较低,优先级较低而失去录取机会,成为 unlucky_student 。

Match2.0

1、新增评价函数。在每轮中,填报同一部门的学生将根据评价函数进行排序。评价函数参考三个因素:该生已录取部门数 p、该生剩余肯能被录取部门数 q 以及该生与该轮部门标签匹配程度 s。评价函数f(p, q, s) = 1/(p + 1) + 1/(q + 5) + 0.15*s。评价函数解释详情参考对友博客(赶紧逃233

2、添加时间区间拆分。对学生的空闲时间,将删去已被录取部门的常规活动时间段(这样比较符合实际情况 0 0)。再用剩余的空闲时间进行下一轮志愿的匹配。

3、代码规范

函数名驼峰式命名,成员变量下划线式命名。

例:Department.h

#include"Prework.h"
#include <string>
using namespace std;

class Department {
public:
int tag_size;
int sche_size;
int num_limit;
int admit_size;
string no;
string tag[15];
string admit_member[35];
string event_schedules[55];
Department() {
tag_size = 0, sche_size = 0, admit_size = 0;
}
int getNumLimit(Department department);
void admitMember(string stu_no, Department &department);

Timeslot time_solt;
void getTimesolt(Department department);
Prework prework;
private:
};


对于Json数据格式提取了常量头文件。

例:Constant.h

// student
#define Stu "students"
#define Sfree "free_time"
#define Sno "student_no"
#define Sdept "applications_department"
#define Stag "tags"

// department
#define Dept "departments"
#define Dsche "event_schedules"
#define Dno "department_no"
#define Dnum "member_limit"
#define Dtag "tags"

// print
#define Pstu "unlucky_student"
#define Padmt "admitted"
#define Padmt_mem "member"
#define Padmt_dept "department_no"
#define Pdept "unlucky_department"


4、结果评估

测试了一下助教的给的示例效果貌似还可以??? 。基本所有部门都能够招满人,就一个部门没有招满人,未出现 unlucky_department 。unlucky_student 数仅比部门招收总人数多出不到5人。有再测试了别的数据,基本情况也差不多,部门录取率、学生中选率还算是比较高的。

以上都是假评估,所有数据皆不可信。

对友非常认真负责,ddl过后还继续检查修复项目存在的问题。虽然由于出现一些失误以及误打误撞的看似合理的匹配率(如上述划掉部分)没有认真检查数据,但修改过后的运行结果相对来说还是比较符合实际情况的。

5、结对感受

全程抱对友大腿。勉强可以说是处理了一下Json格式吧233 算法主要思想全靠对友强撑,算法部分还是太弱辣。而且自己在思考过程中还是存在蛮多漏洞的,和对友讨论的时候对友经常能够想到一些比较细节的地方。原来还是以为自己算是比较考虑周全的,但和对友比起来还是非常的粗枝大叶 T T 然后还是对IDE的使用还是非常糟糕 0 0 debug能力还是太弱(都是强行print... emmm 感谢对友带飞。

最后,作业终于完成非常开心,再也不想赶作业了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: