作业链接

031502333

GITHUB LINK


前言

近期比较倾向于使用Go语言写小工具,所以在看到作业不限制编程语言时就决定使用Go作为开发语言。而由于Go的诸多优秀特性,使得编写代码效率极高,所以在此安利一波!

数据生成

  • 一组测试数据

数据生成部分在构思时就偏向于随机化,虽然学生的兴趣、空闲时间可能存在着某种规律,但总会有大量噪点的存在,于是我就大胆地认为随机化的数据并不比定制数据差,并以此为基础构思整个数据生成程序。

初始化:

  • 学号基数
    随机生成基数作为学号的起始编号
  • 标签池
    初始化标签,方便之后进行随机化生成
  • 时间生成函数
    返回在一周7天内的(6.am-9.pm)的时间跨度小于4的随机时段

学生:

  • 学号
    根据初始化时生成的学号为基数,进行累加生成新的学号
  • 兴趣标签
    生成随机数n(n<5),随机抽取n+2个不重复标签,作为其兴趣标签
  • 空闲时间
    调用时间生成函数,生成任意[2,10)个不重复的空闲时间段
  • 申请部门
    在已生成的部门中进行随机挑选[1,5]个不重复志愿

部门:

  • 编号
    按照生成个数顺序生成,如D001,D002,...
  • 纳新上限
    随机取值范围在[1,5]之间
  • 特色标签
    与学生的兴趣标签生成方法相同
  • 活动时间
    与学生的空闲时间生成方法相同

总的来说就是一句话——“开局一种子,数据全靠猜 ,一刀999级...

数据建模

匹配程序

首先,在现实生活中,学生填报社团时都是因为感兴趣而自愿申请的,几乎不存在乱报的情况。因此,在匹配时应当尽可能的为申请人匹配到其想参加的社团,而至于他没有填报的一定是存在某种原因。所以本着宁缺毋滥的原则,我们应该在公平竞争的基础上尽可能迎合学生意愿。因此我们将学生的申请志愿投递到对应部门名下,而部门将对其进行筛选,择优录取
站在部门的视角,自然是希望所接纳的部员都是所有申请人中最好的一批,同时部门组织的活动自然是参加得越频繁越好。因此,部门在进行筛选时所采用的标准是,一定权值的空闲时间段匹配度+一定权值的兴趣标签匹配度,选择所有申请人中权重最高的前n个接纳为新部员。
于是问题就变成了高考志愿填报的问题,区别在于学生一方可以选择多个部门,也就是Gale-Shapley的延迟接受算法(Deferred acceptance algorithm)的修改版。

算法流程:
注:每个学生都有一个申请队列
循环遍历每个学生直到所有人的队列都清空为止

1.取出在队首的申请,将申请投递至对应部门,若无申请则跳过
2.申请的对应部门执行淘汰算法,来决定是否接纳该生

部门的淘汰算法如下

1.若人数不超过限制,则接纳
2.超过则计算新生的权值,与当前最小权值比较
3.若大于当前最小权值,则置换新生与该最小权值学生,否则不做操作

其中权值计算函数如下

1.将两个时间段进行交叉匹配,得出公共的时间段个数h
2.将两个标签组进行交叉匹配,得出公共的标签个数g
3.返回 2h+1g //这个比例因子是经过多次实验得来

代码规范

blog-gofmt
使用Go编程还有一大特点就是,官方已经帮我们制定好了代码规范,使用gofmt工具就可以规范化代码,十分有利于快速开发,同时开发者只需要闷头专注于功能实现即可。

type student struct {UniqueID   string   `json:"student_no"`FreeTime   []string `json:"free_time"`Tags       []string `json:"tags"`Applicants []string `json:"applications_department"`// unexported fieldsfirstAppID int
}

结果评估

中选学生的满意度 = 中选部门/申请数量 = 45.39%
社团纳新程度 = 中选人数/部门纳新限制 = 100%
中选率 = 中选人数/总人数 = 17%

上述结果说明,所有部门的需求都得到了最大最优匹配,而对于学生来说,若中选,他所选的部门一定是提交的申请中的一个,而未中选则是因为在投递的部门中有人比他更符合部门的要求。
其实对于这个结果来说,个人还是不大满意的,因为中选率有点太低了,究其原因或许是因为随机生成算法还是不大符合题意吧。

结对感受&闪光点

写到这里有一点遗憾,并没能体验到软工结对编程的感觉,好在最近自己在课余的时间里有幸地体验到了(或者说是体验中)。结对编程最大的感触就是,需要和对友交流协商,因为很可能两个人的开发风格不一样,甚至开发的语言都不一样,这时候好的协商起到很大作用,两个人一起聊出一个最能接受的方案,然后顺着方案开发进入下一个阶段,negotiate,code,repeat....
闪光点或许就是别人都有对友,而我是solo buff加成吧/捂脸哭。

参考文献

Gale–Shapley algorithm
稳定婚姻问题

转载于:https://www.cnblogs.com/tr3e/p/se-practice-2017_job-3-Xmatch.html

软件工程实践2017 结队项目——第二次作业相关推荐

  1. 软件工程实践2017第二次作业-----个人项目实战之数独

    软件工程实践2017第二次作业-----个人项目实战之数独 最后一门考试2017.9.16 github地址:https://github.com/ssuo/shudu 题目地址:http://www ...

  2. 软件工程实践2017第二次作业

    软件工程实践2017第二次作业 1)Github地址 https://github.com/Maple27/sudoku 2)解题思路 个人从小就对数独就很喜欢,对解数独有一定程度的了解,这次自己开发 ...

  3. 软件工程实践 2017 第一次作业

    砥砺前行 软件工程实践 2017 第一次作业 今年又重拾 cnblogs,上一次也是张栋老师教的面向对象程序设计,在我所经历过的教学方式中,这样的可以说是较为独特的--强烈的实践和理论相结合的模式,鼓 ...

  4. 17秋 软件工程 结对项目 第二次作业

    作业地址 结对第二次作业 结对成员 陈翔, 031502209; 李鸣, 031502316. Github Deputy: Department-to-Student bidirectional s ...

  5. 软件工程实践2017第一次结对作业

    结队项目--第一次作业 1. 结对成员: 031502614 赖志平 031502627 王国华 2.NABCD N (Need, 需求) 首先,提出的需求如下: 要解决的困扰:流程繁琐复杂,各个部门 ...

  6. 软件工程实践2017结对第二次作业

    结对成员:吴君毅(031502629),吴伟根(031502631) Github链接:https://github.com/n9705/Dep-Stu 一. 题目要求 构造部门和学生输入数据的生成程 ...

  7. 软件工程实践2017结对作业

    1.结对成员 031502643 朱晓健 031502626 孙浩楷 2.需求分析 Need 每到开学的时候,各大部门就会挤满青春广场通过各种方式来招收新成员.新生顶着烈日填写完申请表交由部门筛选,部 ...

  8. 软件工程实践2017第一次作业

    (1)回想一下你初入大学时对计算机专业的畅想 当初你是如何做出选择计算机专业的决定的? 高考之后,综合分数.地理位置.专业考虑,搭上了福州大学这趟动车,不过选报的专业给我打了个折,意外的在生工完成了一 ...

  9. 软件工程实践2017第一次作业-051502125

    (1)回想一下你初入大学时对计算机专业的畅想 答1:当初没选计算机,选了土木,大一下转专业过来的. 2:不太符合.当初想到的都是计算机的一些应用与科技,但前两年学的都是一些原理,虽然那是必须的,但还是 ...

最新文章

  1. react 组件的属性
  2. oracle显性游标,Oracle高级显式游标的使用
  3. 记录kafka踩坑:marking the coordinator (id rack null) dead for group
  4. 【lua学习】6.函数,闭包,错误处理
  5. php strus2 漏洞攻击_关于对部分重要漏洞进行安全加固的预警通报
  6. C#根据身份证获出生日期和性别---含C#代码
  7. SQLServer 语句相关
  8. 超级计算机的水冷散热,1U服务器集成16颗AMD 64核心霄龙:全水冷散热
  9. 【转】crc16几种标准校验算法及c语言代码
  10. Android 组件的四种点击事件写法
  11. matlab常用函数
  12. Centos 8 Linux 安装 微信(WeChat)
  13. kubernetes(k8s):使用statefulset部署mysql主从集群
  14. 程序员新电脑装机软件
  15. 注册表关闭计算机默认共享,4种方法教你彻底关闭WINDOWS默认共享
  16. Scrum立会报告+燃尽图(十月二十八日总第十九次)
  17. 移除元素---2022/03/16
  18. 如何使用 you-get 下载视频
  19. python3d_Power BI将超越python和D3,成为数据可视化的福音、定性数据分析的未来?...
  20. Windows API 函数SendMessage与PostMessage使用方法和常见的坑

热门文章

  1. Fork 一个仓库并同步
  2. OAuth2.0 基础概述
  3. 第拾壹章學習 Lisp 3rd Edition, Winston Horn
  4. [文章存档]Kudu 的 Debug Console 窗口如何查看更多文件
  5. Oracle.ManagedDataAccess.dll 连接Oracle数据库不需要安装客户端
  6. 【转】Android APK反编译就这么简单 详解(附图)
  7. Qt Designer下的一些基础操作
  8. RecyclerView显示加载多种布局的原理
  9. Eclipse主题更换方法
  10. 汽车自动泊车APA简介