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

作业链接 作业链接

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级...

数据建模

885613-20171016232811943-1058186532.png

匹配程序

首先,在现实生活中,学生填报社团时都是因为感兴趣而自愿申请的,几乎不存在乱报的情况。因此,在匹配时应当尽可能的为申请人匹配到其想参加的社团,而至于他没有填报的一定是存在某种原因。所以本着宁缺毋滥的原则,我们应该在公平竞争的基础上尽可能迎合学生意愿。因此我们将学生的申请志愿投递到对应部门名下,而部门将对其进行筛选,择优录取
站在部门的视角,自然是希望所接纳的部员都是所有申请人中最好的一批,同时部门组织的活动自然是参加得越频繁越好。因此,部门在进行筛选时所采用的标准是,一定权值的空闲时间段匹配度+一定权值的兴趣标签匹配度,选择所有申请人中权重最高的前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 fields
    firstAppID 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
### 回答1: Sailfin Voron是一种热带淡水鱼类,也被称为天使鱼科中的“天使鱼”。它是一种美丽的鱼类,拥有华丽而多彩的外观,是鱼缸中的宠物之一。 Sailfin Voron是鱼缸爱好者中受欢迎的一种鱼类,因为它具有非常迷人的外观。它的身体侧扁,呈纺锤形,背鳍和尾鳍非常长而尖,像帆一样,因此得名“Sailfin Voron”。它的鳞片呈亮丽的金色,闪闪发光,让它成为鱼缸中的一道亮丽风景线。 Sailfin Voron主要生活在热带地区的淡水湖泊和河流中,它们喜欢水温较暖的环境。它们是杂食性动物,食物包括浮游生物、小型昆虫和水中植物。在鱼缸中,我们需要提供适合它们生活的环境,包括适宜的温度、水质和养分等。同时,Sailfin Voron也需要适当的空间来游动和活动,以保持它们的健康和快乐。 尽管Sailfin Voron是一种美丽的鱼类,但它们并不是最容易饲养的品种之一。它们对水质的要求较高,如果不注意水质的控制,可能会导致它们生病甚至死亡。另外,Sailfin Voron也需要一定的社交空间,一般建议将它们放在与其它和平相处的品种一起养殖。 总之,Sailfin Voron是一种美丽而迷人的鱼类,适合鱼缸爱好者饲养。尽管它们的饲养较为复杂,但只要我们提供适宜的环境和饲养条件,它们能够成为我们家中的迷人宠物。 ### 回答2: Sailfin Voron是一种来自非洲和亚洲的淡水鱼类,属于腔棘鱼科。它的特点是其宽大而鲜艳的背鳍,这是栖息在流动水域中的鱼类中比较罕见的特征。这种鱼的背鳍通常呈现出明亮的蓝色或绿色,具有优美的形状,因此得名“Sailfin Voron”。 Sailfin Voron的体形通常较为修长,侧扁且稍高,身体呈橢圆形。它的头部相对较小,口部较窄,适合捕食浮游生物和小型无脊椎动物。Sailfin Voron在水中游动灵活,非常迅捷,常常成群结队生活。它们寿命较长,通常可活到5-8年。 在水族馆中,Sailfin Voron是淡水鱼爱好者们非常喜欢的观赏鱼之一。它们的鲜艳背鳍和独特体形使其成为水族馆中的明星。作为观赏鱼,它们通常需要一定的鱼缸空间,以便能够自由游动及展示其美丽的背鳍。 在自然界中,Sailfin Voron主要栖息于淡水河流,湖泊和池塘等水体中。它们是杂食性鱼类,以浮游生物,植物碎屑和小型无脊椎动物为主要食物来源。在繁殖季节,雄性Sailfin Voron会展示出美丽的背鳍以吸引雌性。雌性一般会在水生植物中产卵,并由雄性受精。 尽管Sailfin Voron在野外的种群数量相对稳定,但是由于人类的过度捕捞以及水体污染等原因,它们的栖息地受到了一定程度的丧失和破坏。因此,保护Sailfin Voron和其栖息地的生态环境变得至关重要。只有通过合理科学的管理和保护措施,我们才能保护这些美丽的鱼类,同时也保护整个生物多样性。 ### 回答3: "Sailfin Voron" 是一种鱼类,属于海鲈科(Scientific name: Costa voron)。 Sailfin Voron 鱼体侧扁,背部呈蓝灰色,腹部为银白色。它们的特征之一是背鳍和臀鳍非常宽大,像帆一样般展开,因此得名“Sailfin”。体长大约在10-15厘米左右。这种鱼类主要栖息在沿岸水域,如河流和河口。它们喜欢在水下潜藏在水草或者水下的洞穴中。 Sailfin Voron 鱼类是杂食性动物,主要以浮游生物、小型底栖无脊椎动物和植物为食。它们是群居性鱼类,常常成群结队活动。在繁殖季节,雄性鱼会变得更加鮮艳,以吸引雌性进行求偶。它们一般在水底崖壁或者岩石缝隙中产卵,卵孵化后雄性会负责守卫卵和幼鱼。 由于其独特的外观和行为习性,Sailfin Voron 鱼类受到了一些水族爱好者的喜爱。在一些水族馆中,你也可以看到这种鱼类。在养殖鱼类中,它们不需要过多特别的照顾,适合于养在较大的水族箱中。当然,对于购买和养殖这种鱼类,了解其适宜的水质和饲养方法是至关重要的。 总之,Sailfin Voron 是一种漂亮且有趣的鱼类,它们以其宽大的鳍以及独特的行为在水中展示出魅力,无论在自然环境还是在水族箱中都是令人赏心悦目的存在。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值