成員
031502309 侯振源
031502339 葉港晨
Git連結
資料例項
intput: 完整資料
{
"students": [
{
"free_time": [
"Sat.0:00~2:00",
"Sat.13:00~15:00",
"Tues.3:00~5:00",
"Wed.8:00~10:00",
"Sat.12:00~14:00",
"Fri.9:00~11:00",
"Thur.21:00~23:00"
],
"student_no": "031502339",
"applications_department": [
"D019",
"D009",
"D007"
],
"tags": [
"basketball",
"study",
"chess",
"Game"
]
},
......
],
"departments": [
{
"event_schedules": [
"Mon.9:00~10:00",
"Sun.7:00~8:00",
"Wed.11:00~12:00",
"Sun.19:00~20:00",
"Wed.14:00~15:00",
"Sat.10:00~11:00",
"Sun.1:00~2:00",
"Fri.5:00~6:00"
],
"member_limit": 11,
"department_no": "D001",
"tags": [
"study",
"film",
"English",
"football",
"reading",
"chess",
"basketball"
]
},
{
"event_schedules": [
"Mon.6:00~7:00",
"Wed.4:00~5:00"
],
"member_limit": 13,
"department_no": "D002",
"tags": [
"football",
"reading",
"music",
"film",
"English",
"basketball",
"dance",
"Game",
"study"
]
},
......
]
}
output: 完整資料
{
"unlucky_student": [
"031502339",
"031502341",
"031502342",
"031502343",
"031502346",
"031502347",
"031502348",
......
"031502638" ],
"admitted": [
{
"member": [
"031502422",
"031502430",
"031502631" ],
"department_no": "D001"
},
{
"member": [
"031502486",
"031502559",
"031502614",
"031502631" ],
"department_no": "D002"
},
.......
],
"unlucky_department": [
"D006" ]
}
"資料生成"程式的原理以及所考慮的因素
在c++中利用rand()函式的使用來隨機生成json格式的資料。利用Json::Value來生成一個個節點,然後再呼叫append()函式把一個個節點接到他們的父節點上,最後形成一個完整的json物件,之後利用toStyledString()函式把這個物件轉換為字串,之後就把字串輸出到檔案就完成了資料生成的任務。
其中學生資訊和部門的資訊都是在已經制定好的標籤中隨機選取一個或多個資料。資料隨機生成的數值按生活中實際的區間範圍選取。如時間在【00:00~24:59】之間隨機選取。
資料建模及匹配程式的思路及實現方式
我們採用了興趣優先匹配的演算法。首先建立兩個類,
學生類
(
- 學生編號 student_no;
- 空閒時間段 free_time;
- 興趣標籤 tags;
- 部門意願 applications_department;
),
部門類
(
- 部門編號 department_no;
- 學生數的要求的上限 member_limit;
- 特點標籤 tags;
- 常規活動時間段 event_schedules_n;
)。
將所有資料分別存入各個學生類和部門類中。從第一個學生開始,遍歷他所申請的部門,如果這是第一個志願,則記錄score值為10,第二個志願則score值為9,以此類推。然後分別進入相應的部門類,查詢活動時間是否和學生空閒時間匹配(學生時間不一定完全在部門活動時間的範圍內,只要學生空閒時間有百分之八十在活動時間內即算匹配成功。),如果匹配,則進入下一個判斷,否則直接淘汰。活動時間匹配之後,進行的是興趣標籤的判定,如果該學生興趣標籤中有一個標籤與該部門標籤所包含的標籤相同,則score+1,如果兩個相同則score+2,以此類推來進行優先順序分類。然後之後再根據score的大小進行排序,實現優先錄取,完成匹配。
程式碼規範
格式是vs自動排版,適當的使用註釋來幫助理解程式碼:
```
void Input()
{
//給Student類賦值
for (int i = 0; i < root["students"].size(); i++)
{
Student[i].student_no = root["students"][i]["student_no"].asString();
for (int j = 0; j < root["students"][i]["free_time"].size(); j++)
......
//給Department類賦值
for (int i = 0; i < root["departments"].size(); i++)
{
Department[i].department_no = root["departments"][i]["department_no"].asString();
for (int j = 0; j < root["departments"][i]["event_schedules"].size(); j++)
......
}
```
結果評估
不太滿意。因國慶假期的原因,作業開始時間比較晚,所以時間來說比較趕,而且在配置json庫的時候總是遇到各種各樣的問題,浪費了太多的時間,導致對於匹配演算法的考慮和編寫的時間都大大不足。只能在志願優先和興趣標籤的匹配的程度來決定優先順序,個人感覺不夠智慧化,而且對於當前的優先順序的程式碼編寫也不夠優美,只能說大概的實現的要求而已。而且沒有時間來修改程式碼,導致程式碼太過於冗長等原因。總之並沒有達到一開始的預期效果。
結對感受
第二次和隊友完成作業,在幾天內不斷的遇到問題,磕磕碰碰的粗糙的完成作業要求。由於這次作業工程量較大,所需要的程式碼也較長,所以和隊友的討論,修改,再討論,再修改,不斷的迴圈著。從一開始兩個人想法的不一致到逐漸的意見一致。最主要的問題是太長的程式碼,導致另一個人看起來很困難,所以編寫過程中需要不斷的解釋自己的編寫的邏輯以及變數的含義。可是說整個過程到時一個人寫加不斷解釋,另一個旁聽,然後兩人在角色互換。說實話是有點累人,但是當最後完成工作室,便會發現兩個人的完成的作品會比一個人完成的更加的智慧。
總的來說,過程很累,結果還不錯。