第二次结对编程作业——毕业导师智能匹配

结对人员 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\n"
					+"================================================================\n"
					+"1 -current records\n"
					+"2 -enter the current student teachers' information\n"
					+"3 -Print result\n\n"
					+"Q - Quit\n\n"
					+"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("\n\nPress 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

改良后的稳定婚姻算法,测试数据越大,平均志愿数越高,但是相对而言,我们的匹配度有所下滑,考虑到我们算法的实现,缺少导师热度,在一定程度上给予冷门导师和底绩点学生的人文关怀不够高,在此后我们会对此进行改良,尽快完善我们的算法。


项目链接

project coding.net链接

结对编程感受

贺翎 :编程作业对我来说是个挺大的挑战,因为之前没做过项目开发之类的,所以都是边做边学,大部分的工作都是队友动手的,我在旁边观看,感觉在一定程度上拖了队友后腿,才使作业这么晚完成。还有git在之前没学好怎么使用,使得两人在在最后要提交阶段有点不知所措。之后的作业一定要提前下好功夫,尽快学习好项目开发的基本东西。

牛妍辉:结对编程这项作业我们并没有做到最好,由于搭档告诉我之前没怎么用过java写项目,所以在编程一方面工作量没有平衡好,在git上的学习对我来说是一项极大地挑战,我想可能是我的学习方法出现了问题,在使用命令行几乎让我崩溃,最后最后无奈手动录入,但是就是这么不认命,在这一天内决定再次挑战,主保佑我成功,结对上感觉到大家交流不是很多,可能是彼此都比较内向吧,个人觉得如果加强沟通,在算法上我们可能会做的更好,当然,后续算法的实现版本也会不断完善。我的大致思路本来是类似于一个CUI项目,希望有一种交互过程,当然功能目前不全,特色还是比较多的,但估计我们有的有些也有,比如随机数据的随机上并没有写死,用户可根据自己的测试手动输入,在算法自动匹配后,还有相关的平均志愿 匹配度对当前的匹配进行一个评估,但是这些都不是什么特别的特色,我们主要还是一个功能的整合,主界面上已将将其大致分为4部分,这些帮助我们很好的回顾了自己写的代码。希望下次能做到更好,也对队友表示抱歉,感觉没有和他沟通好。
posted @ 2016-09-30 20:27  BenedictN  阅读(272)  评论(3编辑  收藏  举报
Demo
abc
returnTop