RoosterGenerator via BiljartPoint [Beschrijving en toelichting, versie 15-07-2015] 1. 2. 3. 4. 5. 6.
1.
Inleiding Opzet Wanneer optimaliseren en wanneer niet ? Wijzigingen t.o.v. de huidige werkwijze Mogelijkheden en keuzes Reacties zijn welkom
Inleiding
Vanaf het seizoen 2015-2016 gaat BiljartPoint haar gebruikers de mogelijkheid bieden om via de website van BiljartPoint een compleet Competitierooster aan te maken op basis van de ingevoerde competities (klassen en poules), de ingevoerde teams en de ingevoerde speelweken. Wij denken daarmee tegemoet te komen aan de wens van vele gebruikers (en vooral de wedstrijdleiders teamcompetitie) om hen deze intensieve klus vlak voor aanvang van een nieuw seizoen uit handen te nemen. De voordelen zijn ons inziens groot: ▪ ▪ ▪ ▪ ▪
▪
Het basisrooster van een poule wordt automatisch aangemaakt, waarbij onderscheid wordt gemaakt tussen poules met een even aantal teams en poules met een oneven aantal teams. Het basisrooster wordt gelijk geoptimaliseerd qua uit- en thuiswedstrijden voor alle teams. Extra ronden om aan het aantal speelweken te komen, worden automatisch aangevuld. Mogelijk optredende conflicten (meer teams op een avond thuis dan er biljarttafels beschikbaar zijn) kunnen automatisch worden opgelost (zie hierover straks meer). Zolang er nog geen wedstrijden zijn gespeeld, kunnen nog simpel teams worden verwijderd of worden toegevoegd. Het programma maakt dan gewoon binnen enkele seconden een compleet nieuw competitierooster aan. De aanlevering van de Excel-sheet in een vereist formaat met de complete competitie kan vervallen.
Achtereenvolgens besteden wij aandacht aan de opzet, de veranderingen die optreden ten opzichte van de huidige werkwijze en de verschillende mogelijkheden die het programma biedt.
RoosterGenerator
Pagina 1
2.
Opzet
De wijze waarop de RoosteerGenerator van BiljartPoint werkt, kan in een drietal stappen worden uitgelegd: Stap 1 Maken basisroosters (halve competitie) voor elke klasse en elke poule
Voorbeeldrooster met 16 teams in 15 ronden.
Dit zal u bekend voorkomen. Op basis van het aantal teams in een klasse/poule wordt er een rooster gemaakt waarbij elk team één keer tegen elk ander team uitkomt (een halve competitie). Daarbij gelden de volgende uitgangspunten: ▪ Teams van een zelfde vereniging komen, zo mogelijk, in de eerste ronde tegen elkaar. ▪ Zijn er dan nog ronden waarin teams van een zelfde vereniging tegen elkaar uitkomen (bijvoorbeeld bij een vereniging met 3 teams in een klasse; die kunnen niet allemaal in de eerste ronde tegen elkaar spelen), dan worden die ronden zoveel mogelijk naar voren gehaald. ▪ De uit- en thuiswedstrijden worden geoptimaliseerd met als resultaat dat de teams nooit meer dan 1x meer uit- dan thuisspelen of nooit meer dan 1x meer thuis- dan uitspelen. ▪ Het aantal ronden wordt aangevuld tot het aantal opgegeven speelweken. Daarbij wordt eerst gekeken of er nog een complete halve competitie kan worden toegevoegd, maar nu met omkering van de uit- en thuiswedstrijden, om tot een volledige competitie te komen. Moeten er dan nog meer ronden worden toegevoegd, dan worden, zo mogelijk, die ronden gekozen waarin teams van een zelfde vereniging niet meer tegen elkaar spelen (noot: zeker bij het toevoegen van slechts enkele ronden is het om mogelijke competitie-vervalsing tegen te gaan, gewenst dat teams van dezelfde vereniging in dit laatste stadium van de competitie niet meer tegen elkaar spelen).
RoosterGenerator
Pagina 2
Stap 2 Bijeen brengen van alle basisrooster tot een compleet competitie-rooster
Voorbeeld van een normale competitie met 5 klassen, waarvan 2 onderverdeeld in een poule A en een poule B, bijeengebracht en getoond voor de eerste week in de competitie. Naast de teamnummers staat het verschil in uit- en thuiswedstrijden: 0 of maximaal -1 of +1. NB: dit overzicht ziet u niet in BiljartPoint, doch is alleen opgenomen om duidelijk te maken dat er verschillende competities bij elkaar gevoegd kunnen worden, waarmee het programma verder kan werken om bijvoorbeeld conflicten op te lossen of teams aan elkaar te koppelen.
Alle aangemaakte competities uit stap 1 worden nu voorzien van de juiste speelweken en bij elkaar gevoegd. De speeldagen van een team worden omgezet naar de juiste datum in een speelweek en het competitierooster zou daarmee gereed zijn, ware het niet dat er waarschijnlijk nog wel wat conflicten opgelost moeten worden; zie de volgende stap. Met nadruk wordt er op gewezen, dat tot op dit moment de verschillende roosters per klasse en per poule optimaal zijn. Dat betekent dat de verschillen tussen de aantallen uit- en thuiswedstrijden nooit meer dan -1 of +1 bedraagt en dat elke teamontmoeting A-B in de eerste halve competitie, gewisseld wordt in een ontmoeting B-A in de tweede helft van de competitie. Zou elke vereniging over voldoende tafels beschikken om alle ingeschreven teams op een dagdeel thuis te kunnen ontvangen, dan zou het roosterprogramma hiermee klaar zijn! De praktijk wijst echter uit dat deze optimale situatie veelal niet kan worden gerealiseerd. Bij veel verenigingen worden er meer teams op een dagdeel ingeschreven dan er tafels beschikbaar zijn, zodat er onvermijdelijk teams verplaatst moeten worden. Deze verstoring van het ideale rooster kan BiljartPoint uiteraard niet voorkomen, maar we proberen wel de "verstoringen" die optreden bij het oplossen van conflicten daarna zoveel mogelijk weer te optimaliseren. Stap 3 Oplossen conflicten en optimaliseren uit- en thuiswedstrijden In feite het lastigste deel van het maken van een compleet competitierooster, maar dat weet u als wedstrijdleider teams natuurlijk ook wel en daar is deze aanvullende functionaliteit natuurlijk ook voor bedoeld. Bij het oplossen van conflicten gaan wij als volgt te werk: ▪ Per speelweek, per vereniging en per dagdeel wordt er bekeken of er een conflict optreedt, te weten meer teams thuis dan er bij de vereniging (of in de lokaliteit) tafels beschikbaar zijn. ▪ Bij een conflict wordt er gekeken hoeveel teams er thuis spelen en hoeveel teams er verplaatst moeten worden. Met verplaatsen, bedoelen we wisselen van de thuis- naar een uitwedstrijd. ▪ Per team dat thuis speelt, wordt een eventuele verplaatsing "geëvalueerd"; wat is het effect van die verplaatsing op de situatie bij de vereniging die nu een team meer thuis krijgt en wat is het effect op het aantal uit- en thuiswedstrijden in de hele competitie van beide teams die bij die wisseling betrokken worden. Elke evaluatie krijgt een bepaalde waarde (zeg: 0 levert geen problemen op; 2, 3, 4 of meer geeft een vermeerdering van de onevenwichtigheid in de uit- en thuiswedstrijden aan en 99 geeft aan dat er een nieuw conflict wordt gegenereerd bij het verplaatsen van een team, maar nu bij die andere vereniging). Op basis van die evaluatie per RoosterGenerator
Pagina 3
▪ ▪
▪
team worden nu de noodzakelijke teams verplaatst; laagste cijfer eerst en zo voort. Daarbij kan het voorkomen dat er een team wordt verplaatst (met waarde 99) dat vervolgens een conflict oplevert bij een andere vereniging, gewoonweg omdat er geen andere mogelijkheden zijn. Omdat we deze hele procedure een paar keer doorlopen, blijkt uit ervaring dat het conflict dat we hebben veroorzaakt bij die andere vereniging, vaak wel op te lossen is. Is er opgegeven dat teams 2 tafels nodig hebben (bijvoorbeeld in de A-, de C1- of in een kadercompetitie) dan blijven die teams gekoppeld aan 2 tafels, of thuis of uit. Als alle conflicten op deze manier zijn opgelost, lopen we het hele rooster nog twee keer door. Eerst kijken we of we teamontmoetingen nog kunnen wisselen als daarmee de uit- en thuiswedstrijd tegen hetzelfde team alternerend kan worden gemaakt (eerst thuis tegen team A en in de volgende helft van de competitie uit tegen team A). Daarna kijken we nog een keer naar het totale verschil van alle uit- en thuiswedstrijden en we wisselen teamontmoetingen als dat een verbetering in de evenwichtigheid oplevert. U kunt bij het aanmaken van een compleet competitierooster ook aangeven dat u helemaal niet wilt dat er conflicten worden opgelost; u doet dat bijvoorbeeld liever zelf of u laat dat aan de teamleiders over.
Hierna gaan we nog wat dieper in op het al dan niet laten oplossen van conflicten door de RoosterGenerator.
RoosterGenerator
Pagina 4
3.
Wanneer optimaliseren en wanneer niet?
De RoosterGenerator lost conflicten op door per week, per vereniging en per dag situaties bij een vereniging op te sporen waar meer teams thuis zijn ingeroosterd dan er tafels beschikbaar zijn. Alle teams die op dat dagdeel zijn ingeroosterd, worden geëvalueerd op een wisseling van thuis naar uit spelen. Het team dat het rooster het minst verstoort, wordt dan gekozen en feitelijk verplaatst. Deze werkwijze is een keuze en gebaseerd op snelheid. De basisroosters worden binnen een seconde aangemaakt en het oplossen van conflicten is eveneens seconde werk. Vooral bij het doorrekenen van verschillende varianten of bij de aanmaak van een compleet nieuw rooster als er op het laatste moment teams uitvallen of bijkomen, is dit een zeer groot voordeel. Er zijn andere manieren die bijvoorbeeld teams aan een ander volgnummer toekennen en vervolgens tal van varianten gaan doorrekenen totdat er een meest ideale variant uitkomt. Het probleem met deze werkwijze is de benodigde rekentijd. Het theoretisch aantal varianten is namelijk onnoemelijk groot en niet te behappen door onze meest moderne en snelste computers. Dat aantal varianten moet dus fors teruggebracht worden tot een aantal dat binnen een bepaalde tijd doorgerekend kan worden. Maar zelfs als we kiezen voor een uur rekenen (onacceptabel natuurlijk) dan nog hebben we maar een fractie van alle mogelijke varianten doorgerekend. Het grote nadeel van deze methode is dus de factor tijd en het feit dat we absoluut niet weten of “de beste variant” ook doorgerekend is. Onze methode is snel, maar verstoort dus de evenwichtigheid van het rooster. Die evenwichtigheid kan ook al flink verstoord zijn als er gekozen wordt om teams te koppelen. Als er dan ook nog flink wat verenigingen zijn die op een dagdeel meer teams hebben ingeschreven dan er tafels beschikbaar zijn, dan kan het resultaat zodanig onevenwichtig zijn dat u dit niet meer aanvaardbaar vindt. Teams die 3 x achter elkaar thuis of uit moeten spelen, is wellicht nog wel acceptabel, maar als dat oploopt naar 10 x achter elkaar thuis of uit, dan moet u zich afvragen of u wel moet kiezen om het programma deze conflicten te laten oplossen. Situaties die qua evenwichtigheid volledig uit de hand lopen, zullen ongetwijfeld vaker in een competitie zijn voorgekomen. In de praktijk zal dan voor het oplossen van de conflicten (dat zal toch moeten gebeuren) een scala aan ‘trucs’ worden toegepast waar de RoosterGenerator niet over beschikt. Te denken valt aan uitwijkdagen, toch maar een tafel meer gebruiken dan is opgegeven, uitwijken naar een andere lokaliteit, misschien wel partijen plannen op de middag of in het weekend of spelen in weken die niet als competitieweken zijn opgegeven. Kortom, de creativiteit van de wedstrijdleider en de betrokken teamleiders is veelal veel groter dan de “creativiteit” van de RoosterGenerator. Natuurlijk blijven wij werken aan verbeteringen van het programma, maar wij zullen het ideale schema waarmee wordt begonnen, nooit ideaal kunnen houden als er conflicten opgelost moeten worden. De keuze is aan u. Gaat het om een relatief beperkt aantal conflicten, dan is een bepaalde onevenwichtigheid zeker te verdedigen; de tijdwinst om dat via de RoosterGenerator te doen, kan daarvoor een prima argument zijn. Gaat het u vooral om een conflict-loos rooster en neemt u de onevenwichtigheid voor lief, ook dan kan de RoosterGenerator u een berg werk en heel veel tijd besparen.
RoosterGenerator
Pagina 5
Kunt u het rooster niet meer “verkopen” aan uw leden, kies dan om niet te optimaliseren en gebruik uw creativiteit en die van uw teamleiders om zelf conflicten op te lossen. Bedenk wel, in het laatste geval, dat u dan zeer waarschijnlijk een competitie hebt met de volgende kenmerken: ● Er zijn relatief veel te veel teams ten opzichte van de beschikbare tafels bij de lokaliteiten; ● Er zijn veel te weinig dagdelen beschikbaar waarop teams ingeroosterd kunnen worden; ● Er zijn (wellicht) te veel teams die aan elkaar gekoppeld moeten worden qua uit- en thuiswedstrijden omdat de lokaalhouders dat eisen.
Natuurlijk bepaalt u als wedstrijdleider wat toegestaan is, maar soms sluipen al die beperkingen er gewoon in de afgelopen jaren. Het herkennen van deze problemen kan wellicht ook een aanzet zijn tot het oplossen daarvan.
4.
Wijzigingen t.o.v. de huidige werkwijze
Om u als BiljartPoint een compleet competitierooster te kunnen aanbieden, hebben wij meer gegevens van u nodig dan u tot nu toe gewend was om op te geven. Onze wensen op een rijtje: ▪
Per team dat u invoert, dient nu ook opgegeven te worden op welk dagdeel dit team speelt. U kunt daarbij kiezen uit 14 dagdelen, te weten een avond (1 – 7) of een middag (8 – 14) per dag in de week, waarbij 1 = maandag en 7 = zondag op de avond en 8 = maandag en 14 = zondag in de middag. ▪ Per competitie (A, B1, B2, C1, etc) willen we graag de volgende extra gegevens hebben: ○ Op hoeveel tafels wordt er standaard gespeeld (1 of 2). ○ Is het een avond- of een middagcompetitie. ○ Worden de uit- en thuiswedstrijden op één avond gespeeld ? ○ Wat is het formaat van de tafels waarop wordt gespeeld (klein of groot). ○ Uit hoeveel speelweken bestaat een competitie (mag per competitie verschillen) en de bijbehorende speelweeknummers. NB: als u verschillende competities wilt "koppelen" in de zin van wachten op elkaar halverwege de competitie om gelijktijdig de moyennes te kunnen aanpassen, dan moet dat blijken uit de start van de speelweken voor elke competitie in die tweede periode. ▪ Per lokaliteit: ○ Hoeveel tafels (in de formaten klein en groot) zijn er totaal beschikbaar en zijn alle aanwezige tafels vrij in te vullen of strikt gekoppeld aan een vereniging. Voor dat laatste geven wij u een voorbeeld. In lokaliteit 't BiljartCentrum spelen OnderOns en Concordia. In 't BiljartCentrum staan 5 tafels. OnderOns huurt op woensdagavond 3 tafels en Concordia op woensdagavond 2 tafels. OnderOns heeft 5 teams op woensdagavond en Concordia 2 teams op woensdag- avond. De vraag is nu: als het rooster aangeeft dat 1 team van Concordia in een bepaalde speelweek uitspeelt en er 4 teams van OnderOns thuis spelen, mag die vrije tafel van Concordia dan gebruikt worden door OnderOns? In sommige lokaliteiten is dat geen probleem, in andere echter wel. Is het medegebruik van tafels mogelijk, dan is dit een flexibele lokaliteit, anders niet. ▪ Per vereniging of club: ○ In welke lokaliteit speelt de vereniging.
RoosterGenerator
Pagina 6
○ Hoeveel tafels (groot en klein) zijn er per dagdeel (1 – 14) beschikbaar voor de
teamcompetitie. Let op: er kunnen op maandag wel 4 tafels zijn, maar als er maar 2 beschikbaar zijn voor de teamcompetitie, dan geeft u hier 2 tafels aan. Dit betekent dat u alle gegevens van uw verenigingen en lokaliteiten up-to-date moet hebben, als u met RoosterGenerator wilt gaan werken. Uiteraard hebben wij de eventueel extra benodigde velden al voor u aangemaakt.
5.
Mogelijkheden en keuzes
We zetten de mogelijkheden van RoosterGenerator nog een keer voor u op een rijtje: ● ● ● ● ● ● ● ● ● ●
U kunt net zoveel competities aanmaken en aan elkaar koppelen als u wilt. Competities mogen verschillende aantallen speelweken hebben. U kunt competities aanmaken binnen een heel kalenderjaar of verspreid over twee jaar. U kunt kiezen tussen een avond- en een dagcompetitie. U kunt kiezen voor kleine tafels of matchtafels. U kunt per competitie kiezen of er 1 of 2 tafels per teamontmoeting gebruikt moeten worden. U kunt per competitie kiezen of de thuis- en uitwedstrijden op één dagdeel gespeeld worden. De consequenties daarvan worden hierna apart uitgelegd. U kunt kiezen om conflicten op te lossen of niet. U kunt per lokaliteit aangeven of het een flexibele lokaliteit is of niet. U kunt in elke competitie 2 koppels van 2 teams aangeven, die dan altijd of samen thuis of samen uit spelen. De twee teams in een koppel kunnen in dezelfde competitie spelen (beide in de C1 bijvoorbeeld) of in twee verschillende competities spelen (team A in de C1 en team B in de C3A bijvoorbeeld). Beide teams van een koppel moeten wel lid zijn van dezelfde vereniging of allebei lid zijn van een vereniging die in dezelfde lokaliteit speelt. Ook moeten beide teams van een koppel op dezelfde speeldag spelen.
Welke competities kunt u niet in één run koppelen? ● Competities uit verschillende seizoenen. ● Competities die gebruik maken van een verschillend formaat tafels. Dat heeft ook weinig zin, omdat die competities onderling geen conflicten kunnen opleveren. Heeft u bijvoorbeeld een A-competitie, een B- en een C-competitie, dan maakt u apart het rooster aan voor de A-competitie en een apart gecombineerd rooster voor de B- en de C-competitie. Een kadercompetitie met 2 tafels (klein) kunt u uiteraard wel combineren met de B- en de C-competitie. ● Competities die ‘s middags gespeeld worden met competities die ‘s avonds gespeeld worden.
Deze competities maakt u dus afzonderlijk aan. Welke competities, binnen één run (dus gekoppeld), worden niet bij het oplossen van conflicten betrokken en worden ook niet daarna geoptimaliseerd? Competities met twee partijen op één dagdeel. Wij gaan ervan uit dat het onwenselijk is om die competitie te optimaliseren. Als er dan teamontmoetingen gewisseld worden, kan het resultaat zijn dat teams wel 6 x of meer in dezelfde lokaliteit tegen elkaar moeten spelen. RoosterGenerator
Pagina 7
Het programma negeert deze competities bij het oplossen van conflicten, doch lost wel de conflicten op van de andere gekoppelde competities. Extra aandacht voor de keuze om een uit- en een thuis-wedstrijd te spelen op één dagdeel ! Bij deze keuze maakt het programma eerst een volledig rooster, gebaseerd op het aantal speelweken dat u hebt opgegeven. Daarna wordt elke wedstrijd in een teamontmoeting gedupliceerd met verwisseling van uit- en thuisspelend team. De speeldatum blijft hetzelfde, maar de tweede partij wordt wel aan een volgende ronde gekoppeld. Dus bij de eerste teamontmoeting op bijvoorbeeld donderdag 5 januari speelt team A tegen team B in ronde 1 en op dezelfde dag team B tegen team A in ronde 2. Dit betekent dat het aantal te spelen partijen het dubbele is van het aantal opgegeven speelweken ! Als u 24 speelweken opgeeft, spelen de teams dus 48 partijen, in elke opgegeven speelweek 2 partijen. Vaak speelt men bij dit systeem om de 14 dagen. Dat moet dan blijken uit de opgegeven weeknummers. Normaal geeft u bijvoorbeeld op de weken 2, 3, 4, 5, 6, etc., maar dan geeft u dus op week 2, 4, 6, etc. Met andere woorden: bij de keuze 2 partijen (uit en thuis) op één dagdeel, worden er 2x zoveel partijen aangemaakt dan het aantal speelweken dat u opgeeft. Wilt u 24 partijen laten spelen, dan geeft u dus 12 weken op waarin dat moet gebeuren; in elke week 2 partijen.
6.
Reacties zijn welkom !
Graag vernemen wij van u of wij op de goede weg zijn en of u nog wensen hebt die we kunnen meenemen in het verbeteren van deze functionaliteit. Uw reacties zijn zeer welkom en wij verzoeken u die via email toe te zenden aan ons team,
[email protected] Via dit e-mailadres kunt u ook ondersteuning krijgen van ons team.
RoosterGenerator
Pagina 8