-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathalgorithm.cpp
More file actions
68 lines (57 loc) · 2.49 KB
/
Copy pathalgorithm.cpp
File metadata and controls
68 lines (57 loc) · 2.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "algorithm.h"
Algorithm::Algorithm(
vector<list<QString> > listOfVotelists,
vector<tuple<QString, unsigned> > listOfCoursesAndMaxMembers)
{
list<unsigned> sizeList;
foreach (list<QString> voteList, listOfVotelists) {
sizeList.push_back(voteList.size());
}
sizeList.sort();
if(*(sizeList.begin()) != *(sizeList.end()) ) {
throw invalid_argument("The votelists need to have equal size");
}
this->listOfVotelists = listOfVotelists;
this->listOfCoursesAndMaxMembers = listOfCoursesAndMaxMembers;
for (unsigned id = 0; id < *(sizeList.begin()); ++id) {
this->listOfVoterIds.push_back(id);
}
this->matchlist.resize(*(sizeList.begin()) );
}
void Algorithm::course_matching_algo(){
for (unsigned voteRound = 0; voteRound < listOfVotelists.size(); ++voteRound) {
for (unsigned choice = 0; choice < listOfCoursesAndMaxMembers.size(); ++choice) {
list<int> courseVoters;
list<int>::iterator voterId = listOfVoterIds.begin();
for (list<QString>::iterator vote = listOfVotelists[voteRound].begin(); vote != listOfVotelists[voteRound].end(); ++vote) {
if (*vote == get<0>(listOfCoursesAndMaxMembers[choice] ) ) {
courseVoters.push_back(*(voterId) );
}
++voterId;
}
while (courseVoters.size() > get<1>(listOfCoursesAndMaxMembers[choice] ) ) {
list<int>::iterator kickChoice = courseVoters.begin();
srand (time(NULL));
advance(kickChoice, rand() % courseVoters.size());
courseVoters.erase(kickChoice);
}
get<1>(listOfCoursesAndMaxMembers[choice]) = get<1>(listOfCoursesAndMaxMembers[choice]) - courseVoters.size();
foreach (int voter, courseVoters) {
matchlist[voter] = get<0>(listOfCoursesAndMaxMembers[choice]);
int index = 0;
for (list<int>::iterator i = listOfVoterIds.begin(); *(i) != voter || i == listOfVoterIds.end(); ++i) {
++index;
}
listOfVoterIds.remove(voter);
foreach (list<QString> voteList, listOfVotelists) {
list<QString>::iterator iter = voteList.begin();
advance(iter, index);
voteList.erase(iter);
}
}
}
}
}
vector<QString> Algorithm::get_matchlist(){
return matchlist;
}