第二次结对编程——毕设导师智能分配
第二次结对编程——毕设导师分配
张建明
、黄伟炜
问题描述
编码实现一个毕设导师的智能匹配的程序。提供输入包括: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上
总结
结对的过程中,需要对友之间相互磨合。提出自己对问题的理解,通过多次讨论才能把问题解决。每次讨论会对不同看法相互争论,但到最后总能得出解决方法。这就是结对编程的魅力所在吧。