OR-Tools Day7

개발공부를해보자·2025년 6월 15일

실습 코드

# ------------------ Day6(25.06.13) ------------------

'''
간단한 시간표 문제를 해결하기 위한 예시 데이터
'''

# 교사 목록
teachers = ['T1', 'T2', 'T3']

# 과목 목록
subjects = ['Math', 'English', 'Science']

# 학급 목록
classes = ['1A', '1B']

# 시간 슬롯(교시)
time_slots = [1, 2, 3, 4, 5]

# 각 반의 시수
class_subject_requirements = {
    '1A': {'Math': 2, 'English': 2, 'Science': 1},
    '1B': {'Math': 2, 'English': 1, 'Science': 2}
}

# 교사별 담당 과목
teacher_subjects = {
    'T1': ['Math'],
    'T2': ['English'],
    'T3': ['Science']
}

# ------------------ Day7(25.06.15) ------------------

from ortools.sat.python import cp_model

model = cp_model.CpModel()

# x[반][시간][과목] : 해당 반이 해당 시간에 해당 과목을 배우면 1, 아니면 0
x = {}
for c in classes:
    for t in time_slots:
        for s in subjects:
            x[c, t, s] = model.NewBoolVar(f'x_{c}_{t}_{s}') # x 딕셔너리의 key가 tuple (c, t, s)이다.

# 한 시간에 한 반은 한 과목만 배운다.
for c in classes:
    for t in time_slots:
        model.Add(sum(x[c, t, s] for s in subjects) <= 1)

# 각 반별 시수
for c in classes:
    for s in subjects:
        model.Add(sum(x[c, t, s] for t in time_slots) == class_subject_requirements[c][s])

solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.FEASIBLE or status == cp_model.OPTIMAL:
    for c in classes:
        print(f'\n{c} 시간표:')
        for t in time_slots:
            for s in subjects:
                if solver.Value(x[c, t, s]):
                    print(f'  {t}교시: {s}')
else:
    print('해를 찾을 수 없습니다.')

'''
1A 시간표:
  1교시: Science
  2교시: English
  3교시: Math
  4교시: English
  5교시: Math

1B 시간표:
  1교시: English
  2교시: Science
  3교시: Math
  4교시: Science
  5교시: Math
'''
profile
개발 공부하는 30대 비전공자 직장인

0개의 댓글