Code to optimize lots of people choosing between lots of things.
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is 4 commits behind wj2:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


This program generates a cook schedule given a list of date preferences for each cook. In particular, it uses linear programming to select a schedule minimizing the average cook preference.


> python --help
usage: [-h] [-e [EXCLUDE [EXCLUDE ...]]]
                         [-c [COMMUNITY [COMMUNITY ...]]] [--csv CSV]
                         [--ical ICAL] [--preference_power PREFERENCE_POWER]
                         [--begin_column BEGIN_COLUMN]
                         [--end_column END_COLUMN]
                         start end preferences

generate an cook cycle assignment from ranked date preferences

positional arguments:
  start                 date to start the cook cycle on (inclusive)
  end                   date to end the cook cycle on (inclusive)
  preferences           path to preferences csv file

optional arguments:
  -h, --help            show this help message and exit
  -e [EXCLUDE [EXCLUDE ...]], --exclude [EXCLUDE [EXCLUDE ...]]
                        dates to exclude from cook cycle
  -c [COMMUNITY [COMMUNITY ...]], --community [COMMUNITY [COMMUNITY ...]]
                        dates requiring two cooks
  --csv CSV             file to save schedule to
  --ical ICAL           file to save ical to
  --preference_power PREFERENCE_POWER
                        power to raise the cost of preference rankings to
  --begin_column BEGIN_COLUMN
                        index of the first preference column in the csv
  --end_column END_COLUMN
                        index of the last preference column in the csv


The repository contains sample preferences in the data directory. For example, to generate an optimal cook schedule for July and save it to output.csv and save an iCalendar to calendar.ics:

> python 2016-07-31 2016-08-20 data/july_2016.csv -c 2016-08-17 --exclude 2016-08-03 2016-08-10 --csv output.csv --ical calendar.ics
WARNING:root:Sony  selected excluded dates: ['21-08-2016']
WARNING:root:There 20 slots but only 18 cooks
Status: Optimal
Average preference: 1.88888888889
WARNING:root:Unassigned dates: ['31-07-2016', '01-08-2016']
                      name  preference
2016-07-31            None         NaN
2016-08-01            None         NaN
2016-08-02      Joey Brink         3.0
2016-08-04           Laura         3.0
2016-08-05           Sarah         3.0
2016-08-06          Sophia         1.0
2016-08-07            Kara         2.0
2016-08-08            Noah         1.0
2016-08-09           geoff         1.0
2016-08-11     Kevin Casto         1.0
2016-08-12           Kayla         1.0
2016-08-13            Will         2.0
2016-08-14             Asa         2.0
2016-08-15            Eric         1.0
2016-08-16         Chris q         4.0
2016-08-17            Jeff         2.0
2016-08-17         Michael         3.0
2016-08-18        Magnolia         1.0
2016-08-19  David Nekimken         1.0
2016-08-20           Sony          2.0


  • add wildcard preferences for cooks who have insufficient preferences
  • allow weighting of cook preferences this cycle by assignments last cycle