앞으로 구글의 오픈소스 최적화 라이브러리인 OR-Tools와 파이썬을 활용해서 학교의 학기 시간표, 시험 시간표, 시험 감독 배치 등 실제 학교 행정에 필요한 자동화 프로그램을 만들어보는 과정을 기록하려고 합니다.파이참(PyCharm) 환경에서 OR-Tools를 설치하
실습 코드
실습 코드
실습 코드
제약 조건을 만족하는 해가 여러개 있을 때, 그 중 가장 좋은 해를 골라내려면 목적함수가 필요하다. Q. 목적함수가 여러 개 있을 때 우선순위를 정하는 방법은 ?A. 동시에 다루는 것은 OR-Tools에서 공식적으로 지원하진 않는다. 하지만, 두 가지 방법을 주로 사용
실습 코드
실습 코드
실습 코드
실습 코드
오늘의 실습 코드 코드 전체
음 꽤 널널한 조건인 것 같은데 왜 해를 못 찾지?별도의 최적화를 안해주면 성능이 안 좋은건가? 내가 너무 빡빡한 조건을 주었나? 실습 코드
실습 코드
실제 상황에서 사용할 수 있도록필요한 정보들을 .xlsx 파일에서 불러오도록 했다. 만족할만한 해가 나왔다!!이제 이걸... 유연하게 많은 리팩토링을 하고.. 코딩을 몰라도 쓸 수 있게 UI를 만들어야 한다.산넘어 산이군.. 실습 코드

혼자 쓰는 프로그램이 아니라 누구나 쓸 수 있게 하고 싶다. 유지 보수를 위해 main.py 하나에 작성 해둔 코드를 기능별로 분리하고,현재 시험 일수, 교시 개수, 교시별 시간 등이 하드 코딩 되어 있는데이를 설정 파일로 분리하거나, GUI에서 동적 입력이 가능하게
아래 내용을 적용하려 했다.그런데 커서로 딸깍 딸깍 하다가 디버깅의 늪에 빠졌다. 너무 에러가 많고 커서한테 고쳐달라고 해도 수습이 안된다..이전 버전으로 다시 돌리고, 코드를 스스로 잘 파악한 다음 조금씩만 커서에게 시키며.. 꼼꼼히 확인하며 커서의 제안을 수락해야겠

오랜만에 프로그램을 개선하였다.기존 프로그램에서 사용자는 엑셀 양식을 업로드하고, 이를 이용하여 필요한 데이터를 준비한다. 그런데 사용자가 이 데이터들을 시각화하여 확인하거나, 수정하고 싶을 수 있다.가령 A, B 두 과목은 프로그램 상에서 충돌이 없어서 같은 시간에
1교시에 80분을 배정하면 1교시에 80분을 초과하는 과목은 배정되지 못한다.이때, 시험일이 달라도 같은 1교시면 모두 같은 시간으로 설정을 해두었고 이를 바탕으로 시험 시간표 생성 로직을 작성해두었었다.그런데 데이터 편집 기능을 추가하다 생각해보니 사정에 따라 시험일

교사별 제약 조건 수정 기능 추가하기시험 시간표를 자동으로 초안을 만든 후, 사용자가 원하는대로 수정하는 기능 추가하기시험 감독 자동 배정 기능 추가하기

기존 설정화면과 이번에 추가한 시험 정보 편집 페이지에 중복되는 설정이 있어서 기존 설정화면을 수정함.수정 전수정 후사용자가 수정한 시험 정보를 가져와야하는데 설정 조정 페이지의 정보를 가져와서 에러가 발생했다.사용자가 수정한 시험 정보를 바탕으로 시간표 작성을 하도록
오늘 한 일 1. 교사 제약 편집 기능 추가 교사별로 담당 과목을 배치하면 안되는 시간을 사용자가 편집할 수 있는 기능을 추가함. 사용자가 시험 정보 편집 페이지에서 시험 날짜/교시를 추가/삭제하면 교사 제약 편집에 반영되도록 수정함. 2. 시험 정보 편집 오류 수

학생 입장에서 어려운 과목이 하루에 몰리는 것을 지양한다.어려운 과목을 정하는 기준을 시험 시간으로 했었다(ex 60분 이상).사용자가 임의로 어려운 과목을 정할 수 있게 바꾸었다. 임의 지정된 어려운 과목이 시험 시간표 생성시 반영되는 지 확인하기시험 시간표를 사용자

사용자가 직접 데이터를 추가할 지, 엑셀 양식을 업로드해서 추가할 지 선택할 수 있도록 화면 구성을 바꾸었다. 업로드와 데이터 편집 화면이 분리되어 있었는데 업로드 기능을 각 데이터 편집 화면으로 넣었다.데이터 편집 화면에서 필수 설정과 선택 설정을 나누었다.그리고 데
기본값으로 제1일만 뜨게 설정함제1일 날짜는 기본값으로 현재 날짜가 들어가게 설정함날짜를 추가하면 그 직전 날짜 다음 평일을 기본값으로 입력함날짜를 추가하면 그 직전 날짜의 교시 정보를 기본값으로 입력함교시를 추가하면 그 전 교시의 정보를 고려하여 기본값으로 시작 시간

학생 충돌 설정을 필수 설정으로 옮김필수 설정 아이콘 색 변경선택 설정에 과목 조건과 사용자 지정 충돌 조건 추가(아직은 기능은 미구현)학생 충돌을 필수 설정으로 뺄까? 분반배정표 업로드가 필수일까? 지금 과목 정보 페이지랑 학생 충돌 페이지의 정보가 상호의존적인데,
학생 충돌을 필수 설정으로 옮겼다.학년별로 수강 정보가 같은 학교(기존)와 학생별로 수강 과목이 모두 다른 학교(고교학점제, 선택과목 등)가 있음을 고려하여 이를 나누어 선택하게 바꾸었다. 관련 양식을 업로드하는 화면을 과목 정보 페이지처럼 예쁘게 바꾸었다.학년별로 수
'학생별 다른 과목' 페이지 업로드 양식 대폭 개선 및 다운로드 양식 만듦.'학년별 동일 과목' 페이지 들어오면 '학생별 다른 과목' 에서 생성된 데이터 자동 삭제하기'학생별 다른 과목' 양식 업로드하면 '학년별 동일 과목' 에서 생성한 데이터 자동 삭제하기'학년별 동
'과목 정보' 편집 기능 없애기필수 설정 페이지 디자인 통일듣기평가 커스텀시 시간표 생성에 반영되지 않는 문제 해결하기과목을 추가했을 때 분반배정표에 없어서 에러 나는 것 해결하기과목 조건 기능 개발과목 충돌 기능 개발선택 설정들 기본 값은 빈 값으로 바꾸고, 사용자가
사용하지 않는 get_data_summary() 기능 제거과목 조건 기능 개발 중듣기평가 커스텀시 시간표 생성에 반영되지 않는 문제 해결하기과목 충돌 기능 개발선택 설정들 기본 값은 빈 값으로 바꾸고, 사용자가 원하면 필수 설정에서 자동 생성하는 기능, 추가로 편집할

과목 조건 기능 개발사용자가 원하는 과목을 선택한 후, 배정 금지하고 싶은 시간에 체크를 하면 된다. 과목 목록과 시험 날짜, 교시, 시간 정보는 시험 정보 페이지를 바탕으로 자동으로 생성된다. 시험 정보가 없다면, 이를 업로드하라는 메세지가 뜨고 확인을 누르면 해당

교사 조건 기능 개선교사 조건 페이지의 기능과 디자인을 과목 조건 페이지처럼 수정, 개선하였다. 페이지 접속 시, 시험 정보와 과목 정보를 입력하지 않았다면 경고 메세지 후 업로드 페이지로 이동한다. 시험 정보와 과목 정보를 이용하여 교사 명단과 시험 시간표 슬롯을 자

학생 부담 조정 페이지페이지 접속 시, 시험 정보를 입력하지 않았다면 경고 메세지 후 업로드 페이지로 이동한다. 과목 충돌 페이지사용자가 특정 과목끼리 같은 시간에 배치를 강제하거나, 같은 시간에 배치되지 않게 설정하는 기능을 추가함.각종 조건의 출력 데이터 형식 일
오늘 한 일 * 교사 충돌 페이지 * 페이지 접속 시, 과목 정보를 입력하지 않았다면 경고 메세지 후 업로드 페이지로 이동한다. 초기 접속 시 충돌 정보는 빈 값으로 수정하였음. 자동 생성 버튼을 누르면 과목 정보를 바탕으로 담당 교사가 겹치는 과목에 대해 충돌 정보
교사 충돌 페이지 잘 사용하지 않을 버튼과 기능들 정리충돌 추가 UI 개선교사별 제한, 과목별 제한, 과목 충돌 페이지에서 과목, 교사를 선택할 때 타이핑 + 자동 완성 + 드롭다운 + (체크박스) 로 개선하였음. 각종 조건의 출력 데이터 형식 일원화하기듣기평가 커스
듣기 충돌 페이지 페이지 접속 시 과목 정보 파일 업로드 확인, 없으면 경고 후 리디렉트초기값 빈값으로 수정 -> 자동생성 버튼 추가(과목 정보 바탕으로 듣기 과목끼리 충돌 생성)사용자 임의 충돌 추가 UI 개선잘 사용하지 않을 버튼과 기능들 정리시간표 생성 페이지
시간표 생성 페이지 페이지를 대대적으로 개선했다.이전에는 그냥 자동생성 버튼이 있었고, 누르면 결과 페이지로 이동했다.이제 시간표 슬롯이 그리드 형태로 시각적으로 표현된다.좌측 영역에 과목 리스트가 제공된다.사용자는 과목을 드래그앤드롭으로 슬롯에 배정할 수 있고, 슬

데이터 전처리 사용자가 드래그앤 드롭으로 과목을 배정할 때,각 슬롯에 배치 가능 여부를 시각적으로 표시하고자 함.이를 위해 가능한 지 판단하는 함수가 필요함.다른 것들은 기존에 있는 데이터로 금방 판단이 되는데 아래의 조건이 문제였다. 한 슬롯에 있는 과목들 중 공통
시간표 생성 페이지 어떤 과목을 먼저 배치하면 좋을지 판단하는 휴리스틱 함수를 만들었다. 위 함수는 다른 과목과 충돌하는 횟수, 사용 가능한 슬롯 수, 어려운 과목 여부, 시험 시간을 고려하여 만들었다.이를 이용하여 수동으로 배치하는 사용자에게 지금 어떤 과목을 우선
시간표 생성 페이지 우선 순위 휴리스틱 함수 버그 수정(충돌 횟수 계산 시, 학생 충돌 누락되던 것 수정)우선 순위 휴리스틱 함수 버그 수정(학년별 같은 과목으로 설정했을 때, 학생 충돌 누락되던 것 수정)과목 배치 화면에서 과목별 카드에 수강 인원 표시 추가과목 배

시간표 생성 페이지 학생 부담 표시 패널 추가배치된 과목들을 바탕으로 날짜별로 하루에 시험 치는 개수별 학생 수를 알려준다.날짜별 드롭 가능한지 판단하는거랑 학생 부담 분석에 중복 코드 리팩토링드래그 앤 드롭 배치 가능한 슬롯 표시할 때, 슬롯이 불가한 경우와 날짜가
시간표 자동 생성 기능 개선 처음에 자동으로 시간표 생성하는 기능을 만들었고, 이때는 많은 부분이 하드코딩되어 있었고 누락된 제약 조건들이 있었다.이 부분들을 모두 개선하였다. 최근에 개발한 웹에서 사용자가 그리드에 배치할 때와 같은 제약조건, 설정값을 불러와서 자동
시간표 자동 생성 기능 개선 사용자가 시간표에 배치할 경우 자동으로 저장되게 개선함사용자가 일부 과목 미리 배치 후, 자동 배치 기능 적용할 수 있게 개선함자동 배치 후, 일부 수정할 수 있도록 개선함자동 생성 기능 개선(추가된 조건들 반영 잘 되었는지 check)자
시간표 생성 페이지 시간표 그리드와 학생 부담 패널 표 너비 맞추기사용자가 직접 그리드에 과목을 배치할 때 과목 배치 가능성을 따지는 것은 프론트엔드자동생성을 눌렀을 때 제약 조건을 추가하는 것은 백엔드에서 데이터를 읽고 있다. 한 프로젝트에서 동일한 JSON 데이터

시간표 자동 생성 기능 개선 자동 배치 성능을 개선했다!기존에는 그냥 OR-Tools의 CP-SAT Solver를 그대로 사용했다그런데 경험적으로 1학년 과목을 미리 수동으로 고정하고 자동 배치를 돌리면 더 나은 결과가 나온다.그 이유는 1학년의 경우 과목의 선택권