UP

Most of the detail (i.e. which courses run and when) is hopelessly out of date, and I have removed it from public view. However, if you want to see the equivalent current information, please look at the current departmental timetable

How I create the timetables for 1999/2000

Timetabling is NP-complete. We might get lucky, and have a problem with many solutions, so we can easily find one of them. However, the CS timetable is not easy to solve, so we just have to come up with heuristics that allow us to divide-and-conquer the problem into lots of small sub-problems, each of which can be solved by exhaustive trial-and-error.
  1. Collect the information needed to drive the process: (I ought to make more use of AcSO/Dept office) (this really needs to be complete by Easter)
    And convert this information into a digestible form (the two semesters can be dealt with independantly) semester 1 semester 2 (key) (these get out of date very fast, so for current constraints see versions below)

  2. Decide which are the worst constraints so they can be dealt with first - normally, this is the use of 1.1 and the labs.
    (To illustrate the process, here is an early look at the problem.)

    I am trying to avoid 9am lectures (and 9am examples classes and tutorials, but not 9am labs). I can't do this for the 1st and 2nd years in semester 1, as this only leaves 20 1.1 slots and I need 22 for 1st + 2nd years - I have to use at least 2 9am lectures in semester 1 (but I will still try to avoid Monday 9am, and I will see if I can avoid small lectures at 9am, as that just gives students an extra reason not to chose them). The 2nd semester is similar.
    However, I can't do this for 3rd (and 4th) years except by having two lectures at once (because no student goes to both) in several slots - but this is both unlikely and risky (students change their minds) so I don't think it will help significantly.
    e.g. last year, students did not pick the following pairs: (CS3411,CS3132) (CS3411,EM2491) (CS3411,EM2502) (CS3212,CS3241) (CS3212,CS3262) (CS3212,CS3311) (CS3212,CS3321) (CS3212,CS3382) which means that, this year, at most I can save 2 lecture slots in each semester by having CS3411 at the same time as CS3131 (semester change) or EM2491, and CS3212 at the same time as CS3262 or CS3382.

    As part of this, I have to decide how many lab slots and lab groups are necessary for 1st-year lab and 2nd-year lab

    Why are there 4 (main) 1st year lab groups, but only 3 2nd year lab groups?
    a) In the 1st year, there are 4 main activities that can run in parallel: Unix lab, Windows lab, Engineering lab, and Examples/Tutorials. By the 2nd year, the Engineering lab is barely used (CS221 and CS224 have a couple of dozen students each) so there are only 3 main activities that can run in parallel.
    b) The biggest labs seat about 65 students, and in the 1st year there are more than 3*65=195 students, but by the 2nd year student numbers have fallen and, more importantly, most course units are optional. The only 2nd year course units with excessive numbers are probably CS2011, CS2092, and CS2341 - this year I may need a 4th lab for CS2341.

    It seems that in each semester I need 7*1st-year and 6*2nd-year 2-hour lab slots (and some need to be combined into 4-hour slots). However, looking in more detail, it is clear that (if only I could solve the bigger problem) I could do better:
    In the 1st semester, the maximum number of slots for the 1st year lab is dominated by the Windows lab (CS1031, CS1311), but there are 3 unused Windows slots in the 2nd year lab timetable.
    Similarly, in the 2nd semester, the 1st year is dominated by the Unix lab (CS1052, CS1062) (although I am not yet sure what to do with CS1412), and there are at least 2 unused Unix slots in the 2nd year lab.
    However, I don't dare get bogged down at that level of detail. Also note that this is ignoring labs for CS1511, CS1522 and CS1532, which will probably use some of the spare slots. Also, this will not make much difference in making better use of 1.1

    Instead, I note that, if I allocate a 4-hour lab slot, it can only be 9am-1pm or 1pm-5pm, and (except for Wednesday morning) this then forces the lunch-time to be 1-2 or 12-1 respectively. If I have e.g. a 4-hour 1st-year lab in the morning and a 4-hour 2nd-year lab in the afternoon (the maximum in any one day) then neither 1st-years nor 2nd-years can use 1.1 between 12noon and 2pm. This is potentially a waste of 1.1 (except that there are more 1.1 slots available than I actually need, so I can afford to waste a few), as the 3rd-year can only use at most 1 of these 2 slots (they also need a lunch-hour). The only exception to this is Thursday 12-2, when non-CS students are using 1.1 anyway.

    OK, so I want to minimise 4-hour lab slots (except maybe on Wednesday and Thursday) but I need 1 (maybe 2) 4-hour lab slots in the 1st year 2nd semester (CS1222), and 1 4-hour (not 3-hour, as I split the 4-hours into 2 different 2-hour activities in other rooms) lab slot in each semester in the 2nd year (CS2211, CS2242).
    From the point of view of making a "nice" timetable, it is better to have labs first thing in the morning or last thing in the afternoon, rather than in the middle of the day with lectures before and after. (Apart from anything else, I think a 9am or 4pm lab is more acceptable than a 9am or 4pm lecture.)
    In 1 week, there are a maximum of 9 such 2-hour slots, plus 3 extra on Wednesday and Thursday, giving a total of at most 12. Unfortunately (apart from trying to interleave the 1st and 2nd year labs, which I just don't dare) I need 13 2-hour slots, so I need at least one more 4-hour lab slot. It would be best if this was at a time when 3rd years are available to use the lunch-time slot in 1.1 that would otherwise be wasted.
    In the 1st semester, the PS options mean that I have lost Tuesday lunchtime anmyway, so I might as well use that time for 4-hour labs in the same way as for Thursday. Monday lunchtime is filled up by MT lectures and BM seminars, so Monday morning could be used for a 4-hour 1st year lab. I have to decide which of the possible lab slots is not needed. (Although it is very tempting, I can't have 1st year lab on Monday 3-5pm as that will not give enough hours of lab for students taking PS options.)
    However, in the 2nd semester, there is no such obvious choice, except that I have the same problem with Monday lunchtime. Because of MT166/72, Wednesday 11-1 cannot be a 1st year lab slot, and because of the CS1532 lab, it does not look like a good 2nd year lab slot unless that is the only slot when the Windows lab is unused. The only lunch-time that 3rd years can use is Tuesday, so that is the best candidate for a 4-hour lab slot. One awkwardness is that both 1st and 2nd years would do best with the afternoon lab slots on Tuesday and Thursday, rather than the morning.

    Thus, we have: semester 1 semester 2

  3. Going into "worse constraints" in more detail, the biggest problems are in the 2nd year (2nd year modules are taken by most students, just like the 1st year BUT 2nd year non-CS students who can take CS modules [CM, EE, ABIS] have lots of non-CS options, just like 3rd years)
    and in the 1st semester (1st and 2nd year AI students can take lots of PS options)

  4. Split use of 1.1 & labs between years, starting with 2nd years, and then going to 3rd years, and then finishing with 1st years.
    trying to avoid isolated early or late activities, and 9am/4pm/friday pm lectures (except there aren't enough hours in the week)
    -> semester 1 semester 2 (key)

    I have just discovered that CM and CSwBM can't take CS205 and CS204, CSwBM can't take CS221, and CM can't take CS231 or CS235. (Last year, 13/32 CSwBM and 1/23 CM took CS205, and I will leave this option in.) I have only done the 1st semester so far, and it doesn't make any significant difference there, but I will incorporate it into the 2nd semester before I continue.

    In more detail, putting in all information about room, student and lecturer availability, and allocating course units to slots whenever possible:
    -> semester 1 semester 2 (key)

    I find this very scary - as soon as I pick out the pattern of 1st/2nd year lab times, most of the allocations of lecture to slots are forced! This just shows how close we are to not being able to have a timetable at all!

    Note that this year, it has turned out to be better to deal with the full details of the use of 1.1 as early as possible, whereas what I did in previous years assumed it was better to postpone some details to later.

    The timetable so far does not go into much detail for the 3rd years - I have only positioned the larger lectures, that go into 1.1. Let's start to look at the problem of timetabling the rest of the 3rd year lectures. Luckily, the delay means that I now have much better information about the combinations of course units that students want to do (although some information will be missing or wrong): 2nd-year 3rd-year
    I have summarised the 3rd year information
    OK, looking at the current 3rd year timetables and counting slots required and available, I have the following: semester 1 semester 2

    This is how I created the detailed 1st-year and 2nd-year labs timetables, including some possible slots for examples classes and 1st-year tutorials. (To help illustrate the process, here is a previous attempt at a 1st-year lab timetable for semester 1 which shows one way of going about it, but unfortunately refers to an earlier version of the lab slots.)

    examples classes and tutorials

  5. fix last few details:

  6. Inform central timetabling by end of April! (I sent the 1.1 timetable 27/May, and the rest on 10/Sept)

  7. Check central timetabling's version of our timetable.

  8. Deal with all the changes that happen afterwards!
  9. Generate paper copies of timetables for students and rooms. (ACSO/DeptOffice can help)