zoukankan      html  css  js  c++  java
  • 第二次结对编程作业——毕业导师智能匹配

    结对人员 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部分,这些帮助我们很好的回顾了自己写的代码。希望下次能做到更好,也对队友表示抱歉,感觉没有和他沟通好。
  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/ACE0404/p/5924841.html
Copyright © 2011-2022 走看看