本次結對專案對最終程式的功能要求如下:
編碼實現乙個部門與學生的智慧型匹配的程式。實現乙個智慧型自動分配演算法,根據輸入資訊,輸出部門和學生間的匹配資訊(乙個學生可以確認多個他所申請的部門,乙個部門可以分配少於等於其要求的學生數的學生) 及未被分配到學生的部門和未被部門選中的學生。本專案的關鍵在於設計乙個智慧型匹配演算法,該演算法主要實現根據輸入的學生和部門資料,輸出符合部門要求的匹配名單。現從部門角度做出如下需求分析:
根據需求分析建立如下資料模型:
字段數量(個)
型別部門名稱1字元
人數上限1數值
特點標籤
1-5字元
常規活動時間
1-5字元
錄取學生名單1字元
注:其中錄取學生名單
字段取值由匹配演算法產生
部門資料模型樣例:
部門名稱
人數上限
特點標籤
常規活動時間
錄取學生名單
活動部14
看電影,跳舞
sun,20:30,21:00;tue,19:30,20:00;fri,20:30,23:00
沈劍伸,楊伸世
字段數量(個)
型別學號1字元
姓名1字元績點1數值
意願部門
1-5字元
意願部門數1數值
未匹配意願數1數值
興趣標籤
1-5字元
空閒時間
1-5字元
各部門綜合得分
1-20
數值注:其中意願部門數
、未匹配意願數
、各部門綜合得分
字段取值由匹配演算法產生
學生資料模型樣例:
學號姓名
績點意願部門
意願部門數
未匹配意願數
興趣標籤
空閒時間
各部門綜合得分
170312369
沈劍伸1.07
策劃部,權益部,客服部,外聯部40
策劃,桌球,學習
fri,22:30,23:30;sat,19:30,20:00
25.07,30,26,28
注:由於時間段為隨機產生,為避免部門常規時間與所有學生的空閒時間都無法匹配的情況,將時間段限制在19:00-23:00
規定在程式設計過程中須嚴格遵循以下規範:
**佐證如下:
class department
private:
string name; //部門名稱
int limitnum; //人數上限
int existing; //已選人數
vectorfeature; //特點標籤
vector> normaldate; //常規活動時間
vectorstulist;//建立被錄取學生名單
public:
void setlimitnum(string limitnum);
void setexisting();
void setfeature(string feature);
void setnormaldate(string normaldate);
void addmember();
void setname(string name);
string getname();
int getexisting();
int getlimitnum();
vector> getnormaldate();
vectorgetfeature();
friend vectortimecut(string normaldate);
friend vectorslice(string s, const char* b);
void setstu(student s);
vectorgetstu();
};
演算法流程如下圖:
本演算法結合部門需求,從實際出發,模擬現實生活中部門招新過程,即每個部門最先匹配的是第一志願填報本部門的學生,根據學生資訊進行評估錄取,若錄取人數未達到上限則進行第二輪錄取,即開始遍歷學生的第二志願。即考慮以下兩條原則:
匹配演算法的關鍵**如下:
void match::start()
vector::iterator iter = dep.begin();
//查詢到學生第i志願部門物件
while (iter != dep.end())
iter++;
}//將績點作為成績的一部分算入匹配分數
stuiter->changemark(intent, stuiter->getgpa());
//如果學生空閒時間和部門活動時間完全不匹配則分數歸零,匹配下一學生的志願
timematch(*stuiter, *iter);
//匹配興趣標籤並打分
tagmatch(*stuiter, *iter);
//學生未匹配志願減一
stuiter->setnotmatch();
stuiter++;
} vector::iterator depiter = dep.begin();
//在第i個志願下,按照不同部門對學生分別進行分數排序,取出每個部門對應的成績非零的同學加入部門
while (depiter != dep.end())
depiter->setstu(*stuiter);
stuiter->setmarkzero(depiter->getname());
depiter->setexisting();
stuiter->setaccess();
//如果學生所有志願完成匹配,則轉移學生物件至matchover容器
if (!stuiter->getnotmatch())
else
}depiter++;
} }}
根據以上演算法形成的演算法測試報告如下:
優先條件
匹配學生個數
未匹配學生個數
實際耗時(s)
輸出檔案路徑
志願優先
192108
29.313
檔案路徑
效能分析結果如上圖所示,排序占用了93.60%的時間,不出意外的占用了大部分時間,因為這裡採用了氣泡排序的方法。如果改進排序方法,程式效能可能取得進一步的提公升。
該演算法對於不同優先條件變更的適應能力很好,對於不同的優先條件,我們只需要調整對應條件的評分權重,使該條件的得分足夠大即可,所以改動也只需要幾分鐘而已。
林翔的結對感受:本次的作業極大的鍛鍊了我的**能力。在與李明皇的結對過程中,感受到了他的認真嚴謹的態度。在設計演算法模型和敲**時我們經常發生爭論,但是最後都能很好的解決問題。
本次結對專案所給的時間有點緊,還好這幾天課比較少,不然可能完成不了。時間主要花在了演算法設計和最後的debug上。
以前對c++的實踐主要停留在做題的層面上,在真正的程式設計中發現了在題目中學不到的東西,比如**的規範性對程式設計效率起到了很大的作用,好的規範會使**review事半功倍。
隊友林翔在結對程式設計中很給力,他的邏輯思維一直很清晰,對於整個演算法的把握了然於胸,能夠很快的想到我沒有考慮的地方並給出解決方案。
第二次結對作業
這個作業屬於哪個課程 王永樂211706201 洪萬真211714312 這個作業要求在 homework 10417 這個作業的目標 作業正文 如下其他參考文獻 我是計算機工程系計科二班王永樂,我的隊友是來自計科一班的洪萬真 從圖中可以看出,直播的方式更讓學生們感到適合,當然,兩種方式各有利弊 因...
第二次結對作業
這個作業屬於哪個課程 軟體工程 福州大學至誠學院 計算機工程系 隊員1211706164 陳德渠 隊員2211706162 蔡澤華 這個作業要求在 第二次結對作業 這個作業的目標 資料視覺化與原型設計 作業正文 正文其他參考文獻 無由於第一次結對時,我們都是第一次開展問卷調查,導致問題的關聯性與實用...
第二次結對作業
這個作業屬於哪個課程 班級的鏈結 馬駿211706121 林連坤211706187 這個作業要求在 第二次結對作業 這個作業的目標 圍繞福州大學至誠學院 停課不停教 停課不停學 的具體實踐,了解網課的授課情況,同學們的學習 情況等等,並採用資料視覺化的方式進行呈現 作業正文 連坤 第二次結隊作業。我...