A Linear Programming (LP) approach to selecting the optimal 10-course plan for the Georgia Tech MS in Computer Science, focusing on two possible specializations (Interactive Intelligence and Computing Systems). This project combines data gathering, operations research, and mathematical optimization to create an end-to-end solution for picking courses that satisfy Georgia Tech’s official requirements while maximizing your personal preferences (ratings, difficulty, workload, etc.).
The goal is to show how data science can model and solve real-world problems, driving data-backed decisions. In this case, What is the most optimal path of courses I should take?
In Georgia Tech’s MSCS, students must choose 10 courses and one specialization. Each specialization has specific rules on how many and which courses you must take. With this project, you can:
- Scrape live course data (ratings, difficulty, workload, etc.) from omscentral.com using
src/get_ratings.js
. - Define your personal preferences (weights) for rating, difficulty, workload, number of reviews, and interest.
- Run a CBC solver via PuLP (
src/main.py
) that:- Forces the solution to pick exactly 10 courses.
- Ensures your chosen specialization’s constraints are satisfied.
- Maximizes an objective function that captures your weighted preferences.
- Real-world alignment: Reflects actual Georgia Tech specialization constraints.
- Demonstrates data gathering: Showcases a small web-scraping approach for course data.
- Demonstrates optimization: Uses integer linear programming to handle constraints and find the best combination of courses.
- Full pipeline: Data → Model → Solve → Interpret results.
This project uses mixed-integer programming (MIP) to maximize the following utility function:
Where:
-
$(U)$ : Total utility to maximize. -
$(X_c)$ : Decision variable for each course$( x_c \text{ in } {0, 1} )$ , representing whether a course$(c)$ is selected. -
$(R_c, D_c, W_c, N_c, I_c)$ : The course’s rating, difficulty, workload, number of reviews, and interest score. -
$(w_r, w_d, w_w, w_n, w_i)$ : Weights for rating, difficulty, workload, number of reviews, and interest, respectively.
Subject to constraints that ensure:
- Exactly 10 courses chosen:
$\sum_{c} x_c = 10$ - Exactly one specialization:
$S_{\mathrm{II}} + S_{\mathrm{CS}} = 1$ - If
$S_\mathrm{II} = 1$ : Must satisfy the Interactive Intelligence sets. - If
$S_\mathrm{CS} = 1$ : Must satisfy the Computing Systems sets.
.
├── pyproject.toml # Poetry config file
├── poetry.lock # Poetry lock file
├── README.md # This file
├── src
│ ├── main.py # The main Python entry point
│ ├── get_ratings.js # Script for scraping from OMSCentral
│ └── ratings.json # Courses/Ratings from OMSCentral
└── ...
pyproject.toml
/poetry.lock
: Manages dependencies (e.g.,pulp
) and ensures reproducible builds.src/main.py
:- Contains the linear programming code (using PuLP).
- Defines constraints for each specialization, sets up the objective function, runs the solver, prints the output.
src/get_ratings.js
:- A small JavaScript snippet to paste into the OMSCentral console to fetch course data.
- Exports a JSON array you can store in
ratings.json
.
-
Clone This Repo
git clone https://github.com/ChosenQuill/course-planner.git cd course-planner
-
Install Dependencies
poetry install
-
Scrape Course Data
- Go to omscentral.com, open DevTools → Console.
- Paste the contents of
src/get_ratings.js
. - Copy the JSON output and paste it into
src/ratings.json
.
-
Adjust Weights & Constraints
- In
src/main.py
, tweak theweight_rating
,weight_difficulty
, etc., to reflect your priorities. - In
src/ratings.json
, adjust each course’sinterest
to match your personal preference. - Interactive Intelligence & Computing Systems constraints are coded, but you can add more if desired.
- In
-
Run
poetry run python src/main.py
The solver will pick 10 courses that meet the chosen specialization’s rules and maximize your total “score.”
Example solver output (your results may vary based on your weights or updated data):
Solver status: Optimal
Objective (Max Score) = 821.47
Chosen Specialization: Interactive Intelligence
Courses to take (10 total):
- Introduction to Graduate Algorithms
- Artificial Intelligence
- Deep Learning
- ...
- Course Ratings & Data from OMSCentral
- Project Inspiration from Christopher Dieringer’s “Applied Simplex Method For Deciding Future Coursework”
- Solver: PuLP for Python-based linear/integer programming
- Georgia Tech’s official Specialization Requirements
This project is for demonstration and educational purposes only. Please verify official course requirements with Georgia Tech.