天天看點

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

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

031402337 胡心穎

031402341 王婷婷

作業概述

編碼實作一個畢設導師的智能比對的程式。

提供輸入包括:30個老師(包含帶學生數的要求的上限,單個數值,在[0,8]内),100個學生(包含績點資訊),每個學生有5個導師志願(志願的導師可以重複但不能空缺)。

實作一個智能自動配置設定算法,根據輸入資訊,輸出導師和學生間的比對資訊(一個學生隻能有一個确認導師,一個導師可以帶少于等于其要求的學生數的學生) 及 未被配置設定到學生的導師 和 未被導師選中的學生。

作業要求

  • 輸入的資料,另外寫生成程式随機實作。
  • 為輸入輸出設計标準化、通用化、可擴充的接口,為該智能比對程式子產品後期可能的整合入系統提供便利。
  • 輸入輸出的格式,如采用文本檔案或資料庫的方式輸入,可自由讨論确定,但需要明确,為後期可能的整合入系統提供便利。
  • 需要為智能比對算法确立幾條配置設定或排序原則,比如 績點優先、或其他、或其他等等,請你們結對讨論确定。
  • 算法評價的目标是:對于同一組輸入,輸出的未被導師選中的學生數越少越好。
  • 代碼具有規範性。
  • 實作的程式語言不做限制性要求。
  • 代碼送出在https://coding.net 上。
  • 兩個人共同撰寫一個部落格,包含上述内容的描述,同時包含結對感受,以及兩個人對彼此結對中的閃光點或建議的分享。

作業分析

算法思想為采用 貪心思想 ;

簡單來說,首先将學生按照績點從高到低排序,優先配置設定績點高的學生;

然後針對每個學生,首先過濾掉其重複選擇的導師,然後按照權重值 teacher[i].qz (後面介紹)高低來配置設定導師,權重值相同的情況下按照學生志願排序;

teacher[i]表編号為i的導師,teacher[i].left表示該導師剩餘學生數,teacher[i].want表示選擇了該導師的學生總數,teacher[i].qz表示teacher[i]導師對于該學生的權重值(在本算法中可認為是比對程度,越大越比對)

teacher[i].qz =teacher[i].left/teacher[i].want

對于每個學生的五個志願導師,都計算出其對應的權重值,按照權重值高的配置設定,如果有多個權重值相同,那麼則按照志願順序配置設定;

從權重值計算公式可以看出,teacher[i].left越大,teacher[i].want越少,代表導師剩餘數越多和導師越冷門來配置設定,在符合學生志願的情況下,使得大多數學生都能配置設定到導師;

權重值相同時按照志願順序來配置設定,使得學生都能選擇到自己較喜愛的導師

流程圖

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

代碼分析

基本資料結構

struct Student // 學生結構體
{
	int num;//學生編号
	double grade;//學生績點
	bool flag;//是否配置設定了導師
	int tea[10];//志願
}stu[110];
struct Teacher //老師結構體
{
	int num;//導師編号
	double need;//可以接受的學生數
	double left;//還剩下的名額
	double want;//被幾個學生選擇
	double qz;//權重,qz=left/need
	bool flag;//是否有學生
	vector<int> stu;//接受的學生
}teacher[50];···
           

産生随機資料

srand(time(0));
	for(int i=0;i<30;i++)//導師随機資料
	{
		int want;
		want=rand()%9;
		fprintf(f,"%d %d\n",i,want);
	}
	for(int i=0;i<100;i++)//學生随機資料
	{
		int g=rand()%500;
		if(g<=100)g+=100;
		double grade=(double)g/100.0;
		fprintf(f,"%d %lf %d %d %d %d %d\n",i,grade,rand()%30,rand()%30,rand()%30,rand()%30,rand()%30);
	}
           

使用srand()函數創造随機數;

導師随機生成想要的學生個數,将随機數模9,使得資料範圍在 0-8 之間;

學生随機生成績點以及想要的導師編号,績點控制在1-5之間,導師編号在0-29之間

權重值teacher[i].qz

for(int i=0;i<30;i++)//計算導師權重
	{
		teacher[i].left=teacher[i].need;
		if(teacher[i].want==0)teacher[i].qz=-1;
		else teacher[i].qz=teacher[i].left/teacher[i].want;
	}
           

teacher[i]表編号為i的導師,teacher[i].left表示該導師剩餘學生數,teacher[i].want表示選擇了該導師的學生總數;

如果導師想要的學生數為0 ,則直接将teacher[i].qz(權重值)設為-1,

否則權重值teacher[i].qz=teacher[i].left/teacher[i].want

績點排序函數

bool cmp(Student a,Student b)//學生按照績點的高到低排序
{
	return a.grade>b.grade;
}
           
将學生按照績點的高到低排序

導師配置設定函數

sort(stu,stu+100,cmp);//學生排序
	for(int i=0;i<100;i++)
	{
		double now;
		int ans;
		now=0;
		ans=-1;
		for(int j=0;j<5;j++)
		{
			if(now<teacher[stu[i].tea[j]].qz)/到志願導師中權重最高的導師
			{
				now=teacher[stu[i].tea[j]].qz;
				ans=stu[i].tea[j];
			}
		}
		if(ans==-1)continue;//如果找不到符合要求的導師就下一個
		teacher[ans].stu.push_back(i);//修改導師的剩餘名額以及其他資訊
		teacher[ans].left--;
		teacher[ans].want--;
		teacher[ans].qz=teacher[ans].left/teacher[ans].want;
		if(teacher[ans].flag==0)
		{
			countt--;
			teacher[ans].flag=1;
		}
		stu[i].flag=1;//修改學生的資訊
		counts--;
	}
           
先将學生按照績點初步排序,在通過權重值和志願順序來配置設定

程式運作結果

生成随機資料樣例

導師編号從0至29,後面緊跟導師想要的學生數從0到8

學生編号從0至99,後面緊跟其績點 從1.00到5.00,再接着就是五個志願導師

https://coding.net/u/songyufeng/p/DSFPXT/git/blob/master/data.txt

比對結果樣例

經過比對之後的結果:

首先輸出沒有比對的導師以及沒有比對的學生,

緊接着按照導師序号來輸出每個導師的比對學生情況

https://coding.net/u/songyufeng/p/DSFPXT/git/blob/master/ans.txt

算法效率評估、閃光點、改進方向

效率評估

  • 以下是10次随機試驗的學生配置設定情況結果
    第二次結對程式設計作業——畢設導師智能比對
  • 從圖表中資料來看幾乎所有學生都能夠配置設定到導師,近乎完美,不得不感歎過貪心算法真的超級棒啊!
  • 那麼學生的志願情況呢,是每個學生都能配置設定到其志願靠前的導師?
  • 以下是10次随機試驗的學生志願平均情況(隻計算了有被配置設定到的學生)
    第二次結對程式設計作業——畢設導師智能比對
  • 從圖表中可以看出 第一志願人數>第二志願>第四志願>第三志願>第五志願
  • 根據我們先前的優先配置設定績點高的同學的思想,想必績點高的同學所配置設定的志願自然是比較靠前的,下面我們也驗證一下這一點
  • 按照績點段來檢視志願情況
  • 由于績點是随機生成的,是以各個績點段的人數相同(這也是我們考慮不周到、比較不科學的地方,因為現實生活中績點不可能平均配置設定)
  • 績點為 [4.00 - 5.00 )的績點大神
    第二次結對程式設計作業——畢設導師智能比對
  • 績點為 [3.00 - 4.00 )的學霸
    第二次結對程式設計作業——畢設導師智能比對
  • 績點為 [2.00 - 3.00 )的僞學霸
    第二次結對程式設計作業——畢設導師智能比對
  • 績點為 [1.00 - 2.00 )的學渣吧
    第二次結對程式設計作業——畢設導師智能比對
  • 圖示完美驗證了按照績點優先配置設定的情況

閃光點

  • 算法的思想 - 貪心思想
  • 對于某個學生重複選擇某位導師的情況,系統能夠過濾掉
  • 能夠保證 最廣大學生 配置設定到自己志願的導師的情況,又可滿足 績點高者優先配置設定 以及盡可能 配置設定志願靠前的導師 !

改進方向

  • 學生績點生成得不夠合理,不夠滿足現實情況,影響了後面的志願情況分析

作業感想

  • 宋禦風:結對程式設計比一個人程式設計感覺更加集中,在第二次結對程式設計作業,構思配置設定算法的時候,一個人很容易導緻思維僵化,兩個人探讨,聽取對方的意見,效率會快很多。一個人程式設計經常完成一個子產品的内容就想休息,兩個人在一起會強迫自己做下去。而且如果兩個人的思維和知識面互補的話,對項目各方面的完善都很有助益。
  • wangtingting007:結對程式設計有助于克服拖延症,擺脫懶癌患者的毛病,同時結對過程能夠與隊友好好溝通、交流想法等,真的是一件很棒的事!然後結對過程能夠結合兩個人的特長和不足合理分工、提高作業效率和品質!隊友代碼能力好強!!!!

作業連結:https://coding.net/u/songyufeng/p/DSFPXT/git

項目說明:README.md

配置設定導師:a.cpp