天天看點

第二次結對程式設計作業——畢業導師智能比對

結對人員

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部分,這些幫助我們很好的回顧了自己寫的代碼。希望下次能做到更好,也對隊友表示抱歉,感覺沒有和他溝通好。