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