Inspiration

Registering for courses at OSU is frustrating. It's a delicate balancing act where you try and get the best professors with open classes and good time slots. On top of this you need to deal with a somewhat unintuitive UI. Students shouldn't need to deal with this hassle.

Scraping

Whenever a user selects a course a request to the server is sent to fetch the latest data from OSU’s website. This information is stored in a Postgres database for later retrieval. If the data has been refreshed within the last 15 minutes, the algorithm skips this process entirely and utilizes the cached information.

Scheduling Algorithm

CourseMink utilizes heuristic searching to approach schedules that best fit the user’s provided preferences. I experimented with Tabu search, but found that stochastic searching was the most performant due to the nested nature of the data.

The algorithm tries to maximize the following:

  • Professor score (RMP)
  • Courses within preferred start time
  • Courses that are close together each day

How I built it

  • React
  • Typescript
  • Express
  • Postgres
  • Docker

Challenges I ran into

Scraping the data proved to be more difficult than I first expected. I had to handle cookies in order to scrape the course data correctly. I used postman to test my scraping requests.

Another problem I encountered is coming up with a method of dealing with linked sections within courses. For example a course can have multiple lectures and you must register the correct studio that works with the lecture. In order to solve this problem I used a relational database to represent this relationship.

TODO

  • Allow for more user preferences
    • Add breaks that algorithm takes into account. (Lunch or club meetings)
    • Avoid or always take certain professors for a course
  • Improve UI/UX
    • Dark-mode (paid?)
    • Mobile support

Contributing

This project is open source and any contributions are greatly appreciated. I want to improve the site for the next cycle of course registration and could use all the help I can get.

Share this project:

Updates