1. 给出结对成员的学号及姓名。

  • 结对成员

    • 031502506 陈龙江
    • 031502529 王国超 click

2.首页给出项目的Github链接。


3. 贴出你们生成的一组最“好”的数据(这里的数据特指 input_data.txt,数据给出对应链接即可),并详细说明"数据生成"程序的原理以及你们所考虑的因素。**

A: 你说input_data怎么生成啊?

B: 不懂啊,随便吧。

A: 了解。

  • 原理:基于随机性原理生成数据

  • 因素:考虑到作业的输入数据的要求:

    • 对于学生而言:

      • 学生数为300人,分成6个班
      • 每名学生有唯一的编号(或者说学号)
      • 每名学生的空闲时间段的有效区间为[8:0020:00]+[1:003:00],空闲时间段个数的有效区间为[2, 15]个
      • 每名学生的部门意愿个数的有效区间为[0, 5],且排在较前面的意愿优先级较高
      • 每名学生的标签个数的有效区间为[2, 20]
    • 对于部门而言:

      • 部门数为20个
      • 每个部门有唯一的编号,格式为D0XX
      • 每个部门的要求学生数上限的有效区间为[10, 15]
      • 每个部门的标签个数的有效区间为[2, 20]
      • 每个部门的常规活动时间段的有效区间为[8:0020:00]+[1:003:00],常规活动时间段个数的有效区间为[2, 15]个
    • 在综合以上因素的限制下,我们采用随机算法生成input_data

    • 将标签限定为:

        string tags[] = {
      "reading", "programming", "film", "English", "reading",
      "music", "dance", "basketball", "chess", "football",
      "swimming", "singing", "climbing", "runing", "drawing",
      "writing", "cooking", "speeching", "piano", "Go"
      };
    • 最“好”的数据,这个“好”是指这一组数据可以得出使得未被分配到学生的部门和未被部门选中的学生的数量尽可能少?还是说这一组数据更加地贴近实际

    • 在我们理解之下,更倾向于使得生成的数据贴近实际,所以我们也倾向于使用随机性的算法来处理。

    • 一个好处是,随机,更贴近实际中不同的学生,不同的部门,可能拥有的无法预测的不同属性的情况。

    • 但明显的不足是,我们所处理的简单的随机,也同时忽略了实际中一个部门所拥有的标签等属性之间的联系、学生的各项属性之间的联系等等情况。这些联系是我们的数据中无法体现出来的,也并不清楚要如何去考虑这些联系。


4.详细说明你们数据建模及匹配程序的思路及实现方式。

  • 数据建模及匹配实现

    • 首先给出Student和Department的定义

        struct Student
      {
      bool isSelect;
      string id;
      vector<pair<int, int> > time;
      vector<string> app;
      vector<string> tags;
      Student() :isSelect(false) {}
      }; struct Department
      {
      int curNum;
      int limit;
      string id;
      vector<pair<int, int> > time;
      vector<string> tags;
      Department():curNum(0){}
      };
    • 以及匹配算法,Match类的主要成员

        class Match
      {
      public:
      Match();
      ~Match();
      void init();
      void stu_dep_matching(const char *infile, const char *outfile, int Pattern = 1);
      private:
      int APP_COEF;
      int TIME_COEF;
      int TAG_COEF;
      Student students[studentNum + 5];
      Department departments[departmentNum + 5];
      string numToTime(int num);
      int timeToNum(string s);
      int getWeekNo(string s);
      pair<int, int> dateToNum(string s);
      void translate(const char *infile);
      vector<Node> matching();
      void writing(vector<Node> &match, const char *outfile);
      };
    • 我们使用jsoncpp来解析和生成json格式的文件

    • 匹配算法大致由3个部分组成:

      1. translate:

        • 解析输入文件,将student和department对应的数据存到students[]和departments[]中
      2. matching:
        • 我们称满足以下情况的学生和部门无法匹配:

          • 学生的意愿中没有相应的部门编号
          • 该学生已经被其他部门接纳
          • 该部门所接纳的学生人数达到上限
        • 在学生和部门可以相互匹配的情况下:
          • 我们给每一对可以相互匹配的学生和部门一个匹配系数match_coef
          • 根据每一对的匹配系数从大到小排序,依次匹配
          • 匹配系数的计算方式为(根据模式的不同(默认意愿优先),意愿系数/时间系数/标签系数也会不同):
              match_coef = 意愿优先级\*意愿系数 + 匹配时间段数\*时间系数 + 匹配标签数\*标签系数
      3. writing:
        • 将第2步得到的匹配情况转化成json格式的output_data文件输出。

5.你们在代码遵循了一定的规范,在博客中描述结对团队遵循的代码规范,并截取部分关键代码佐证说明。

  • 采用面向对象风格的实现,将相应的实现封装成类等等

  • 示例:如Match类,Generator类等等

  • 大括号换行,以下情况除外:

    • if-else语句后只有一行代码
    • 等等
  • 示例:

      int Match::getWeekNo(string s)
    {
    if (!s.compare("Sun")) return 0;
    else if (!s.compare("Mon")) return 1;
    else if (!s.compare("Tues")) return 2;
    else if (!s.compare("Wed")) return 3;
    else if (!s.compare("Thu")) return 4;
    else if (!s.compare("Fri")) return 5;
    else return 6;
    }
  • 命名

    • 函数命名采用驼峰式命名法,第一个单词首字母小写,后面其他单词首字母大写。
    • 变量命名采用驼峰式命名法和下划线命名法结合
    • 类名首字母大写
  • 示例:

      Class Match
    { }; int APP_COEF;
    int TIME_COEF;
    int TAG_COEF; string numToTime(int num);
    int timeToNum(string s);
    int getWeekNo(string s);
    pair<int, int> dateToNum(string s);
  • 等等


6.结果评估。对于程序的匹配结果,你们是否满意?请对你们程序处理结果进行分析。

  • 对于自己生成的input_data文件,程序跑出来有将近1/6的学生无法匹配到相应的部门。
  • 对于生成的随机数据,可以跑出这样的结果还是可以接受的,当然也无法达到满意的程度。
  • 根据输入模式的不同,进行简单的不同属性优先级(如意愿优先/兴趣优先等)的匹配,也可以接受。
  • 但是,作为一个匹配程序,这样的结果说明了它还有很大的提升空间、
  • 输入数据无法预测,我们不可能通过构造一组能使得匹配程序跑出更优结果的数据来提升我们的程序。
  • 那么一个改进的方向是改善匹配的算法:
    • 一是设计更加良好的属性系数的值,使得匹配更合理。
    • 二是更换算法,考虑跑一个网络流之类的进行改进。
  • 除此之外,程序还存在很多的不足,比如:
    • 限定了标签/tags的范围,这对于实际是不行的。一个解决方案是采用hash,利用输入中学生的兴趣标签一定是所有部门特点标签其中的一个这一个条件,生成标签。【undo】
    • 算法的复杂度
    • ...
  • 总而言之,算法的改进空间很大,coding路漫漫...

7.已经尝试过结对编码,你一定很多话要说。请发表结对感受,以及两个人对彼此结对中的闪光点或建议的分享。

  • 首先就是,拖延癌晚期患者,表示对不起对友...
  • 再来就是两个人感觉沟通交流还不是很够吧,结对编码更希望是两个人的同时提升
  • 学习了神奇的jsoncpp
  • 最后加班加点,恰逢家里有事,忙里偷闲的赶完工,还是挺开心的
  • and,在动车上顶着笔记本的最后一点电量写完这篇博客,exciting!

以上。

软件工程实践_结对Task2_ student_department_matching的更多相关文章

  1. 个人作业——软件工程实践总结&个人技术博客

    一. 回望 (1)对比开篇博客你对课程目标和期待,"希望通过实践锻炼,增强软件工程专业的能力和就业竞争力",对比目前的所学所练所得,在哪些方面达到了你的期待和目标,哪些方面还存在哪 ...

  2. memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间

    memcached vs MySQL Memory engine table 速度比较_XMPP Jabber即时通讯开发实践_百度空间 memcached vs MySQL Memory engin ...

  3. 提高mysql memory(heap) engine内存性能的开源补丁_XMPP Jabber即时通讯开发实践_百度空间

    提高mysql memory(heap) engine内存性能的开源补丁_XMPP Jabber即时通讯开发实践_百度空间 提高mysql memory(heap) engine内存性能的开源补丁

  4. 关于Axure RP软件的介绍——软件工程实践第二次个人作业

    关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...

  5. 集大软件工程15级结对编程week1

    集大软件工程15级结对编程week1 0. 团队成员 姓名 学号 博客园首页 码云主页 孙志威 20152112307 Agt Eurekaaa 孙慧君 201521123098 野原泽君 野原泽君 ...

  6. 福州大学软件工程1816 | W班 第10次作业[软件工程实践总结]

    作业链接 个人作业--软件工程实践总结 评分细则 本次由五个问题(每个十分)+创意照片(五分)+附加题(十分)组成 评分统计图 千帆竞发图 汇总成绩排名链接 汇总链接

  7. BUAA软件工程_结对编程

    1.写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...

  8. BUAA_2020_软件工程_结对项目作业

    项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...

  9. 《软件工程实践》第五次作业-WordCount进阶需求 (结对第二次)

    在文章开头给出结对同学的博客链接.本作业博客的链接.你所Fork的同名仓库的Github项目地址 本作业博客链接 github pair c 031602136魏璐炜博客 031602139徐明盛博客 ...

随机推荐

  1. 《剑指offer》内容总结

    (1)剑指Offer——Trie树(字典树) Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是统计和排序大量的字符串(但不仅限于字符串),所以经常 ...

  2. Mysql半同步复制模式说明及配置示例 - 运维小结

    MySQL主从复制包括异步模式.半同步模式.GTID模式以及多源复制模式,默认是异步模式 (如之前详细介绍的mysql主从复制).所谓异步模式指的是MySQL 主服务器上I/O thread 线程将二 ...

  3. Maven教程(2)--Maven的配置,MyEclipse与Eclipse的配置

    1.修改Maven的 repository的路径 2.找到mirrors 使用阿里云镜像 <mirror> <id>alimaven</id> <name&g ...

  4. Hibernate学习(三)———— 一对多映射关系

    序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...

  5. 单机多实例mysq 8.0l部署安装

    单机多实例mysql部署安装 目的需求 在单台虚拟机部署部署多实例mysql,用于配置mysql replication,MHA等. 思路 多实例安装mysql可以参考<源编译MySQL8.0的 ...

  6. ext js 4.0 grid表格根据列值的不同给行设置不同的背景颜色

    Code: Ext.create('Ext.grid.Panel', { ... viewConfig: { getRowClass: function(record) { return record ...

  7. spring cloud config安全

    前面两篇介绍了spring cloud config服务端和客户端的简单配置,本篇介绍如何保护config server及对应config client修改. 保护config server,主要是使 ...

  8. java中的重载(overload)和重写(override)区别

    方法重载(overload): 方法重载就是在一个类中可以创建多个方法,它们具有相同的名字,但是具有不同的参数和不同定义,调用方法时通过传递给他们的不同参数个数和参数列表决定具体使用     哪   ...

  9. C# 字符串拼接性能探索

    本文通过ANTS Memory Profiler工具探索c#中+.string.Concat.string.Format.StringBuilder.Append四种方式进行字符串拼接时的性能. 本文 ...

  10. Mybatis逆向工程生成po、mapper接口、mapper.xml

    Mybatis逆向工程生成po.mapper接口.mapper.xml 一.新建一个maven工程 请查看我的另一篇博客:<使用idea创建一个maven工程> 二.引入所需依赖 需要my ...