結對程式設計人員
031402418汪培僑
031402618林宇晨
編碼實現乙個畢設導師的智慧型匹配的程式。提供輸入包括:30個老師(包含帶學生數的要求的上限,單個數值,在[0,8]內),100個學生(包含績點資訊),每個學生有5個導師志願(志願的導師可以重複但不能空缺)。實現乙個智慧型自動分配演算法,根據輸入資訊,輸出導師和學生間的匹配資訊(乙個學生只能有乙個確認導師,乙個導師可以帶少於等於其要求的學生數的學生)及 未被分配到學生的導師 和 未被導師選中的學生。
經過商討後得出以下問題:經過一番系列性的討論,以及兩次攥寫的經過,可以得出我們小組的答案 接下來將我們實現的演算法進行解釋說明。
為了更好的貼切現實生活中,學生選擇老師的情況,我們對隨機的生成資料進行了一定的約束,以便於後續的模擬。
教師大體可以分為這三類:
熱門老師我們的模擬資料生成器中,就選擇了6個熱門老師,14個普通熱門老師,10個普通老師普通老師
冷門老師
以上為對應單個老師的被學生選中的概率分析圖。
我們將學生選擇志願的老師的程度用上圖描述。
教師資料生成
for(i=0;i=0 && i <=9) fprintf(fpwrite,"tea00%d\n", i);
else if(i>9) fprintf(fpwrite,"tea0%d\n", i);
fprintf(fpwrite,"%d\n",rand()%8+1);
}
學生資料生成
for(j=0;j0&&j<=9) fprintf(fpwrite,"stu00%d\n",j);
else if(j>9) fprintf(fpwrite,"stu0%d\n",j);
double jidian;
jidian = ( rand()%101 ) /25.0 + 1;
fprintf(fpwrite,"%.1lf\n",jidian); //績點
/*模擬對應志願的選擇,每個志願的對應的老師的概率不同*/
for (i=0; i<5; i++)
else if(number>=100)
if(number>=0 && number <=9) fprintf(fpwrite,"tea00%d\n", number);
else if(number>9) fprintf(fpwrite,"tea0%d\n", number);}}
實現**可參見
裡面的rand_1.cpp績點權重
基點權重的計算:分為4個階級用以下圖表示
上圖為各個階級段的績點所佔權重,該值為多次實驗反覆修改後得到的值,
設分權重為q1,則
$$q1=績點*上述對應的績點權重
$$對應**
int jdqz(double jidian)//計算績點權重
;
教師權重
教師權重表示的是xx學生的xx老師的喜愛程度
每乙個志願的老師對應權重
如果選擇多個志願選擇同樣的老師,那就以第乙個志願的權重為基準,加上後續選擇的同樣老師的志願權重/5,此番設計也是通過多次實驗,反覆修改得到
設分權重(學生對xx老師)為q2
$$q2=第乙個出現該老師的權重+後續出現老師的權重/5
$$總權重
設總權重為q(stuxx,teaxx),以及上述的績點權重q1,教師權重q2,可以得到某某學生對某某老師的總權重:
$$q(stuxx,teaxx)=q1*q2
$$後續將會以這個權重q會平衡點以及老師所需要的學生人數為基準去實現分配
第一次演算法模擬:
流程圖如下
總結上述演算法在實驗中遇到的問題:
在模擬一般選志願的時候還比較ok,就是選中30個老師,每個老師的概率都是一樣的,後面換了測試資料後,發現這個演算法會導致還有10多個學生沒有中選老師,顯然這是不可接受的。於是我們又找了第二個演算法進行了嘗試。第二次演算法模擬
在請教了同學之後,得到了乙個偶然的演算法,最小費用最大流(mcmf)演算法!!!
下面介紹該演算法
演算法介紹:
在乙個網路中每段路徑都有「容量」和「費用」兩個限制的條件下,此類問題的研究試圖尋找出:流量從a到b,如何選擇路徑、分配經過路徑的流量,可以達到所用的費用最小的要求。如n輛卡車要運送物品,從a地到b地。由於每條路段都有不同的路費要繳納,每條路能容納的車的數量有限制,最小費用最大流問題指如何分配卡車的出發路徑可以達到費用最低,物品又能全部送到。模擬一下我們的題目: 如圖所示:
這裡的起點終點,與卡車題中的起點和終點一樣,學生點和老師點就相當於走過的路徑,最終就是為了,優先實現最大流基本上的路徑都能經過(盡量讓每個學生都能選上老師),然後在讓費用最小(通過對映即讓權重大的盡量走過)**如下:模擬效果也比我們第乙個演算法有了很大的進步。
struct mcmf//最小費用最大流 }}
}if(d[t]==inf) return false;
flow+=a[t];
cost+=d[t]*a[t];
int u=t;
while(u!=s)
return true;
}int run(int s,int t)//執行
void printplan(int l,int r)//輸出方案
};
031402418汪培僑
:
我覺得把結對,最重要的就是能讓你寫**的時候更專注,而且互相分析問題會更加的全面,畢竟兩個腦子,互相補充。這次的作業相比上一次應該是要難很多,但期間的收穫還是蠻大的,比如第一次的演算法就因為處理資料不夠強,就被我們淘汰了,最終還是找到了乙個mcmf演算法,多虧同學幫忙。這次我要給我的隊友滿分,在我還在糾結要不要換算法增加工作量時,最終還是選擇了換算法。繼續加油。
031402618林宇晨
覺得這次結對的任務量比上次小了一些,但是覺得交流上的難度變大了,在討論演算法的時候兩個人發生了較大的分歧,兩人溝通不好,沒有很好的表達出自己的意思,結果導致第一次採用的方法在引入6個導師後出現了較大問題,後來連夜修改了演算法,用我的話說就是「命都沒了半條」。關於git的使用方面,因為採用的是結對程式設計的方式,使用較少。最後總結下這次的作業,個人認為最突出的問題有兩個,第一是交流較失敗導致進度被拖下,第二點是設計演算法的時候烤爐的不夠周全導致實現的時候出現了種種問題。閃光點:
1、能夠根據實際的情況去模擬資料的生成
2、大砍一刀換算法的勇氣
建議分享:講道理,上面大砍一刀的情況其實我們並不想看到,所以我覺得在做這個之前,還是去瀏覽一些相關的**,以便於增多自己的可選擇的方法,讓自己的肚子更有墨水。
詳情請戳這裡,請看裡面的readme 第二次結對程式設計作業 畢設導師智慧型匹配
031402337 胡心穎 031402341 王婷婷 編碼實現乙個畢設導師的智慧型匹配的程式。提供輸入包括 30個老師 包含帶學生數的要求的上限,單個數值,在 0,8 內 100個學生 包含績點資訊 每個學生有5個導師志願 志願的導師可以重複但不能空缺 實現乙個智慧型自動分配演算法,根據輸入資訊,...
第二次結對程式設計 畢設導師智慧型分配
張建明 黃偉煒 編碼實現乙個畢設導師的智慧型匹配的程式。提供輸入包括 30個老師 包含帶學生數的要求的上限,單個數值,在 0,8 內 100個學生 包含績點資訊 每個學生有5個導師志願 志願的導師可以重複但不能空缺 實現乙個智慧型自動分配演算法,根據輸入資訊,輸出導師和學生間的匹配資訊 乙個學生只能...
第二次結對程式設計作業
組員部落格鏈結 本作業部落格鏈結 github倉庫 共同解決互動 api 部落格 psp2.1 personal softwareprocess stages 預估耗時 分鐘 實際耗時 分鐘 planning 計畫200 250 estimate 估計這個任務需要多少時間 250300 develo...