Note that as of 30 Apr 2015 all automatic processing of the rosters as described here has been disabled, as per Council Correspondence 28 Apr 2015, item 5.5. For the substitute scheme, please see GwucIgor

Automatic Roster Allocation Process

A start has been made on automating church rosters so that the tedium of drafting a roster is no longer required. A computer program has been constructed that inputs data from the wiki, and generates a new roster based on that information. To date, only the Elders roster has been so automated, but as this is the most complicated of rosters currently maintained, it is expected that the others will be automated in fairly quick succession.

The Elders' Roster Automation

The starting point for this roster is the data stored in the EldersRosterPreferences table, which is editable by any elder. Elders may indicate with a simple Yes/No whether they wish to be rostered for a particular duty. Data from previous roster allocations (recorded in EldersRosterPrevious) is then analysed to determine a weighted score for each elder that indicates how recently they were allocated a duty. Multiple duties will increase the score, which is then reduced slowly over time (using an exponential decay function, for the mathematically inclined). Elders are then sorted according to this weight (lowest scores going to the top of the list), and elders are then allocated from the top of this list according to the duty required and their expressed preferences.

The idea behind this weighting process is that it gives priority for allocation to those who have not been allocated for some time. Nevertheless, over time, because each allocated duty will drop you down the list, every elder gets allocated an equal number of duties over the year. (But note that this may be biassed by preferences such as only being available for one time slot, particularly 8am)

Elders may also indicate their unavailability for a particular day, which will then postpone their duty until the next day that they are available. They will stay close to the top of the list, and indeed, if they are away for an extended period, may find that they stay close to the top of the list even after performing several duties on their return! This effectively "catches up" the missed weeks. If you would prefer to spread your "catch-ups" over several weeks, simply add further entries to your unavailability (for example, indicate that you are unavailable for alternate weeks.)

The program runs automatically once each week, computing the allocations for the Sundays 12 (!) months in the future. Thus, there is always a 12 month window of allocations. Currently, the program is set so that the next four weeks are flagged as definitive, and will not be further changed each week when the program runs. Beyond 4 weeks, elders are free to add or alter their availability, and this will be taken into account when re-computing those allocations. Thus, elders need to be aware that their allocations may change because of others unavailability, and hence these subsequent 8 weeks are deemed to be tentative. This is particularly so the further you look into the future!. Note that the current definitive roster will be posted on the office Notice Board each week, so you can rely on that to check your diary entries.

Note that this system means that

  1. If you find yourself unavailable for a duty in the definitive next 4 weeks section, it is your responsibility to arrange a swap (as it always has been).

  2. If you are unavailable in the tentative 8 weeks section, simply add your name to the unavailable column for the relevant date(s). That's all! No need to arrange a swap! The computer will do it for you.

More discussion may needed. (You can add comments following if you like!)

JohnHurst Suggest that the "definitive" and "tentative" periods become 3 and 9 months respectively. That way, the definitive roster behaves much as it has done in the past (except that it is automatic, and becomes a rolling period of 3 months), while the "tentative" period allows grey nomads to plan their sojourns away with much greater flexibility and ease.

Questions for Resolution

Monthly Bulletin Insert

The Elders' rosters are now allocated automatically. Each week, a computer program works out who should next be rostered at the end of a three month period, and adds those people to the end of the roster. In this way, the roster will always show who is rostered for the next three months, and you can plan ahead on that basis.

Note that the roster is now split into two parts - the next month (4 week period), and the following two months (8 week period). The first part will be published each week on the Office Notice Board, and is regarded as DEFINITIVE (that is, no changes will be made by the computer). If you find that you need to swap a rostered duty during this time, IT WILL BE YOUR RESPONSIBILITY TO ARRANGE A SWAP (as it always has been).

On the other hand, the second part of the roster is to be regarded as TENTATIVE - that is, it may change before it gets published as definitive. What might change it? Any elder may update their unavailable status for a rostered duty during this second period, and that unavailability will be taken into account when the roster program runs each week.

As always, if you have any questions, please contact JohnHurst or DavidMorgan for assistance. If you are unable or unwilling to update the wiki page yourself, simply pass on your request to either of us, or the ChurchOffice, and we will make the necessary changes for you.

NOTE THAT FOR THIS SYSTEM TO WORK, YOU MUST MAKE YOUR AVAILABILITY AND PREFERENCES FOR ROSTER DUTIES KNOWN. CONTACT JohnHurst or DavidMorgan FOR ASSISTANCE.

John Hurst Elders Roster Coordinator

An Explanation

(Composed in response to a query from Geraldine Fleming as to why she got two allocations in a row. The explanation may help others.)

I haven't saved the calculations that caused you to get two in a row, and things have changed since then. To keep faith with NOT changing things too much (my mistake, obviously, but I had to give some leeway for the newness of the system), I have left January as previously computed. (subsequent note: this action prompted the idea for the "definitive" allocations)

But if I were to recalculate now, a similar scenario arises. What the program does is to compute a weighted list, which is sorted into least weight first, and these are the first choices to allocate. After crossing out people whose preference is not for 11am vestry (10am=11am for January), I get a list of people to allocate. Because the program recomputes the weights each time, it may take one or two weeks to gain "enough weight" to drop off the top of the allocation list. This will usually be because either a) you haven't been rostered for a while, or b) if you have been rostered recently, then you haven't done as many rostered duties as some other elders.

Over time, things will balance out. The hassle is that the program has no concept of trying to spread duties out in the short term, and allocates rather mindlessly - my apologies, but I struggled to find a better algorithm, and time was running out. If I had my time again, and knowing how much angst this seems to cause, I would NOT, spelt N O T, have volunteered to try this out!!!!! (We would not have had a roster at all, I suspect!)

The key thing to keep in mind is that the program tries to keep each person at a similar weight. But this is confounded by people being unavailable, or not having a preference for that time and duty (some people don't want to do vestry, for example). Starting in January when everyone's away exacerbates this!

Here are the calculations, showing first the weights, then the filtered list:

(First week of allocation) Allocating for 2012-01-01 roster line=[datetime.date(2012, 1, 1), 'Jan', '1', '10.00am', 'ElwynPederson', 'GeraldineFleming', 'BarbaraKrieger JohnHurst ShirleyHarding MargaretDuncan', 'MargaretFraser']

Unavailable on 2012-01-01 are ['MargaretFraser']

(This is the weighted list) [(0.0, 'BelindaChung'), (0.0, 'GailIrvine'), (0.0, 'MarkEaston'), (0.59438470129595378, 'JohnBattisson'), (0.75578374145572547, 'RossMackinnon'), (0.8490579173832502, 'ElwynPederson'), (1.0269326747386731, 'BarbaraKrieger'), (1.0930827467010273, 'KayeMackinnon'), (1.1710498985677789, 'BelindaClear'), (1.2123752609808356, 'DougNewberry'), (1.2430197929243954, 'PeterThorpe'), (1.5310710752019889, 'LoisHosking'), (1.6284574580842612, 'JohnKenez'), (1.8044742604393389, 'MargaretFraser'), (1.8317979824665716, 'KayeMorgan'), (1.8777150429279124, 'GeraldineFleming'), (1.8791738033406871, 'ShirleyHarding'), (1.9690824046692434, 'MargaretDuncan'), (1.9694772122951953, 'JonathanChong'), (2.015778118720569, 'IanMcMillan'), (2.0420866166008196, 'GaelOBrien'), (2.1467052642642956, 'JohnHurst'), (2.3335159882028536, 'JanClear'), (2.3442117837211462, 'SueMorgan'), (2.5164994472570124, 'AlanBarnard'), (2.56520343987129, 'MikePatterson'), (2.6530534137187942, 'LaurelMuir'), (2.7152388876658593, 'MarjorieBedford'), (2.722351603105011, 'JitTan'), (2.841776372682407, 'BeverlyMcGlead'), (2.8473379000977066, 'PeterBarr'), (2.9774415395220291, 'JudyLowe'), (3.0357777118498435, 'DavidJackson'), (3.396698468157564, 'BevRichardson'), (3.4063624986269767, 'HerbFleming'), (3.4859180154258524, 'JoyJackson'), (3.689340361471412, 'GraemeFrecker'), (3.7581231076425077, 'KenDevos'), (3.8152591655092394, 'GlennLaub')]

emptySlots=[(datetime.date(2012, 1, 1), 'Jan', '1', '11.00am', '10.00am')]

(This is the welcome list, Elwyn gets allocated) 11.00am welcome: ['ElwynPederson', 'BarbaraKrieger', 'GeraldineFleming', 'ShirleyHarding', 'MargaretDuncan', 'MarjorieBedford', 'BeverlyMcGlead', 'DavidJackson', 'BevRichardson', 'JoyJackson', 'GraemeFrecker', 'KenDevos'] already allocated today=['MargaretFraser', 'ElwynPederson'] (including just allocated: ElwynPederson)

(This is the vestry list, Geraldine gets allocated) 11.00am vestry: ['GeraldineFleming', 'ShirleyHarding', 'MargaretDuncan', 'JohnHurst', 'MarjorieBedford', 'BeverlyMcGlead', 'DavidJackson', 'BevRichardson', 'HerbFleming', 'JoyJackson', 'GraemeFrecker', 'KenDevos'] already allocated today=['MargaretFraser', 'ElwynPederson', 'GeraldineFleming'] (including just allocated: GeraldineFleming)

11.00am communion: ['BarbaraKrieger', 'ShirleyHarding', 'MargaretDuncan', 'JohnHurst', 'MarjorieBedford', 'BeverlyMcGlead', 'DavidJackson', 'BevRichardson', 'HerbFleming', 'JoyJackson', 'GraemeFrecker', 'KenDevos'] already allocated today=['MargaretFraser', 'ElwynPederson', 'GeraldineFleming', 'BarbaraKrieger', 'ShirleyHarding', 'MargaretDuncan', 'JohnHurst'] (including just allocated: BarbaraKrieger ShirleyHarding MargaretDuncan JohnHurst)

(Start new week) Allocating for 2012-01-08 roster line=[datetime.date(2012, 1, 8), 'Jan', '8', '10.00am', 'ElwynPederson', 'GeraldineFleming', ' ', 'JohnHurst KayeMorgan MargaretFraser IanMcMillan']

Unavailable on 2012-01-08 are ['JohnHurst', 'KayeMorgan', 'MargaretFraser', 'IanMcMillan']

[(0.0, 'BelindaChung'), (0.0, 'GailIrvine'), (0.0, 'MarkEaston'), (0.55420062213499044, 'JohnBattisson'), (0.70468808971871344, 'RossMackinnon'), (1.0191835976698569, 'KayeMackinnon'), (1.0918796882260846, 'BelindaClear'), (1.1304112007453921, 'DougNewberry'), (1.1589839729434779, 'PeterThorpe'), (1.4275612083550899, 'LoisHosking'), (1.5183636698975149, 'JohnKenez'), (1.6824806486129962, 'MargaretFraser'), (1.7079571181680158, 'KayeMorgan'), (1.724050174816306, 'ElwynPederson'), (1.8363283811896354, 'JonathanChong'), (1.8794990601966977, 'IanMcMillan'), (1.8898994992917726, 'BarbaraKrieger'), (1.9040289410312516, 'GaelOBrien'), (2.175755886052062, 'JanClear'), (2.1857285796922956, 'SueMorgan'), (2.3463685324191728, 'AlanBarnard'), (2.3917798341374703, 'MikePatterson'), (2.4736906068317825, 'LaurelMuir'), (2.5316719584279488, 'MarjorieBedford'), (2.5383038103461635, 'JitTan'), (2.6496547274438189, 'BeverlyMcGlead'), (2.6548402612350821, 'PeterBarr'), (2.6831637214763662, 'GeraldineFleming'), (2.6845238606699606, 'ShirleyHarding'), (2.768354084905094, 'MargaretDuncan'), (2.7761480905815921, 'JudyLowe'), (2.830540377137015, 'DavidJackson'), (2.9339685414655432, 'JohnHurst'), (3.1670606597941142, 'BevRichardson'), (3.1760713420791769, 'HerbFleming'), (3.2502484142818728, 'JoyJackson'), (3.4399181525655216, 'GraemeFrecker'), (3.5040507600116113, 'KenDevos'), (3.5573240672603399, 'GlennLaub')] emptySlots=[(datetime.date(2012, 1, 8), 'Jan', '8', '11.00am', '10.00am')]

(This is the welcome list, Elwyn gets allocated - again, because her weight went from 0.85 to 1.72, not enough to push her below others in line) 11.00am welcome: ['ElwynPederson', 'BarbaraKrieger', 'MarjorieBedford', 'BeverlyMcGlead', 'GeraldineFleming', 'ShirleyHarding', 'MargaretDuncan', 'DavidJackson', 'BevRichardson', 'JoyJackson', 'GraemeFrecker', 'KenDevos'] already allocated today=['JohnHurst', 'KayeMorgan', 'MargaretFraser', 'IanMcMillan', 'ElwynPederson'] (including just allocated: ElwynPederson)

(This is the vestry list, Marjorie gets allocated. Note that Geraldine is only 2 behind her) 11.00am vestry: ['MarjorieBedford', 'BeverlyMcGlead', 'GeraldineFleming', 'ShirleyHarding', 'MargaretDuncan', 'DavidJackson', 'BevRichardson', 'HerbFleming', 'JoyJackson', 'GraemeFrecker', 'KenDevos'] already allocated today=['JohnHurst', 'KayeMorgan', 'MargaretFraser', 'IanMcMillan', 'ElwynPederson', 'MarjorieBedford'] (including just allocated: MarjorieBedford)

(Start next week) Allocating for 2012-01-15 roster line=[datetime.date(2012, 1, 15), 'Jan', '15', '10.00am', 'ElwynPederson', 'DavidJackson', 'MarjorieBedford BeverlyMcGlead ShirleyHarding', 'JohnHurst BarbaraKrieger SueMorgan MargaretFraser']

Unavailable on 2012-01-15 are ['JohnHurst', 'BarbaraKrieger', 'SueMorgan', 'MargaretFraser']

[(0.0, 'BelindaChung'), (0.0, 'GailIrvine'), (0.0, 'MarkEaston'), (0.51673323506669666, 'JohnBattisson'), (0.65704681981505675, 'RossMackinnon'), (0.9502804878168849, 'KayeMackinnon'), (1.0180618733828348, 'BelindaClear'), (1.0539884175274659, 'DougNewberry'), (1.0806294937425416, 'PeterThorpe'), (1.3310492482077536, 'LoisHosking'), (1.415712902182158, 'JohnKenez'), (1.5687345588781088, 'MargaretFraser'), (1.5924886616442313, 'KayeMorgan'), (1.7121812339391105, 'JonathanChong'), (1.7524333082464385, 'IanMcMillan'), (1.7621306133829946, 'BarbaraKrieger'), (1.775304817539606, 'GaelOBrien'), (2.0286613417789332, 'JanClear'), (2.0379598196969022, 'SueMorgan'), (2.1877395188494262, 'AlanBarnard'), (2.2300807359254513, 'MikePatterson'), (2.306453834169349, 'LaurelMuir'), (2.3666987858104824, 'JitTan'), (2.4705216927531963, 'BeverlyMcGlead'), (2.4753566524130837, 'PeterBarr'), (2.5017652717004086, 'GeraldineFleming'), (2.5030334570787285, 'ShirleyHarding'), (2.5398875481124419, 'ElwynPederson'), (2.5811962400768964, 'MargaretDuncan'), (2.5884633228019749, 'JudyLowe'), (2.6391783546368046, 'DavidJackson'), (2.7356141358609412, 'JohnHurst'), (2.952947786459287, 'BevRichardson'), (2.961349290935015, 'HerbFleming'), (3.0305115346355262, 'JoyJackson'), (3.2073584264343795, 'GraemeFrecker'), (3.267155273271567, 'KenDevos'), (3.2929091079733563, 'MarjorieBedford'), (3.316826975716233, 'GlennLaub')] emptySlots=[(datetime.date(2012, 1, 15), 'Jan', '15', '11.00am', '10.00am')]

11.00am welcome: ['BeverlyMcGlead', 'GeraldineFleming', 'ShirleyHarding', 'ElwynPederson', 'MargaretDuncan', 'DavidJackson', 'BevRichardson', 'JoyJackson', 'GraemeFrecker', 'KenDevos', 'MarjorieBedford'] already allocated today=['JohnHurst', 'BarbaraKrieger', 'SueMorgan', 'MargaretFraser', 'BeverlyMcGlead'] (including just allocated: BeverlyMcGlead)

(This is the vestry list, note that Geraldine back on top and gets allocated) 11.00am vestry: ['GeraldineFleming', 'ShirleyHarding', 'ElwynPederson', 'MargaretDuncan', 'DavidJackson', 'BevRichardson', 'HerbFleming', 'JoyJackson', 'GraemeFrecker', 'KenDevos', 'MarjorieBedford'] already allocated today=['JohnHurst', 'BarbaraKrieger', 'SueMorgan', 'MargaretFraser', 'BeverlyMcGlead', 'GeraldineFleming'] (including just allocated: GeraldineFleming)

11.00am communion: ['ShirleyHarding', 'ElwynPederson', 'MargaretDuncan', 'DavidJackson', 'BevRichardson', 'HerbFleming', 'JoyJackson', 'GraemeFrecker', 'KenDevos', 'MarjorieBedford'] already allocated today=['JohnHurst', 'BarbaraKrieger', 'SueMorgan', 'MargaretFraser', 'BeverlyMcGlead', 'GeraldineFleming', 'ShirleyHarding', 'ElwynPederson', 'MargaretDuncan'] (including just allocated: ShirleyHarding ElwynPederson MargaretDuncan)

(Start next week) Allocating for 2012-01-22 roster line=[datetime.date(2012, 1, 22), 'Jan', '22', '10.00am', 'BarbaraKrieger', 'JohnHurst', ' ', ' ']

Unavailable on 2012-01-22 are []

[(0.0, 'BelindaChung'), (0.0, 'GailIrvine'), (0.0, 'MarkEaston'), (0.48179887491619566, 'JohnBattisson'), (0.61262639418441611, 'RossMackinnon'), (0.88603565401767326, 'KayeMackinnon'), (0.94923459902402718, 'BelindaClear'), (0.98273228675505941, 'DougNewberry'), (1.0075722615736393, 'PeterThorpe'), (1.2410620930193679, 'LoisHosking'), (1.3200019607557585, 'JohnKenez'), (1.4626784077708326, 'MargaretFraser'), (1.484826586387376, 'KayeMorgan'), (1.5964272010837668, 'JonathanChong'), (1.633957986406315, 'IanMcMillan'), (1.6429996937853819, 'BarbaraKrieger'), (1.6552832403231856, 'GaelOBrien'), (1.8915112977567858, 'JanClear'), (1.9001811411020324, 'SueMorgan'), (2.0398348069392176, 'AlanBarnard'), (2.0793134960681994, 'MikePatterson'), (2.1505233008778797, 'LaurelMuir'), (2.2066953214686054, 'JitTan'), (2.3080072447730355, 'PeterBarr'), (2.4134672052337773, 'JudyLowe'), (2.4607535874929054, 'DavidJackson'), (2.5506697139240924, 'JohnHurst'), (2.7533102665995886, 'BevRichardson'), (2.7611437774506706, 'HerbFleming'), (2.8256302260478554, 'JoyJackson'), (2.9905211750306826, 'GraemeFrecker'), (3.0462753854715388, 'KenDevos'), (3.0702881017863657, 'MarjorieBedford'), (3.0925889738551522, 'GlennLaub'), (3.2358929781726107, 'BeverlyMcGlead'), (3.2650242980947346, 'GeraldineFleming'), (3.266206746303975, 'ShirleyHarding'), (3.3005692730220604, 'ElwynPederson'), (3.339085242118117, 'MargaretDuncan')] emptySlots=[(datetime.date(2012, 1, 22), 'Jan', '22', '11.00am', '10.00am')]

11.00am welcome: ['BarbaraKrieger', 'DavidJackson', 'BevRichardson', 'JoyJackson', 'GraemeFrecker', 'KenDevos', 'MarjorieBedford', 'BeverlyMcGlead', 'GeraldineFleming', 'ShirleyHarding', 'ElwynPederson', 'MargaretDuncan'] already allocated today=['BarbaraKrieger'] (including just allocated: BarbaraKrieger)

(This is the vestry list, note that Geraldine is now way down the list) 11.00am vestry: ['DavidJackson', 'JohnHurst', 'BevRichardson', 'HerbFleming', 'JoyJackson', 'GraemeFrecker', 'KenDevos', 'MarjorieBedford', 'BeverlyMcGlead', 'GeraldineFleming', 'ShirleyHarding', 'ElwynPederson', 'MargaretDuncan'] already allocated today=['BarbaraKrieger', 'DavidJackson'] (including just allocated: DavidJackson)

I hope this helps!

cheers,
--John Hurst
--5 Fran Court, Glen Waverley, VIC 3150                      ~ ~~~&#:
-- [email protected]  +61 3 9803 9346              _..___  ---____@___H__
--(mob 0407 569 292)                             |_____[_|_________[__]_
-- http://www.ajhurst.org/~ajh                    oo oo  oo O--O--O o=o
--
-- If Christmas were all year round, what would you do?  Live to Party, or be a Party to Life?

RosterAutomaticAllocation (last edited 2015-10-07 03:05:57 by DavidMorgan)