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


    结对人员 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

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


    项目链接

    project coding.net链接

    结对编程感受

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

    牛妍辉:结对编程这项作业我们并没有做到最好,由于搭档告诉我之前没怎么用过java写项目,所以在编程一方面工作量没有平衡好,在git上的学习对我来说是一项极大地挑战,我想可能是我的学习方法出现了问题,在使用命令行几乎让我崩溃,最后最后无奈手动录入,但是就是这么不认命,在这一天内决定再次挑战,主保佑我成功,结对上感觉到大家交流不是很多,可能是彼此都比较内向吧,个人觉得如果加强沟通,在算法上我们可能会做的更好,当然,后续算法的实现版本也会不断完善。我的大致思路本来是类似于一个CUI项目,希望有一种交互过程,当然功能目前不全,特色还是比较多的,但估计我们有的有些也有,比如随机数据的随机上并没有写死,用户可根据自己的测试手动输入,在算法自动匹配后,还有相关的平均志愿 匹配度对当前的匹配进行一个评估,但是这些都不是什么特别的特色,我们主要还是一个功能的整合,主界面上已将将其大致分为4部分,这些帮助我们很好的回顾了自己写的代码。希望下次能做到更好,也对队友表示抱歉,感觉没有和他沟通好。
  • 相关阅读:
    Android Button上的文字自动变成大写,如何解决呢?
    如何在IamgeButton上面添加文字
    C语言之实现函数返回一个数组,以及选择排序,还有折半查找。这是同学的一个作业。。。
    解决android:background背景图片被拉伸问题
    service&thread
    MS SQLServer Update语法和实例
    ztree2.6给菜单增加title提示信息[转]
    UltraEdit-14.10.0.1024版本语法着色配置
    linux下c++动态库的生成及使用
    c++动态库与静态库
  • 原文地址:https://www.cnblogs.com/heying/p/5925042.html
Copyright © 2020-2023  润新知