Generate optimized conference schedules using Google OR-Tools CP-SAT solver. Use when the user needs to create conference schedules from CSV data with constraints like speaker conflicts, track distribution, room assignments, educational flow, and speaker availability. Supports both single-day and multi-day conferences. Handles inputs from Google Sheets CSV exports with talks (ID, title, summary, track, level, speakers, availability) and schedule slots (day, times, rooms). Outputs CSV and Markdown schedules.
Generate optimized conference schedules using Google OR-Tools CP-SAT constraint solver. Supports single-day and multi-day conferences.
pip install ortools --break-system-packages
python assets/scheduler.py schedule.csv talks.csv output.csv --time-limit 30
"from hour";"to hour";"session type";"room name"
"10:35";"11:20";Conference;Room 2
"10:35";"11:20";Conference;Room 8
"11:30";"12:15";Conference;Room 3
Add a "day" column as the first column:
"day";"from hour";"to hour";"session type";"room name"
"Wednesday";"09:30";"10:15";Conference;Room 1
"Wednesday";"10:35";"11:20";Conference;Room 2
"Thursday";"09:30";"10:15";Conference;Room 1
Day values can be: day names (Monday, Tuesday), dates (2024-03-15), or labels (Day 1, Day 2).
"Talk ID";"Talk Title";"Audience Level";"Talk Summary";"Track Name";"Speaker Availability days";"Available from";"Available to";"Speaker names"
1411;Unit Test Your Architecture;BEGINNER;ArchUnit is...;Development Practices;Wednesday,Thursday;;;Roland Weisleder
3872;Full-stack development;INTERMEDIATE;Java developers...;UI & UX;;;;Simon Martinelli
Speaker Availability formats (column 6):
Wednesday,Thursday1,2,3| Constraint | Description |
|---|---|
| Speaker conflict | Same speaker can't be in two rooms at same time |
| Room conflict | Two talks can't be in same room at same time |
| Track conflict | Same track can't have talks in different rooms simultaneously |
| Speaker availability | Speaker must be available on scheduled day |
| Constraint | Description |
|---|---|
| Educational flow | Beginner → Intermediate → Advanced within track |
Single-day:
"Talk ID";"From";"To";"Room";"Title";"Speakers";"Level";"Track"
Multi-day:
"Day";"Talk ID";"From";"To";"Room";"Title";"Speakers";"Level";"Track"
Generated alongside CSV with .md extension, includes tables grouped by timeslot (and day for multi-day).
from pathlib import Path
from scheduler import (
read_schedule_csv, read_talks_csv, solve_schedule,
write_csv_output, write_markdown_output, print_schedule
)
# Read input
timeslots, rooms, day_names = read_schedule_csv(Path("schedule.csv"))
talks = read_talks_csv(Path("talks.csv"), day_names)
# Solve (30 second time limit)
talks, status = solve_schedule(timeslots, rooms, talks, time_limit_seconds=30)
# Output
print_schedule(talks, multi_day=len(day_names) > 1)
write_csv_output(talks, Path("output.csv"), multi_day=len(day_names) > 1)
The constraints cannot all be satisfied. Check for:
pip install ortools --break-system-packages