We developed the idea of a schedule generator during the WebReg Hackathon held by the Antrepreneur Center last week and thought it would be a great project idea to actually develop software for in this hackathon. We wanted to try our own hand at improving the student-course-registration experience and worked hard to create a product that we think will be useful for all students.
What it does
Students can enter in up to 50 classes to the GUI and our algorithm will produce the top ranked schedules pooled from those classes. The ranking criteria pools data from RateMyProfessor, such as professor rating as well as statistical data about those classes such as average GPA to calculate an heuristic ranking for that class.
How we built it
The schedule generation is based off of an "n-Queens" and "MiniMax" inspired backtracking recursion algorithm that returned all possible schedules in Winter '23 with the given set of classes.
Course and instructor data was retrieved from the PeterPortal API, and additional instructor data was scraped from RateMyProfessor (RMP) to be used in Machine Learning analysis. The rating, tags, difficulty, and other features about professors from RMP were leveraged to build a Gradient Boosted Decision Tree Regression model that helped assess a professor's quality. Those scores, along with average GPA scores for individual courses were used to establish overall scores for individual course offerings, which were then averaged to give a final "ZotRating" for a particular schedule.
Our frontend was built with React and the Chakra UI toolkit. Using these tools allowed us to quickly iterate on the design and make changes in real-time. To bridge the data between the frontend and backend ML data, we used a Python FastAPI web server which made data serialization and deserialization from native Python types simple and expressive. Additionally, we used the open-source search engine Meilisearch running as a separate server to index all UCI courses to allow users to search for courses based on their course code, title, or description in seconds.
All of this was bundled into a Docker container which was deployed to Fly.io and connected to a separate Meilisearch Docker container, with A record forwarding for the ZotScheduler.app domain.
Challenges we ran into
It was difficult to determine what ML model to use, considering that there was not a specific value that was best to predict. Instead, we selected to create an intentionally inaccurate prediction of a professor's RMP rating that took into account other factors, resulting in a more accurate result overall. It was also difficult to learn how to run our Python app in a docker container, and we spent a lot of time troubleshooting how to create a dockerfile and compile all of our requirements (such as MeiliSearch) through docker.
Accomplishments that we're proud of
Integration of Machine Learning algorithms was a goal of ours and we're ecstatic that we were able to incorporate it in producing a responsive schedule ranking database based on numerous attributes. This was also the first time we combined a robust backend with a rich frontend that could be deployed into the real world to be a useful tool for all UCI students.
What we learned
We gained experience using GraphQL for the PeterPortal API, as well as gained practice in Web Scraping. This was also our first time incorporating Machine Learning into a project. We also learned how to host Python apps in docker containers and launch our app onto a public domain.
What's next for ZotScheduler
We are already running ZotScheduler on fly.io servers at ZotScheduler.app. We plan to update the database with information for future quarters from Spring 2023 onwards. Of course, user feedback will be essential in determining any useful features that should be added and anything we need to revise.
Log in or sign up for Devpost to join the conversation.