第二次结对编程——毕设导师智能分配

第二次结对编程——毕设导师分配

张建明黄伟炜

问题描述

编码实现一个毕设导师的智能匹配的程序。提供输入包括:30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信息),每个学生有5个导师志愿(志愿的导师可以重复但不能空缺)。实现一个智能自动分配算法,根据输入信息,输出导师和学生间的匹配信息(一个学生只能有一个确认导师,一个导师可以带少于等于其要求的学生数的学生) 及 未被分配到学生的导师 和 未被导师选中的学生。

算法设计

我们结对讨论后,决定选择按照绩点优先及志愿优先的原则进行导师分配。绩点高的学生优先分配导师。并且按照这个学生的志愿进行顺序匹配。

这样可以保证,

  • 学生能够选择到自己的志愿前面的导师
  • 导师能够分配到绩点高的学生

伪码描述:

queue.sort()


for s in queue:
	for t in s.list:
        if t.cur < tea.cap:
            t.cur += 1
            t.list.push(s)
            break;
            

实现

  • 生成导师数据

  • 生成学生数据

  • 从文件导入学生数据

  • 从文件导入导师数据

  • 进行分配

最后的实现效果如下(忽略那个奇怪的图标)

存在问题&改进

在上述的算法实现中,

首先,按照学生的绩点优先和学生志愿优先来选择导师。保证绩点高的学生能够选到心仪的导师。但是在多数学生选择热门导师的时候,就会出现匹配度不高,未分配学生数多的情况。

为了解决这个问题,我们请教了 gy 同学,他提议使用费用流算法来实现毕设导师分配。于是,查阅了资料发现这个算法可以在绩点优先的前提下,达到学生和导师的最大匹配。到发博客为止,针对这个算法,实现了学生和导师之间的最大配,还未考虑绩点优先。还需要后续改进。

因此,我们拥有两个版本:

  • 按照本文算法描述实现的,带有UI的c#版
  • 以及使用最大流实现的python版

后面,会将python版实现的算法移植到cSharp上

总结

结对的过程中,需要对友之间相互磨合。提出自己对问题的理解,通过多次讨论才能把问题解决。每次讨论会对不同看法相互争论,但到最后总能得出解决方法。这就是结对编程的魅力所在吧。

附:代码托管地址,点击这里

posted @ 2016-09-29 22:17  echo1995  阅读(286)  评论(3编辑  收藏  举报