private int getIndexOfBestMatch(StudentGroup studentGroup, List <Student> studentList) { int[] points = new int[studentList.Count]; for (int i = 0; i < studentList.Count; i++) { Student s = studentList[i]; points[i] = this.groupSize; foreach (Student member in studentGroup.getMembers()) { if (relationshipListContains(s, RelationshipTypeEnum.MATCH, member)) { points[i] -= 1; } if (relationshipListContains(s, RelationshipTypeEnum.DO_NOT_MATCH, member)) { points[i] += 1000; } } } int minIndex = 0; for (int j = 0; j < points.Length; j++) { if (points[j] < points[minIndex]) { minIndex = j; } } return(minIndex); }
private bool optimize(StudentGroup group1) { foreach (Student student1 in group1.getMembers()) { // group score of group with student1 int before1 = getGroupScore(group1); foreach (StudentGroup group2 in studentGroups) { if (group2.id == group1.id) { continue; } foreach (Student student2 in group2.getMembers()) { int before2 = getGroupScore(group2); int after = getGroupScoreIfReplace(group1, student1, student2) + getGroupScoreIfReplace(group2, student2, student1); if (after < before1 + before2) { swapGroupMembers(group1, student1, group2, student2); return(true); } } } } return(false); }
private int getGroupScore(StudentGroup group) { int score = group.max * group.max; foreach (Student s in group.getMembers()) { foreach (Student member in group.getMembers()) { if (member.getId() != s.getId()) { if (relationshipListContains(s, RelationshipTypeEnum.MATCH, member)) { score -= 1; } if (relationshipListContains(s, RelationshipTypeEnum.DO_NOT_MATCH, member)) { score += 1000; } } } } return(score); }