From 375baec11067f71e6202d35a1bf1bab2ae6ecfc0 Mon Sep 17 00:00:00 2001 From: ross Date: Sun, 29 Mar 2020 11:39:41 +0100 Subject: [PATCH] part changed (silly time to commit) --- rota.ipynb | 262 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 155 insertions(+), 107 deletions(-) diff --git a/rota.ipynb b/rota.ipynb index dab27e1..3ea2309 100644 --- a/rota.ipynb +++ b/rota.ipynb @@ -38,37 +38,13 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "night_balance_offset = 3" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "output_type": "error", - "ename": "FileNotFoundError", - "evalue": "[Errno 2] No such file or directory: 'trainees.csv'", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Import trainee data\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mcsv\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'trainees.csv'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnewline\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0mlines\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcsv\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdelimiter\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m','\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mquotechar\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'|'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mrow\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mlines\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'trainees.csv'" - ] - } - ], - "source": [ - "# Import trainee data\n", - "import csv\n", - "with open('trainees.csv', newline='') as f:\n", - " lines = csv.reader(f, delimiter=',', quotechar='|')\n", - " for row in lines[1:]:\n", - " name, site, grade, fte, end_date, nwds = line.split(\",\")" + "night_balance_offset = 2\n", + "twighlight_balance_offset = 1\n", + "weeks_to_rota = 26" ] }, { @@ -76,17 +52,57 @@ "execution_count": 3, "metadata": {}, "outputs": [], + "source": [ + "# Import trainee data\n", + "#import csv\n", + "#with open('trainees.csv', newline='') as f:\n", + "# lines = csv.reader(f, delimiter=',', quotechar='|')\n", + "# for row in lines[1:]:\n", + "# name, site, grade, fte, end_date, nwds = line.split(\",\")" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], "source": [ "# Define days (1 week)\n", "days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']\n", "\n", - "weeks = [i for i in range(1,2)]\n", + "weeks = [i for i in range(1,weeks_to_rota+1)]\n", "\n", "weeks_days_product = list(itertools.product(weeks, days))\n", "\n", + "sites = (\"truro\", \"exeter\", \"torbay\", \"barnstaple\", \"plymouth\")\n", + "\n", + "class shiftsClass:\n", + " def __init__(self, sites, shift, length, days, balance_by_site=True)\n", + " self.site = sites\n", + " self.shift = shift\n", + " self.length = length\n", + " self.days = days\n", + "\n", + " def GetShift(self):\n", + " return self.shift\n", + "\n", + "shifts = []\n", + "shifts.append(\n", + " shiftsClass((\"truro\"), \"truro_twighlight\", 12.5, days[:5]),\n", + " shiftsClass((\"plymouth\"), \"plymouth_twighlight\", 12.5, days[:5]), \n", + " shiftsClass((sites), \"night\", 12.5, days, balance_by_site=False), \n", + ")\n", + "\n", "# Enter shifts of each day\n", - "shifts = ['morning', 'evening', 'night', 'truro_twighlight'] # 3 shifts of 8 hours\n", - "shift_len = [8, 8, 12.5, 12.5]\n", + "#shifts = ['morning', 'evening', 'night', 'truro_twighlight'] # 3 shifts of 8 hours\n", + "#shifts = ['night', 'truro_twighlight', 'plymouth_twighlight'] # 3 shifts of 8 hours\n", + "\n", + "# Generate\n", + "\n", + "#site_and_shifts_to_balance = ((\"truro\", \"truro_twighlight\"),\n", + "# (\"plymouth\", \"plymouth_twighlight\"))\n", + "\n", + "#shift_len = [12.5, 12.5, 12.5]\n", "\n", "night_blocks = [\"weekday\", \"weekend\", \"none\"]\n", "\n", @@ -152,17 +168,21 @@ " self.fte_adj = self.fte * self.proportion_rota_to_work\n", " \n", " def GetDetails(self):\n", - " return \"{} {} {}\".format(self.name, self.site, self.grade)\n", + " return \"{} {} {}\".format(self.id, self.site[0], self.grade)\n", "\n", "# Enter workers ids (name, number, ...)\n", - "workers = [workerClass(i, \"Test Person {}\".format(i), \"truro\", 3) for i in range(1, 10)] \n", - "workers.extend([workerClass(i, \"Test Person {}\".format(i), \"plymouth\", 4) for i in range(11, 28)])\n", + "workers = [workerClass(i, \"Test Person {}\".format(i), \"truro\", 4) for i in range(1, 20)] \n", + "workers.extend([workerClass(i, \"Test Person {}\".format(i), \"plymouth\", 4) for i in range(21, 58)])\n", "#workers.extend([workerClass(i, \"Test Person {}\".format(i), 4, 200, \"\") for i in range(48, 49)])\n", "\n", "\n", "#unavailable_to_work.update([(\"W1\", 1, \"Mon\"),(\"W1\", 1, \"Fri\"),(\"W1\", 1, \"Thu\"),(\"W3\", 1, \"Mon\"),(\"W2\", 1, \"Mon\"),(\"W2\", 1, \"Tue\"),(\"W2\", 1, \"Wed\"),(\"W6\", 1, \"Thu\"),(\"W5\", 1, \"Fri\"),(\"W9\", 1, \"Fri\"),(\"W14\", 1, \"Fri\"),(\"W21\", 1, \"Fri\")])\n", "\n", "full_time_equivalent = sum([w.fte_adj for w in workers])\n", + "full_time_equivalent_sites = {}\n", + "\n", + "for site in [\"truro\", \"plymouth\"]:\n", + " full_time_equivalent_sites[site] = sum([w.fte_adj for w in workers if w.site == site])\n", "\n", "\n", "#for i in range(11,30):" @@ -176,7 +196,7 @@ { "output_type": "execute_result", "data": { - "text/plain": "[(1, 'Wed'), (1, 'Thu'), (1, 'Fri'), (1, 'Sat'), (1, 'Sun')]" + "text/plain": "{'truro': 1900.0, 'plymouth': 3700.0}" }, "metadata": {}, "execution_count": 5 @@ -184,12 +204,12 @@ ], "source": [ "weeks_days_product = list(itertools.product(weeks, days))\n", - "weeks_days_product[2:]" + "full_time_equivalent_sites" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "tags": [ "outputPrepend", @@ -209,7 +229,7 @@ "model = ConcreteModel()\n", "\n", "# binary variables representing if a worker is scheduled somewhere\n", - "model.works = Var(((worker.id, week, day, shift) for worker in workers for week in weeks for day in days for shift in days_shifts[day]),\n", + "model.works = Var(((worker.id, week, day, shift) for worker in workers for week in weeks for day in days for shift.GetShift() in days_shifts[day]),\n", " within=Binary, initialize=0)\n", "\n", "model.nights = Var(((worker.id, week, block) for worker in workers for week in weeks for block in night_blocks),\n", @@ -233,7 +253,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -250,6 +270,24 @@ "model.obj = Objective(rule=obj_rule, sense=minimize)" ] }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": "[(1, 100.0, ('truro', 'truro_twighlight')),\n (2, 100.0, ('truro', 'truro_twighlight')),\n (3, 100.0, ('truro', 'truro_twighlight')),\n (4, 100.0, ('truro', 'truro_twighlight')),\n (5, 100.0, ('truro', 'truro_twighlight')),\n (6, 100.0, ('truro', 'truro_twighlight')),\n (7, 100.0, ('truro', 'truro_twighlight')),\n (8, 100.0, ('truro', 'truro_twighlight')),\n (9, 100.0, ('truro', 'truro_twighlight')),\n (10, 100.0, ('truro', 'truro_twighlight')),\n (11, 100.0, ('truro', 'truro_twighlight')),\n (12, 100.0, ('truro', 'truro_twighlight')),\n (13, 100.0, ('truro', 'truro_twighlight')),\n (14, 100.0, ('truro', 'truro_twighlight')),\n (15, 100.0, ('truro', 'truro_twighlight')),\n (16, 100.0, ('truro', 'truro_twighlight')),\n (17, 100.0, ('truro', 'truro_twighlight')),\n (18, 100.0, ('truro', 'truro_twighlight')),\n (19, 100.0, ('truro', 'truro_twighlight')),\n (21, 100.0, ('plymouth', 'plymouth_twighlight')),\n (22, 100.0, ('plymouth', 'plymouth_twighlight')),\n (23, 100.0, ('plymouth', 'plymouth_twighlight')),\n (24, 100.0, ('plymouth', 'plymouth_twighlight')),\n (25, 100.0, ('plymouth', 'plymouth_twighlight')),\n (26, 100.0, ('plymouth', 'plymouth_twighlight')),\n (27, 100.0, ('plymouth', 'plymouth_twighlight')),\n (28, 100.0, ('plymouth', 'plymouth_twighlight')),\n (29, 100.0, ('plymouth', 'plymouth_twighlight')),\n (30, 100.0, ('plymouth', 'plymouth_twighlight')),\n (31, 100.0, ('plymouth', 'plymouth_twighlight')),\n (32, 100.0, ('plymouth', 'plymouth_twighlight')),\n (33, 100.0, ('plymouth', 'plymouth_twighlight')),\n (34, 100.0, ('plymouth', 'plymouth_twighlight')),\n (35, 100.0, ('plymouth', 'plymouth_twighlight')),\n (36, 100.0, ('plymouth', 'plymouth_twighlight')),\n (37, 100.0, ('plymouth', 'plymouth_twighlight')),\n (38, 100.0, ('plymouth', 'plymouth_twighlight')),\n (39, 100.0, ('plymouth', 'plymouth_twighlight')),\n (40, 100.0, ('plymouth', 'plymouth_twighlight')),\n (41, 100.0, ('plymouth', 'plymouth_twighlight')),\n (42, 100.0, ('plymouth', 'plymouth_twighlight')),\n (43, 100.0, ('plymouth', 'plymouth_twighlight')),\n (44, 100.0, ('plymouth', 'plymouth_twighlight')),\n (45, 100.0, ('plymouth', 'plymouth_twighlight')),\n (46, 100.0, ('plymouth', 'plymouth_twighlight')),\n (47, 100.0, ('plymouth', 'plymouth_twighlight')),\n (48, 100.0, ('plymouth', 'plymouth_twighlight')),\n (49, 100.0, ('plymouth', 'plymouth_twighlight')),\n (50, 100.0, ('plymouth', 'plymouth_twighlight')),\n (51, 100.0, ('plymouth', 'plymouth_twighlight')),\n (52, 100.0, ('plymouth', 'plymouth_twighlight')),\n (53, 100.0, ('plymouth', 'plymouth_twighlight')),\n (54, 100.0, ('plymouth', 'plymouth_twighlight')),\n (55, 100.0, ('plymouth', 'plymouth_twighlight')),\n (56, 100.0, ('plymouth', 'plymouth_twighlight')),\n (57, 100.0, ('plymouth', 'plymouth_twighlight'))]" + }, + "metadata": {}, + "execution_count": 8 + } + ], + "source": [ + "#[(worker.id, worker.fte_adj, ss) for ss in site_and_shifts for worker in workers if worker.site == ss[0]]" + ] + }, { "cell_type": "code", "execution_count": 9, @@ -261,7 +299,8 @@ "# Constraint: all shifts are assigned\n", "for week in weeks:\n", " for day in days:\n", - " for shift in days_shifts[day]:\n", + " for shiftClass in days_shifts[day]:\n", + " shift = shiftClass.GetShift()\n", " # 3 people per night\n", " if shift in ['night']:\n", " model.constraints.add( # to add a constraint to model.constraints set\n", @@ -271,22 +310,26 @@ " model.constraints.add( # to add a constraint to model.constraints set\n", " 1 == sum(model.works[worker.id, week, day, shift] for worker in workers if worker.site == \"truro\")\n", " )\n", + " elif day in days[:5] and shift in ['plymouth_twighlight']: \n", + " model.constraints.add( # to add a constraint to model.constraints set\n", + " 1 == sum(model.works[worker.id, week, day, shift] for worker in workers if worker.site == \"plymouth\")\n", + " ) \n", " # make sure twighlights are not assigned on a weekend\n", - " elif day in days[5:] and shift in ['truro_twighlight']:\n", + " elif day in days[5:] and shift in ['truro_twighlight', 'plymouth_twighlight']:\n", " model.constraints.add( # to add a constraint to model.constraints set\n", " 0 == sum(model.works[worker.id, week, day, shift] for worker in workers)\n", " )\n", " \n", - " elif day in days[:-1] and shift in ['morning', 'evening']:\n", - " # weekdays' and Saturdays' day shifts have exactly two workers\n", - " model.constraints.add( # to add a constraint to model.constraints set\n", - " 1 == sum(model.works[worker.id, week, day, shift] for worker in workers)\n", - " )\n", - " else:\n", - " # Sunday shifts have exactly one worker\n", - " model.constraints.add(\n", - " 1 == sum(model.works[worker.id, week, day, shift] for worker in workers)\n", - " )\n", + " #elif day in days[:-1] and shift in ['truro_twighlight', 'plymouth_twighlight']:\n", + " # # weekdays' and Saturdays' day shifts have exactly two workers\n", + " # model.constraints.add( # to add a constraint to model.constraints set\n", + " # 1 == sum(model.works[worker.id, week, day, shift] for worker in workers)\n", + " # )\n", + " #else:\n", + " # # Sunday shifts have exactly one worker\n", + " # model.constraints.add(\n", + " # 1 == sum(model.works[worker.id, week, day, shift] for worker in workers)\n", + " # )\n", "\n", "# Constraint: total hours worked hours worked\n", "#for worker in workers:\n", @@ -301,17 +344,17 @@ "# )\n", "\n", "def maxHoursPerWeekRule(model, wid, week):\n", - " return(72 >= sum(shift_lengths[shift] * model.works[wid, week, day, shift]for day in days for shift in days_shifts[day]))\n", + " return(72 >= sum(shift_lengths[shift] * model.works[wid, week, day, shift.GetShift()]for day in days for shift in days_shifts[day]))\n", "model.max_hours_per_week_constraint = Constraint([worker.id for worker in workers], weeks, rule=maxHoursPerWeekRule)\n", "\n", "def maxHoursRule(model, wid):\n", - " return(800 >= sum(shift_lengths[shift] * model.works[wid, week, day, shift] for week in weeks for day in days for shift in days_shifts[day]))\n", + " return(8000 >= sum(shift_lengths[shift] * model.works[wid, week, day, shift.GetShift()] for week in weeks for day in days for shift in days_shifts[day]))\n", "model.max_hours_constraint = Constraint([worker.id for worker in workers], rule=maxHoursRule)\n", "\n", "# Shifts should not be allocated on nwds (excepting night shifts)\n", "def nwdRule(model, wid, nwds):\n", " if nwds != \"\":\n", - " return(1 >= sum(model.works[wid, week, day, shift] for week in weeks for day in nwds.split(\",\") for shift in [\"morning\",\"evening\"]) + 1)\n", + " return(1 >= sum(model.works[wid, week, day, shift.GetShift()] for week in weeks for day in nwds.split(\",\") for shift in [\"truro_twighlight\",\"plymouth_twighlight\"]) + 1)\n", " return Constraint.Skip\n", "model.nwd_constraint = Constraint([(worker.id, worker.nwd) for worker in workers], rule=nwdRule)\n", "\n", @@ -327,6 +370,27 @@ "model.night_shifts_constraint = Constraint([(worker.id, worker.fte_adj) for worker in workers], rule=nightShiftNumberRule)\n", "\n", "\n", + "twighlight_constraints = {}\n", + "\n", + "# Set a rule to even twighlight shifts:\n", + "total_twighlight_shifts = len(weeks) * 5 * 1 # One person per site\n", + "\n", + "def truroTwighlightShiftNumberRule(model, wid, fte_adj, site, shift):\n", + " #site, shift = site_and_shift\n", + " max_shifts = total_twighlight_shifts / full_time_equivalent_sites[site] * fte_adj + twighlight_balance_offset\n", + " min_shifts = total_twighlight_shifts / full_time_equivalent_sites[site] * fte_adj - twighlight_balance_offset\n", + " \n", + " return inequality(min_shifts, sum(model.works[wid, week, day, shift.GetShift()] for week in weeks for day in days), max_shifts)\n", + "model.twighlight_shifts_truro_constraint = Constraint([(worker.id, worker.fte_adj, ss[0], ss[1]) for ss in site_and_shifts for worker in workers if worker.site == ss[0]], rule=truroTwighlightShiftNumberRule)\n", + "\n", + "#def plymouthTwighlightShiftNumberRule(model, wid, fte_adj):\n", + "# max_shifts = total_twighlight_shifts / full_time_equivalent_sites[\"plymouth\"] * fte_adj + twighlight_balance_offset\n", + "# min_shifts = total_twighlight_shifts / full_time_equivalent_sites[\"plymouth\"] * fte_adj - twighlight_balance_offset\n", + "# \n", + "# return inequality(min_shifts, sum(model.works[wid, week, day, \"plymouth_twighlight\"] for week in weeks for day in days), max_shifts)\n", + "#model.twighlight_shifts_plymouth_constraint = Constraint([(worker.id, worker.fte_adj) for worker in workers if worker.site == \"plymouth\"], #rule=plymouthTwighlightShiftNumberRule)\n", + "\n", + "\n", "# Limit to 1 ST2 (or below) on a night shift\n", "def nightShiftMaxSTRule(model, week, block):\n", " single_workers = [w for w in workers if w.grade < 3]\n", @@ -383,29 +447,29 @@ " )\n", "\n", "\n", - " # if working in morning, cannot work again that day\n", + " # single shift per day\n", " model.constraints.add(\n", " 1 >= sum(model.works[worker.id, week, days[j], shift] for shift in days_shifts[days[j]])\n", " )\n", - " # if working in evening, until next evening (note that after sunday comes next monday)\n", - " model.constraints.add(\n", - " 1 >= sum(model.works[worker.id, week, days[j], shift] for shift in ['evening', 'night']) +\n", - " model.works[worker.id, nweek, days[(j + 1) % 7], 'morning']\n", - " )\n", + " ## if working in evening, until next evening (note that after sunday comes next monday)\n", + " #model.constraints.add(\n", + " # 1 >= sum(model.works[worker.id, week, days[j], shift] for shift in ['evening', 'night']) +\n", + " # model.works[worker.id, nweek, days[(j + 1) % 7], 'truro_twighlight']\n", + " #)\n", "\n", " # if working a night ensure preceeding (1) or subsequent (2) shifts can only be nights\n", " model.constraints.add(\n", " 1 >= model.works[worker.id, week, days[j], \"night\"] +\n", - " sum(model.works[worker.id, nweek, days[(j + 1) % 7], shift] for shift in ['morning', 'evening']) +\n", - " sum(model.works[worker.id, nweek, days[(j + 2) % 7], shift] for shift in ['morning', 'evening']) +\n", - " sum(model.works[worker.id, pweek, days[(j - 1) % 7], shift] for shift in ['morning', 'evening'])\n", + " sum(model.works[worker.id, nweek, days[(j + 1) % 7], shift] for shift in ['truro_twighlight', 'plymouth_twighlight']) +\n", + " sum(model.works[worker.id, nweek, days[(j + 2) % 7], shift] for shift in ['truro_twighlight', 'plymouth_twighlight']) +\n", + " sum(model.works[worker.id, pweek, days[(j - 1) % 7], shift] for shift in ['truro_twighlight', 'plymouth_twighlight'])\n", " )\n", "\n", "# Constraint (def of model.needed)\n", - "for worker in workers:\n", - " model.constraints.add(\n", - " 10000 * model.needed[worker.id] >= sum(model.works[worker.id, week, day, shift] for week in weeks for day in days for shift in days_shifts[day])\n", - " ) # if any model.works[worker, ·, ·] non-zero, model.needed[worker] must be one; else is zero to reduce the obj function\n", + "#for worker in workers:\n", + "# model.constraints.add(\n", + "# 10000 * model.needed[worker.id] >= sum(model.works[worker.id, week, day, shift] for week in weeks for day in days for shift in days_shifts[day])\n", + "# ) # if any model.works[worker, ·, ·] non-zero, model.needed[worker] must be one; else is zero to reduce the obj function\n", " # 10000 is to remark, but 5 was enough since max of 40 hours yields max of 5 shifts, the maximum possible sum\n", "\n", "# Constraint (def of model.no_pref)\n", @@ -414,8 +478,7 @@ "# model.constraints.add(\n", "# model.no_pref[worker.id] >= sum(model.works[worker.id, week, 'Sat', shift] for shift in days_shifts['Sat'])\n", "# - sum(model.works[worker.id, week, 'Sun', shift] for shift in days_shifts['Sun'])\n", - "# ) # if not working on sunday but working saturday model.needed must be 1; else will be zero to reduce the obj function\n", - "" + "# ) # if not working on sunday but working saturday model.needed must be 1; else will be zero to reduce the obj function\n" ] }, { @@ -470,12 +533,12 @@ " return timetable\n", "\n", "def get_shift_summary(works):\n", - " #timetable = { worker.GetDetails() : { shift : \"\" for shift in shifts } for worker in workers }\n", - " timetable = { worker.GetDetails() : { shift : \"\" for shift in [\"truro_twighlight\"] } for worker in workers } \n", + " timetable = { worker.GetDetails() : { shift : \"\" for shift in shifts } for worker in workers }\n", + " #timetable = { worker.GetDetails() : { shift : \"\" for shift in [\"truro_twighlight\"] } for worker in workers } \n", " for worker in workers:\n", "\n", - " #for shift in shifts:\n", - " for shift in [\"truro_twighlight\"]:\n", + " for shift in shifts:\n", + " #for shift in [\"truro_twighlight\"]:\n", " timetable[worker.GetDetails()][shift] = [works[worker.id, week, day, shift] for week in weeks for day in days].count(1)\n", " return timetable \n", "\n", @@ -509,7 +572,7 @@ { "output_type": "execute_result", "data": { - "text/plain": "{'Test Person 1 truro 3': {'truro_twighlight': 0},\n 'Test Person 2 truro 3': {'truro_twighlight': 0},\n 'Test Person 3 truro 3': {'truro_twighlight': 0},\n 'Test Person 4 truro 3': {'truro_twighlight': 3},\n 'Test Person 5 truro 3': {'truro_twighlight': 2},\n 'Test Person 6 truro 3': {'truro_twighlight': 0},\n 'Test Person 7 truro 3': {'truro_twighlight': 0},\n 'Test Person 8 truro 3': {'truro_twighlight': 0},\n 'Test Person 9 truro 3': {'truro_twighlight': 0},\n 'Test Person 11 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 12 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 13 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 14 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 15 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 16 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 17 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 18 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 19 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 20 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 21 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 22 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 23 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 24 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 25 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 26 plymouth 4': {'truro_twighlight': 0},\n 'Test Person 27 plymouth 4': {'truro_twighlight': 0}}" + "text/plain": "{'1 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '2 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '3 t 4': {'night': 9, 'truro_twighlight': 6, 'plymouth_twighlight': 0},\n '4 t 4': {'night': 9, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '5 t 4': {'night': 11, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '6 t 4': {'night': 11, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '7 t 4': {'night': 9, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '8 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '9 t 4': {'night': 9, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '10 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '11 t 4': {'night': 11, 'truro_twighlight': 6, 'plymouth_twighlight': 0},\n '12 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '13 t 4': {'night': 11, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '14 t 4': {'night': 8, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '15 t 4': {'night': 8, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '16 t 4': {'night': 8, 'truro_twighlight': 6, 'plymouth_twighlight': 0},\n '17 t 4': {'night': 11, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '18 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '19 t 4': {'night': 10, 'truro_twighlight': 7, 'plymouth_twighlight': 0},\n '21 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '22 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '23 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '24 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '25 p 4': {'night': 9, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '26 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '27 p 4': {'night': 9, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '28 p 4': {'night': 9, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '29 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '30 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '31 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '32 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '33 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '34 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '35 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '36 p 4': {'night': 9, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '37 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '38 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '39 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '40 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '41 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '42 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '43 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '44 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '45 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '46 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '47 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '48 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '49 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '50 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '51 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '52 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '53 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '54 p 4': {'night': 10, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '55 p 4': {'night': 11, 'truro_twighlight': 0, 'plymouth_twighlight': 3},\n '56 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 4},\n '57 p 4': {'night': 8, 'truro_twighlight': 0, 'plymouth_twighlight': 4}}" }, "metadata": {}, "execution_count": 12 @@ -528,7 +591,7 @@ { "output_type": "execute_result", "data": { - "text/plain": "['Test Person 1',\n 'Test Person 2',\n 'Test Person 3',\n 'Test Person 4',\n 'Test Person 5',\n 'Test Person 6',\n 'Test Person 7',\n 'Test Person 8',\n 'Test Person 9',\n 'Test Person 11',\n 'Test Person 12',\n 'Test Person 13',\n 'Test Person 14',\n 'Test Person 15',\n 'Test Person 16',\n 'Test Person 17',\n 'Test Person 18',\n 'Test Person 19',\n 'Test Person 20',\n 'Test Person 21',\n 'Test Person 22',\n 'Test Person 23',\n 'Test Person 24',\n 'Test Person 25',\n 'Test Person 26',\n 'Test Person 27']" + "text/plain": "[]" }, "metadata": {}, "execution_count": 13 @@ -546,7 +609,7 @@ { "output_type": "execute_result", "data": { - "text/plain": "{1: {'Mon': {'morning': ['Test Person 19 plymouth 4'],\n 'evening': ['Test Person 9 truro 3'],\n 'night': ['Test Person 11 plymouth 4',\n 'Test Person 13 plymouth 4',\n 'Test Person 27 plymouth 4'],\n 'truro_twighlight': ['Test Person 5 truro 3']},\n 'Tue': {'morning': ['Test Person 17 plymouth 4'],\n 'evening': ['Test Person 20 plymouth 4'],\n 'night': ['Test Person 11 plymouth 4',\n 'Test Person 13 plymouth 4',\n 'Test Person 27 plymouth 4'],\n 'truro_twighlight': ['Test Person 4 truro 3']},\n 'Wed': {'morning': ['Test Person 12 plymouth 4'],\n 'evening': ['Test Person 23 plymouth 4'],\n 'night': ['Test Person 11 plymouth 4',\n 'Test Person 13 plymouth 4',\n 'Test Person 27 plymouth 4'],\n 'truro_twighlight': ['Test Person 4 truro 3']},\n 'Thu': {'morning': ['Test Person 2 truro 3'],\n 'evening': ['Test Person 7 truro 3'],\n 'night': ['Test Person 11 plymouth 4',\n 'Test Person 13 plymouth 4',\n 'Test Person 27 plymouth 4'],\n 'truro_twighlight': ['Test Person 4 truro 3']},\n 'Fri': {'morning': ['Test Person 18 plymouth 4'],\n 'evening': ['Test Person 15 plymouth 4'],\n 'night': ['Test Person 12 plymouth 4',\n 'Test Person 21 plymouth 4',\n 'Test Person 23 plymouth 4'],\n 'truro_twighlight': ['Test Person 5 truro 3']},\n 'Sat': {'morning': ['Test Person 1 truro 3'],\n 'evening': ['Test Person 6 truro 3'],\n 'night': ['Test Person 12 plymouth 4',\n 'Test Person 21 plymouth 4',\n 'Test Person 23 plymouth 4'],\n 'truro_twighlight': []},\n 'Sun': {'morning': ['Test Person 8 truro 3'],\n 'evening': ['Test Person 5 truro 3'],\n 'night': ['Test Person 12 plymouth 4',\n 'Test Person 21 plymouth 4',\n 'Test Person 23 plymouth 4'],\n 'truro_twighlight': []}}}" + "text/plain": " t 4'],\n 'plymouth_twighlight': ['43 p 4']},\n 'Wed': {'night': ['11 t 4', '16 t 4', '46 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['24 p 4']},\n 'Thu': {'night': ['11 t 4', '16 t 4', '46 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['40 p 4']},\n 'Fri': {'night': ['12 t 4', '21 p 4', '43 p 4'],\n 'truro_twighlight': ['4 t 4'],\n 'plymouth_twighlight': ['31 p 4']},\n 'Sat': {'night': ['12 t 4', '21 p 4', '43 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['12 t 4', '21 p 4', '43 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 4: {'Mon': {'night': ['8 t 4', '37 p 4', '41 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['24 p 4']},\n 'Tue': {'night': ['8 t 4', '37 p 4', '41 p 4'],\n 'truro_twighlight': ['7 t 4'],\n 'plymouth_twighlight': ['46 p 4']},\n 'Wed': {'night': ['8 t 4', '37 p 4', '41 p 4'],\n 'truro_twighlight': ['4 t 4'],\n 'plymouth_twighlight': ['35 p 4']},\n 'Thu': {'night': ['8 t 4', '37 p 4', '41 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['54 p 4']},\n 'Fri': {'night': ['32 p 4', '42 p 4', '48 p 4'],\n 'truro_twighlight': ['11 t 4'],\n 'plymouth_twighlight': ['29 p 4']},\n 'Sat': {'night': ['32 p 4', '42 p 4', '48 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['32 p 4', '42 p 4', '48 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 5: {'Mon': {'night': ['12 t 4', '35 p 4', '44 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['56 p 4']},\n 'Tue': {'night': ['12 t 4', '35 p 4', '44 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['34 p 4']},\n 'Wed': {'night': ['12 t 4', '35 p 4', '44 p 4'],\n 'truro_twighlight': ['11 t 4'],\n 'plymouth_twighlight': ['41 p 4']},\n 'Thu': {'night': ['12 t 4', '35 p 4', '44 p 4'],\n 'truro_twighlight': ['13 t 4'],\n 'plymouth_twighlight': ['51 p 4']},\n 'Fri': {'night': ['34 p 4', '45 p 4', '54 p 4'],\n 'truro_twighlight': ['3 t 4'],\n 'plymouth_twighlight': ['50 p 4']},\n 'Sat': {'night': ['34 p 4', '45 p 4', '54 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['34 p 4', '45 p 4', '54 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 6: {'Mon': {'night': ['32 p 4', '37 p 4', '45 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['26 p 4']},\n 'Tue': {'night': ['32 p 4', '37 p 4', '45 p 4'],\n 'truro_twighlight': ['11 t 4'],\n 'plymouth_twighlight': ['36 p 4']},\n 'Wed': {'night': ['32 p 4', '37 p 4', '45 p 4'],\n 'truro_twighlight': ['10 t 4'],\n 'plymouth_twighlight': ['39 p 4']},\n 'Thu': {'night': ['32 p 4', '37 p 4', '45 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['42 p 4']},\n 'Fri': {'night': ['9 t 4', '13 t 4', '27 p 4'],\n 'truro_twighlight': ['1 t 4'],\n 'plymouth_twighlight': ['49 p 4']},\n 'Sat': {'night': ['9 t 4', '13 t 4', '27 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['9 t 4', '13 t 4', '27 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 7: {'Mon': {'night': ['13 t 4', '23 p 4', '24 p 4'],\n 'truro_twighlight': ['1 t 4'],\n 'plymouth_twighlight': ['33 p 4']},\n 'Tue': {'night': ['13 t 4', '23 p 4', '24 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['37 p 4']},\n 'Wed': {'night': ['13 t 4', '23 p 4', '24 p 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['56 p 4']},\n 'Thu': {'night': ['13 t 4', '23 p 4', '24 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['53 p 4']},\n 'Fri': {'night': ['10 t 4', '28 p 4', '30 p 4'],\n 'truro_twighlight': ['15 t 4'],\n 'plymouth_twighlight': ['39 p 4']},\n 'Sat': {'night': ['10 t 4', '28 p 4', '30 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['10 t 4', '28 p 4', '30 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 8: {'Mon': {'night': ['45 p 4', '51 p 4', '56 p 4'],\n 'truro_twighlight': ['15 t 4'],\n 'plymouth_twighlight': ['26 p 4']},\n 'Tue': {'night': ['45 p 4', '51 p 4', '56 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['23 p 4']},\n 'Wed': {'night': ['45 p 4', '51 p 4', '56 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['28 p 4']},\n 'Thu': {'night': ['45 p 4', '51 p 4', '56 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['32 p 4']},\n 'Fri': {'night': ['18 t 4', '24 p 4', '37 p 4'],\n 'truro_twighlight': ['3 t 4'],\n 'plymouth_twighlight': ['42 p 4']},\n 'Sat': {'night': ['18 t 4', '24 p 4', '37 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['18 t 4', '24 p 4', '37 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 9: {'Mon': {'night': ['16 t 4', '22 p 4', '54 p 4'],\n 'truro_twighlight': ['3 t 4'],\n 'plymouth_twighlight': ['32 p 4']},\n 'Tue': {'night': ['16 t 4', '22 p 4', '54 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['25 p 4']},\n 'Wed': {'night': ['16 t 4', '22 p 4', '54 p 4'],\n 'truro_twighlight': ['5 t 4'],\n 'plymouth_twighlight': ['43 p 4']},\n 'Thu': {'night': ['16 t 4', '22 p 4', '54 p 4'],\n 'truro_twighlight': ['1 t 4'],\n 'plymouth_twighlight': ['52 p 4']},\n 'Fri': {'night': ['4 t 4', '23 p 4', '27 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['57 p 4']},\n 'Sat': {'night': ['4 t 4', '23 p 4', '27 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['4 t 4', '23 p 4', '27 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 10: {'Mon': {'night': ['31 p 4', '48 p 4', '55 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['42 p 4']},\n 'Tue': {'night': ['31 p 4', '48 p 4', '55 p 4'],\n 'truro_twighlight': ['15 t 4'],\n 'plymouth_twighlight': ['25 p 4']},\n 'Wed': {'night': ['31 p 4', '48 p 4', '55 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['27 p 4']},\n 'Thu': {'night': ['31 p 4', '48 p 4', '55 p 4'],\n 'truro_twighlight': ['10 t 4'],\n 'plymouth_twighlight': ['36 p 4']},\n 'Fri': {'night': ['8 t 4', '17 t 4', '47 p 4'],\n 'truro_twighlight': ['13 t 4'],\n 'plymouth_twighlight': ['34 p 4']},\n 'Sat': {'night': ['8 t 4', '17 t 4', '47 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['8 t 4', '17 t 4', '47 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 11: {'Mon': {'night': ['5 t 4', '14 t 4', '43 p 4'],\n 'truro_twighlight': ['7 t 4'],\n 'plymouth_twighlight': ['27 p 4']},\n 'Tue': {'night': ['5 t 4', '14 t 4', '43 p 4'],\n 'truro_twighlight': ['4 t 4'],\n 'plymouth_twighlight': ['31 p 4']},\n 'Wed': {'night': ['5 t 4', '14 t 4', '43 p 4'],\n 'truro_twighlight': ['1 t 4'],\n 'plymouth_twighlight': ['52 p 4']},\n 'Thu': {'night': ['5 t 4', '14 t 4', '43 p 4'],\n 'truro_twighlight': ['10 t 4'],\n 'plymouth_twighlight': ['57 p 4']},\n 'Fri': {'night': ['3 t 4', '26 p 4', '28 p 4'],\n 'truro_twighlight': ['11 t 4'],\n 'plymouth_twighlight': ['23 p 4']},\n 'Sat': {'night': ['3 t 4', '26 p 4', '28 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['3 t 4', '26 p 4', '28 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 12: {'Mon': {'night': ['5 t 4', '26 p 4', '49 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['36 p 4']},\n 'Tue': {'night': ['5 t 4', '26 p 4', '49 p 4'],\n 'truro_twighlight': ['10 t 4'],\n 'plymouth_twighlight': ['41 p 4']},\n 'Wed': {'night': ['5 t 4', '26 p 4', '49 p 4'],\n 'truro_twighlight': ['11 t 4'],\n 'plymouth_twighlight': ['30 p 4']},\n 'Thu': {'night': ['5 t 4', '26 p 4', '49 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['34 p 4']},\n 'Fri': {'night': ['11 t 4', '39 p 4', '40 p 4'],\n 'truro_twighlight': ['16 t 4'],\n 'plymouth_twighlight': ['48 p 4']},\n 'Sat': {'night': ['11 t 4', '39 p 4', '40 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['11 t 4', '39 p 4', '40 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 13: {'Mon': {'night': ['38 p 4', '49 p 4', '51 p 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['52 p 4']},\n 'Tue': {'night': ['38 p 4', '49 p 4', '51 p 4'],\n 'truro_twighlight': ['1 t 4'],\n 'plymouth_twighlight': ['21 p 4']},\n 'Wed': {'night': ['38 p 4', '49 p 4', '51 p 4'],\n 'truro_twighlight': ['13 t 4'],\n 'plymouth_twighlight': ['40 p 4']},\n 'Thu': {'night': ['38 p 4', '49 p 4', '51 p 4'],\n 'truro_twighlight': ['16 t 4'],\n 'plymouth_twighlight': ['44 p 4']},\n 'Fri': {'night': ['4 t 4', '7 t 4', '30 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['54 p 4']},\n 'Sat': {'night': ['4 t 4', '7 t 4', '30 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['4 t 4', '7 t 4', '30 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 14: {'Mon': {'night': ['1 t 4', '22 p 4', '40 p 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['55 p 4']},\n 'Tue': {'night': ['1 t 4', '22 p 4', '40 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['37 p 4']},\n 'Wed': {'night': ['1 t 4', '22 p 4', '40 p 4'],\n 'truro_twighlight': ['15 t 4'],\n 'plymouth_twighlight': ['30 p 4']},\n 'Thu': {'night': ['1 t 4', '22 p 4', '40 p 4'],\n 'truro_twighlight': ['4 t 4'],\n 'plymouth_twighlight': ['33 p 4']},\n 'Fri': {'night': ['3 t 4', '7 t 4', '29 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['43 p 4']},\n 'Sat': {'night': ['3 t 4', '7 t 4', '29 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['3 t 4', '7 t 4', '29 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 15: {'Mon': {'night': ['17 t 4', '42 p 4', '53 p 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['21 p 4']},\n 'Tue': {'night': ['17 t 4', '42 p 4', '53 p 4'],\n 'truro_twighlight': ['10 t 4'],\n 'plymouth_twighlight': ['45 p 4']},\n 'Wed': {'night': ['17 t 4', '42 p 4', '53 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['44 p 4']},\n 'Thu': {'night': ['17 t 4', '42 p 4', '53 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['46 p 4']},\n 'Fri': {'night': ['1 t 4', '3 t 4', '31 p 4'],\n 'truro_twighlight': ['16 t 4'],\n 'plymouth_twighlight': ['50 p 4']},\n 'Sat': {'night': ['1 t 4', '3 t 4', '31 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['1 t 4', '3 t 4', '31 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 16: {'Mon': {'night': ['2 t 4', '15 t 4', '57 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['25 p 4']},\n 'Tue': {'night': ['2 t 4', '15 t 4', '57 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['24 p 4']},\n 'Wed': {'night': ['2 t 4', '15 t 4', '57 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['28 p 4']},\n 'Thu': {'night': ['2 t 4', '15 t 4', '57 p 4'],\n 'truro_twighlight': ['13 t 4'],\n 'plymouth_twighlight': ['50 p 4']},\n 'Fri': {'night': ['7 t 4', '19 t 4', '36 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['27 p 4']},\n 'Sat': {'night': ['7 t 4', '19 t 4', '36 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['7 t 4', '19 t 4', '36 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 17: {'Mon': {'night': ['6 t 4', '15 t 4', '34 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['38 p 4']},\n 'Tue': {'night': ['6 t 4', '15 t 4', '34 p 4'],\n 'truro_twighlight': ['5 t 4'],\n 'plymouth_twighlight': ['23 p 4']},\n 'Wed': {'night': ['6 t 4', '15 t 4', '34 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['45 p 4']},\n 'Thu': {'night': ['6 t 4', '15 t 4', '34 p 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['55 p 4']},\n 'Fri': {'night': ['4 t 4', '25 p 4', '36 p 4'],\n 'truro_twighlight': ['16 t 4'],\n 'plymouth_twighlight': ['33 p 4']},\n 'Sat': {'night': ['4 t 4', '25 p 4', '36 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['4 t 4', '25 p 4', '36 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 18: {'Mon': {'night': ['6 t 4', '10 t 4', '42 p 4'],\n 'truro_twighlight': ['7 t 4'],\n 'plymouth_twighlight': ['40 p 4']},\n 'Tue': {'night': ['6 t 4', '10 t 4', '42 p 4'],\n 'truro_twighlight': ['5 t 4'],\n 'plymouth_twighlight': ['35 p 4']},\n 'Wed': {'night': ['6 t 4', '10 t 4', '42 p 4'],\n 'truro_twighlight': ['13 t 4'],\n 'plymouth_twighlight': ['38 p 4']},\n 'Thu': {'night': ['6 t 4', '10 t 4', '42 p 4'],\n 'truro_twighlight': ['11 t 4'],\n 'plymouth_twighlight': ['23 p 4']},\n 'Fri': {'night': ['18 t 4', '28 p 4', '35 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['26 p 4']},\n 'Sat': {'night': ['18 t 4', '28 p 4', '35 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['18 t 4', '28 p 4', '35 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 19: {'Mon': {'night': ['13 t 4', '18 t 4', '19 t 4'],\n 'truro_twighlight': ['10 t 4'],\n 'plymouth_twighlight': ['53 p 4']},\n 'Tue': {'night': ['13 t 4', '18 t 4', '19 t 4'],\n 'truro_twighlight': ['4 t 4'],\n 'plymouth_twighlight': ['47 p 4']},\n 'Wed': {'night': ['13 t 4', '18 t 4', '19 t 4'],\n 'truro_twighlight': ['15 t 4'],\n 'plymouth_twighlight': ['29 p 4']},\n 'Thu': {'night': ['13 t 4', '18 t 4', '19 t 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['54 p 4']},\n 'Fri': {'night': ['5 t 4', '12 t 4', '25 p 4'],\n 'truro_twighlight': ['3 t 4'],\n 'plymouth_twighlight': ['51 p 4']},\n 'Sat': {'night': ['5 t 4', '12 t 4', '25 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['5 t 4', '12 t 4', '25 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 20: {'Mon': {'night': ['38 p 4', '44 p 4', '53 p 4'],\n 'truro_twighlight': ['9 t 4'],\n 'plymouth_twighlight': ['22 p 4']},\n 'Tue': {'night': ['38 p 4', '44 p 4', '53 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['39 p 4']},\n 'Wed': {'night': ['38 p 4', '44 p 4', '53 p 4'],\n 'truro_twighlight': ['7 t 4'],\n 'plymouth_twighlight': ['34 p 4']},\n 'Thu': {'night': ['38 p 4', '44 p 4', '53 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['29 p 4']},\n 'Fri': {'night': ['6 t 4', '8 t 4', '31 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['32 p 4']},\n 'Sat': {'night': ['6 t 4', '8 t 4', '31 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['6 t 4', '8 t 4', '31 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 21: {'Mon': {'night': ['14 t 4', '21 p 4', '23 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['57 p 4']},\n 'Tue': {'night': ['14 t 4', '21 p 4', '23 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['38 p 4']},\n 'Wed': {'night': ['14 t 4', '21 p 4', '23 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['53 p 4']},\n 'Thu': {'night': ['14 t 4', '21 p 4', '23 p 4'],\n 'truro_twighlight': ['5 t 4'],\n 'plymouth_twighlight': ['45 p 4']},\n 'Fri': {'night': ['9 t 4', '32 p 4', '43 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['56 p 4']},\n 'Sat': {'night': ['9 t 4', '32 p 4', '43 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['9 t 4', '32 p 4', '43 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 22: {'Mon': {'night': ['17 t 4', '55 p 4', '57 p 4'],\n 'truro_twighlight': ['1 t 4'],\n 'plymouth_twighlight': ['41 p 4']},\n 'Tue': {'night': ['17 t 4', '55 p 4', '57 p 4'],\n 'truro_twighlight': ['16 t 4'],\n 'plymouth_twighlight': ['30 p 4']},\n 'Wed': {'night': ['17 t 4', '55 p 4', '57 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['45 p 4']},\n 'Thu': {'night': ['17 t 4', '55 p 4', '57 p 4'],\n 'truro_twighlight': ['18 t 4'],\n 'plymouth_twighlight': ['29 p 4']},\n 'Fri': {'night': ['19 t 4', '27 p 4', '40 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['35 p 4']},\n 'Sat': {'night': ['19 t 4', '27 p 4', '40 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['19 t 4', '27 p 4', '40 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 23: {'Mon': {'night': ['39 p 4', '48 p 4', '50 p 4'],\n 'truro_twighlight': ['6 t 4'],\n 'plymouth_twighlight': ['35 p 4']},\n 'Tue': {'night': ['39 p 4', '48 p 4', '50 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['46 p 4']},\n 'Wed': {'night': ['39 p 4', '48 p 4', '50 p 4'],\n 'truro_twighlight': ['7 t 4'],\n 'plymouth_twighlight': ['31 p 4']},\n 'Thu': {'night': ['39 p 4', '48 p 4', '50 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['24 p 4']},\n 'Fri': {'night': ['33 p 4', '52 p 4', '55 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['26 p 4']},\n 'Sat': {'night': ['33 p 4', '52 p 4', '55 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['33 p 4', '52 p 4', '55 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 24: {'Mon': {'night': ['35 p 4', '46 p 4', '52 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['48 p 4']},\n 'Tue': {'night': ['35 p 4', '46 p 4', '52 p 4'],\n 'truro_twighlight': ['5 t 4'],\n 'plymouth_twighlight': ['53 p 4']},\n 'Wed': {'night': ['35 p 4', '46 p 4', '52 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['55 p 4']},\n 'Thu': {'night': ['35 p 4', '46 p 4', '52 p 4'],\n 'truro_twighlight': ['15 t 4'],\n 'plymouth_twighlight': ['47 p 4']},\n 'Fri': {'night': ['9 t 4', '25 p 4', '41 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['57 p 4']},\n 'Sat': {'night': ['9 t 4', '25 p 4', '41 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['9 t 4', '25 p 4', '41 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 25: {'Mon': {'night': ['29 p 4', '33 p 4', '39 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['30 p 4']},\n 'Tue': {'night': ['29 p 4', '33 p 4', '39 p 4'],\n 'truro_twighlight': ['14 t 4'],\n 'plymouth_twighlight': ['48 p 4']},\n 'Wed': {'night': ['29 p 4', '33 p 4', '39 p 4'],\n 'truro_twighlight': ['16 t 4'],\n 'plymouth_twighlight': ['51 p 4']},\n 'Thu': {'night': ['29 p 4', '33 p 4', '39 p 4'],\n 'truro_twighlight': ['8 t 4'],\n 'plymouth_twighlight': ['22 p 4']},\n 'Fri': {'night': ['2 t 4', '10 t 4', '36 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['47 p 4']},\n 'Sat': {'night': ['2 t 4', '10 t 4', '36 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['2 t 4', '10 t 4', '36 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}},\n 26: {'Mon': {'night': ['47 p 4', '52 p 4', '56 p 4'],\n 'truro_twighlight': ['12 t 4'],\n 'plymouth_twighlight': ['39 p 4']},\n 'Tue': {'night': ['47 p 4', '52 p 4', '56 p 4'],\n 'truro_twighlight': ['19 t 4'],\n 'plymouth_twighlight': ['25 p 4']},\n 'Wed': {'night': ['47 p 4', '52 p 4', '56 p 4'],\n 'truro_twighlight': ['2 t 4'],\n 'plymouth_twighlight': ['27 p 4']},\n 'Thu': {'night': ['47 p 4', '52 p 4', '56 p 4'],\n 'truro_twighlight': ['17 t 4'],\n 'plymouth_twighlight': ['44 p 4']},\n 'Fri': {'night': ['2 t 4', '24 p 4', '41 p 4'],\n 'truro_twighlight': ['13 t 4'],\n 'plymouth_twighlight': ['49 p 4']},\n 'Sat': {'night': ['2 t 4', '24 p 4', '41 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []},\n 'Sun': {'night': ['2 t 4', '24 p 4', '41 p 4'],\n 'truro_twighlight': [],\n 'plymouth_twighlight': []}}}" }, "metadata": {}, "execution_count": 14 @@ -560,36 +623,18 @@ "cell_type": "code", "execution_count": 15, "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": "{'Test Person 1': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 2': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 3': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 4': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 5': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 6': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 7': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 8': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 9': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 11': {1: {'weekday': 'true', 'weekend': '', 'none': ''}},\n 'Test Person 12': {1: {'weekday': '', 'weekend': 'true', 'none': ''}},\n 'Test Person 13': {1: {'weekday': 'true', 'weekend': '', 'none': ''}},\n 'Test Person 14': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 15': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 16': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 17': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 18': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 19': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 20': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 21': {1: {'weekday': '', 'weekend': 'true', 'none': ''}},\n 'Test Person 22': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 23': {1: {'weekday': '', 'weekend': 'true', 'none': ''}},\n 'Test Person 24': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 25': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 26': {1: {'weekday': '', 'weekend': '', 'none': 'true'}},\n 'Test Person 27': {1: {'weekday': 'true', 'weekend': '', 'none': ''}}}" - }, - "metadata": {}, - "execution_count": 15 - } - ], + "outputs": [], "source": [ - "worker_night_block" + "#worker_night_block" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": "[[<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Mon', 'night'],\n [<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Tue', 'night'],\n [<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Wed', 'night'],\n [<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Thu', 'night'],\n [<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Fri', 'night'],\n [<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Sat', 'night'],\n [<__main__.workerClass at 0x7f3a5179cbd0>, 1, 'Sun', 'night']]" - }, - "metadata": {}, - "execution_count": 16 - } - ], + "outputs": [], "source": [ - "[[worker, week, day, shift] for day in days for shift in [\"night\"]]" + "#[[worker, week, day, shift] for day in days for shift in [\"night\"]]" ] }, { @@ -634,9 +679,9 @@ "metadata": {}, "outputs": [], "source": [ - "for worker in workers:\n", - " for shift in shifts:\n", - " a = [model.works[worker.id, week, day, shift].value for week in weeks for day in days]" + "#for worker in workers:\n", + "# for shift in shifts:\n", + "# a = [model.works[worker.id, week, day, shift].value for week in weeks for day in days]" ] }, { @@ -645,12 +690,15 @@ "metadata": {}, "outputs": [ { - "output_type": "execute_result", - "data": { - "text/plain": "[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]" - }, - "metadata": {}, - "execution_count": 20 + "output_type": "error", + "ename": "NameError", + "evalue": "name 'a' is not defined", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'a' is not defined" + ] } ], "source": [