저는 작년 학생의 의견을 바탕으로 대학교의 실험실 실습 교사이며, 우리의 상사와 저는 그 문제를 해결하기를 원했습니다. 상사는 C 스크립트 작성을 선택했고 문제를 해결하기 위해 python (python-constraint)을 선택했습니다.
정보
- 6 개의 세션이 있습니다
- 4 가지 역할이 있습니다
- 6 가지 사례가 있습니다
- 32 명의 학생이 있습니다
- 팀당 4 명의 학생이 있습니다
문제 :
4 가지 다른 세션에서 4 가지 실습에서 각 학생을 4 가지 역할에 배정하십시오.
제약 사항 :
- 학생은 한 번 역할을 수행해야합니다
- 학생들은 6 가지 중 4 가지의 다른 관행을 수행해야합니다
- 학생들은 한 세션 당 하나의 연습 만해야합니다
- 학생은 같은 친구를 한 번만 만나야합니다
템플릿 :
여기 각 팀이 4 명의 학생으로 구성되어 있고 학생들에게 [0, 1, 2 또는 3] 직책이 그들에게 할당 된 역할이 있습니다. 사용 가능한 각 위치는 1에서 128까지 번호가 매겨집니다.
[# Semester
[ # Session
[ # Practice/Team
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],
[69, 70, 71, 72]],
[[73, 74, 75, 76],
[77, 78, 79, 80],
[81, 82, 83, 84],
[85, 86, 87, 88],
[89, 90, 91, 92],
[93, 94, 95, 96]],
[[97, 98, 99, 100],
[101, 102, 103, 104],
[105, 106, 107, 108],
[109, 110, 111, 112]],
[[113, 114, 115, 116],
[117, 118, 119, 120],
[121, 122, 123, 124],
[125, 126, 127, 128]]]
다시 말해 :
이 세션입니다 :
[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
그 팀도 같은 연습을합니다 :
[
[1, 2, 3, 4],
[25, 26, 27, 28],
[49, 50, 51, 52],
[73, 74, 75, 76],
[97, 98, 99, 100],
[113, 114, 115, 116]
]
그 위치는 같은 역할을합니다.
[
1,
5,
9,
13,
17,
21,
25,
...
]
내가 지금까지 무엇을 :
python-constraint를 사용 하여 처음 세 가지 제약 조건을 확인할 수있었습니다.
Valid solution : False
- sessions : [True, True, True, True, True, True]
- practices : [True, True, True, True, True, True]
- roles : [True, True, True, True]
- teams : [False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False]
흥미로운 사람들을 위해 나는 단순히 다음과 같이합니다 :
각 조건에 대해 AllDifferentConstraint 사용 합니다. 예를 들어 한 세션에 대해 다음을 수행합니다.
problem.addConstraint(AllDifferentConstraint(), [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
팀을 구속하는 방법을 찾을 수 없습니다. 전체에 대한 마지막 시도 semester
는 다음과 같습니다.
def team_constraint(self, *semester):
students = defaultdict(list)
# get back each teams based on the format [# Semester [ #Session [# Practice/Team ...
teams = [list(semester[i:i+4]) for i in range(0, len(semester), 4)]
# Update Students dict with all mate they work with
for team in teams:
for student in team:
students[student] += [s for s in team if s != student]
# Compute for each student if they meet someone more than once
dupli = []
for student, mate in students.items():
dupli.append(len(mate) - len(set(mate)))
# Loosly constraint, if a student meet somone 0 or one time it's find
if max(dupli) >= 2:
print("Mate encounter more than one time", dupli, min(dupli) ,max(dupli))
return False
pprint(students)
return True
질문 :
- 팀 조건에 대해 내가 원하는 것을 할 수 있습니까? 내 말은 각 학생에게 12 명의 친구를 배정 할 수 있는지 그리고 그들 각자가 같은 친구를 한 번만 만나는 지 모른다는 것입니다.
- 팀 제약 조건에 대해 더 성능이 뛰어난 알고리즘을 놓쳤습니까?
- 내가 따를 수있는 주먹?
(4, 4)
대신 모양이되는 이유는 무엇(4, 6)
입니까?