结对人员 031402606 贺翎
031402340 牛妍辉
问题描述
编码实现一个毕设导师的智能匹配的程序。提供输入包括:30个老师(包含带学生数的要求的上限,单个数值,在[0,8]内),100个学生(包含绩点信息),每个学生有5个导师志愿(志愿的导师可以重复但不能空缺)。实现一个智能自动分配算法,根据输入信息,输出导师和学生间的匹配信息(一个学生只能有一个确认导师,一个导师可以带少于等于其要求的学生数的学生)及未被分配到学生的导师 和 未被导师选中的学生。
问题分析
开始前的讨论
1.随机生成多组信息
2.数据的输入方式是TXT还是数据库
3.实现编程语言的选择
4.学生教师智能匹配算法的实现原则
5.智能匹配算法的效果评价
讨论的结果
1.student与teacher中要设置的属性以及命名的规范化,随机生成的信息要贴近现实
2.采用TXT的数据输入方式
3.java语言实现
4.参考稳定婚姻算法
5.引用幸福指数与学生志愿命中率
问题处理流程
算法描述
参考:http://blog.csdn.net/cscmaker/article/details/8291131
我们在这篇博客中获得灵感:
首先学生与导师两个之间的联系为n:n;学生与导师之间的互选要尽量满足他们的喜好;在这里,我们小组规定学生对于导师的喜好是取决于志愿的顺序,而导师对于学生的选择仅仅凭借绩点(其实这里要改进一下,绩点不能代表学生的全部实力),由此,产生互选的两个集合。
以下是实现的步骤:
1.确定志愿轮数
2.遍历一遍学生selected属性,挑出其中未被分配的学生
3.将选择同一导师的学生按照绩点高低排序,截止到教师上限人数的学生即被选中
4.如果导师人数已满,该生绩点要与选择该导师最低绩点的学生(假设学生b)进行比较,如果大于最低绩点,则被选中,b则重置selected属性,重新分配导师。
5.达到循环学生填写的总志愿数,退出循环。
关键代码实现
实现语言java
开发工具 eclipse
主页菜单类 mainMenu
public class mainMenu {
public static void main(String args[]){
String choice=null;
while(true){ //输出主菜单供用户选择
System.out.print("Student&Teacher Match - Main Menu
"
+"================================================================
"
+"1 -current records
"
+"2 -enter the current student teachers' information
"
+"3 -Print result
"
+"Q - Quit
"
+"Your Selection : ");
choice=Tool.input_string().trim();
if("".equals(choice)){
//用户没有任何输入
System.out.print("No selection entered.Press Enter to continue...");
if(Tool.input_string().trim().equals(""))
continue;
}
if("1".equals(choice))
txtRead.test();
else if("2".equals(choice))
stuTeaRandom.random();
else if("3".equals(choice)){
Tool.match.stuTeaReasult();
txtResult.ansTxt();
}
else if("Q".equals(choice)||"q".equals(choice))
//退出程序
break;
else {
//用户输入错误选择
System.out.print("Invalid code! Press Enter to continue...");
if(Tool.input_string().equals(""))
continue;
}
System.out.println("
Press Enter to continue...");
if(Tool.input_string().equals(""))
continue;
}
}
}
在这里输入"1":主要是显示当前TXT文档里在线教师与学生数
输入"2":主要是产生随机相关信息
输入"3":主要是对当前用户进行智能匹配
详情请见流程图
People 类 算法所需的数据结构的类
public class Teacher {
public int id;
public int stu[];
public int numMax;
public int numStu=0;
}
public class Student {
public int id;
public int tea;
public String name;
public double grade;
public boolean selected=false;
public int chooseTea[]=new int [5];
}
随机生成相关用户的信息
public class randomData {
int sum=0;
int num;
Random r1=new Random();
for(int i=0;i<numTea;i++){ //随机生成教师信息
num=r1.nextInt(numMax+1);
while(numStu-numSum-num>numMax*(numTea-i-1))
num=r1.nextInt(num_max+1);
teachers[i].numMax=num;
numSum+=num;
}
for(int i=0;i<numStu;i++){ //随即生成学生信息
students[i].grade=r1.nextFloat()*3+1.5; //随机生成绩点在1.5-4.5之间
for(int j=0;j<5;j++)
students[i].chooseTeacher[j]=r1.nextInt(numTea)+1;
}
}
这里首先输入老师的数量与学生的数量,然后采用此randomData()生成教师的职工号,教师所定的学生上限人数;生成学生的学号,所选志愿,与绩点
distribution 方法类
//稳定婚姻法改
public void Distribution(){
int nowR;
int min=0;
double minG;
int minId=0;
int tmpStuId;
int circulation=0;
for(circulation=0;circulation<5;circulation++){
for(int i=0;i<numStu;i++){
if(students[i].selected==false){ //未被导师选中的学生
nowR=students[i].chooseTeacher[circulation]-1;
if(teachers[nowR].numStu<teachers[nowR].numMax){ //导师限制人数未满
teachers[nowR].stu[teachers[nowR].numStu++]=students[i].id;
students[i].tea=teachers[nowR].id;
students[i].selected=true;
}
else { //导师限制人数已满
minG=5;
for(int k=0;k<teachers[nowR].numStu;k++){
tmpStuId=teachers[nowR].stu[k]-1;
if(students[tmpStuId].grade<minG){
minG=students[tmpStuId].grade;
min=tmpStuId;
minId=k;
}
}
if(minG<students[i].grade){
students[min].selected=false;
students[i].selected=true;
students[i].tea=teachers[nowR].id;
teachers[nowR].stu[minId]=students[i].id;
}
}
}
}
}
}
运行结果
Student&Teacher Match - Main Menu
================================================================
1 -current records
2 -enter the current student teachers' information
3 -Print result
Q - Quit
Your Selection : 1
num of teacher:30
num of student:100
Press Enter to continue...
enter 2
enter 3
算法效率评估
测试数据第一组 30:100
测试数据第二组 300:1000
测试数据第三组 3000:10000
改良后的稳定婚姻算法,测试数据越大,平均志愿数越高,但是相对而言,我们的匹配度有所下滑,考虑到我们算法的实现,缺少导师热度,在一定程度上给予冷门导师和底绩点学生的人文关怀不够高,在此后我们会对此进行改良,尽快完善我们的算法。
项目链接
结对编程感受
贺翎 :编程作业对我来说是个挺大的挑战,因为之前没做过项目开发之类的,所以都是边做边学,大部分的工作都是队友动手的,我在旁边观看,感觉在一定程度上拖了队友后腿,才使作业这么晚完成。还有git在之前没学好怎么使用,使得两人在在最后要提交阶段有点不知所措。之后的作业一定要提前下好功夫,尽快学习好项目开发的基本东西。
牛妍辉:结对编程这项作业我们并没有做到最好,由于搭档告诉我之前没怎么用过java写项目,所以在编程一方面工作量没有平衡好,在git上的学习对我来说是一项极大地挑战,我想可能是我的学习方法出现了问题,在使用命令行几乎让我崩溃,最后最后无奈手动录入,但是就是这么不认命,在这一天内决定再次挑战,主保佑我成功,结对上感觉到大家交流不是很多,可能是彼此都比较内向吧,个人觉得如果加强沟通,在算法上我们可能会做的更好,当然,后续算法的实现版本也会不断完善。我的大致思路本来是类似于一个CUI项目,希望有一种交互过程,当然功能目前不全,特色还是比较多的,但估计我们有的有些也有,比如随机数据的随机上并没有写死,用户可根据自己的测试手动输入,在算法自动匹配后,还有相关的平均志愿 匹配度对当前的匹配进行一个评估,但是这些都不是什么特别的特色,我们主要还是一个功能的整合,主界面上已将将其大致分为4部分,这些帮助我们很好的回顾了自己写的代码。希望下次能做到更好,也对队友表示抱歉,感觉没有和他沟通好。