Tôi là một gia sư thực hành tại phòng thí nghiệm tại trường đại học, dựa trên những nhận xét của sinh viên năm ngoái, chúng tôi muốn, ông chủ của tôi và tôi, giải quyết chúng. Sếp của tôi đã chọn viết kịch bản C và tôi chọn python (python-ràng buộc) để cố gắng giải quyết vấn đề của chúng tôi.
Thông tin
- Có 6 buổi
- Có 4 vai trò
- Có 6 thực hành
- Có 32 học sinh
- Có 4 học sinh mỗi đội
Vấn đề :
Chỉ định mỗi học sinh với 4 vai trò, trong 4 thực hành trong 4 phiên khác nhau.
Các ràng buộc:
- Học sinh nên làm một lần
- Học sinh nên làm 4 thực hành khác nhau trong số 6
- Học sinh chỉ nên thực hành một lần mỗi buổi
- Học sinh chỉ nên gặp cùng một người bạn đời một lần
Mẫu:
Đây là mẫu mà tôi cảm thấy với các sinh viên, trong đó mỗi đội gồm 4 sinh viên, các vị trí [0, 1, 2 hoặc 3] là các vai trò được giao cho họ. Mỗi vị trí khả dụng được đánh số từ 1 đến 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]]]
Nói cách khác :
Đây là một phiên:
[[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16],
[17, 18, 19, 20],
[21, 22, 23, 24]],
Những đội đó thực hiện cùng một thực hành:
[
[1, 2, 3, 4],
[25, 26, 27, 28],
[49, 50, 51, 52],
[73, 74, 75, 76],
[97, 98, 99, 100],
[113, 114, 115, 116]
]
Những vị trí đó làm cùng một vai trò:
[
1,
5,
9,
13,
17,
21,
25,
...
]
Những gì tôi có cho đến nay:
Sử dụng python-ràng buộc tôi có thể xác nhận ba ràng buộc đầu tiên:
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]
Đối với những người có thể thú vị, tôi chỉ đơn giản là làm như thế này:
Đối với mỗi điều kiện tôi sử dụng AllDifferentConstraint . Ví dụ: trong một phiên tôi làm:
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])
Tôi không thể tìm cách ràng buộc đội, nỗ lực cuối cùng của tôi trên toàn bộ semester
là:
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
Câu hỏi:
- Có thể làm những gì tôi muốn cho các điều kiện đội? Ý tôi là tôi không biết liệu có thể chỉ định 12 người bạn cho mỗi sinh viên và mỗi người chỉ gặp một người bạn đời giống nhau một lần.
- Đối với các ràng buộc nhóm, tôi đã bỏ lỡ một thuật toán hiệu suất hơn?
- Bất kỳ pist mà tôi có thể làm theo?
(4, 4)
thay vì(4, 6)
giống như các phiên khác?