laatste update aug. 2018, versie 7.4.2

het programma balans en aanverwanten

De invoer van de programma's gebeurt met comando's in een console venster.
In MSWindows neem je daar een CMD ("Command Prompt") venster voor,
in Linux of MinGW een terminal venster.

Voor een beschrijving van deze programma's zie

http://www.pjms.nl/BALANS/balans.html

Vanaf versie 7.0 gaat het programma balans verder dan de 2-paren interacties die de kwaliteitsfactor Qf bepalen, maar beschouwt ook de "vacancy quality". In het volgende noemen we Qf1 de kwaliteitsfactor wanneer één paar afwezig is. Qf1av en Qf1max zijn de gemiddelde waarde en het maximum van Qf1. Voor een discussie zie

vacancy_quality.html

Het programma balans.


Ga naar de directory waar programma balans.exe geplaatst is.
Type daarna het commando:
balans [opties] schemafile
bijvoorbeeld: balans -s 1000 nbb14.7.txt

Schemafiles

"schemafile" in bovenstaande is het bestand waar het schema in zit, een tekstfile met layout zoals je kunt zien in bijgeleverde voorbeelden. Schemafiles die voldoen aan de standaard kunnen probleemloos verwerkt worden.
Daarnaast zijn enkele uitbreidingen toegestaan, zoals de aanduiding van spelgroepen met kleine letters en spelgroepen die geen aaneengesloten rij beginnend met A of 1 vormen. Een schema dat van deze uitbreidingen gebruikt maakt kan geconverteerd worden naar een schema dat aan de standaard voldoet met programma vernum (zie verderop) met optie -A of -AL. Voor een gedetailleerde beschrijving van de schemafiles, klik hier.

[opties] staat voor een aantal mogelijke opties.
Mogelijkheden (in het volgende is n een positief getal):

 -c   : check het schema, geen optimalisatie
 -s n : doe optimalisatie net n iteraties
 -f n : hou de eerste n posities vast.
 -r n : hou rij n vast (= ronde n)
 -t n : hou kolom n vast (= tafel n)
 -i n : hou paar n vast
 -j n : hou spelgroep n vast (n=getal of hoofdletter)
 -R n : hou alle ronden vast behalve ronde n
 -D n : hou alle tafels vast behalve tafel n
 -I n : hou alle paren vast behalve paar n (en zijn directe tegenstanders)
 -J n : hou alle spelgroepen vast behalve spelgroep vast (n=getal of hoofdletter)
 -a fixerfile: geef een file met voor iedere rij en kolom een 0 of 1 (0=vrij, 1=vast)
 -v n : paar n is afwezig
 -z   : willekeurige keuze voor NZ en OW vr de optimalisatie
 -L   : vertaal spelgroepen naar letters
 -p   : vernummer de paren, geef de permutatie op de commandoregel
 -m <filenaam> : voer het vernummerde schema uit naar file <filenaam>
        zie ook default bestand
 -Q   : (Quiet) Onderdruk uitvoer naar het scherm, laat alleen balans-getallen zien.
 -P n1-n2 (bijv. -P 4-8): voorkeur paar nrs van een afwezig paar.
 -W w1:w2 (bijv. -W 0:1): gewichtsfactoren van Qf1max en Qf1av
 -k 0 : geen optimalisatie van d4 / -k 1: wel optimalisariw van d4
 -S n:c1:c2 (e.g. -S 1:750:7.5): algoritme + optioneel temperatuur interval
 -T n : maximum tijd in seconden.
 -h   : geef een korte beschrijving van de opties

tafels vasthouden, -f -r -t -i -j -R -D -I -J -a fixerfile

Er zijn diverse opties om bepaalde tafels in bepaalde ronden vast te houden.

-r -t -i -j kun je meerdere keren gebruiken, om meerdere subsets tegelijkertijd vast te houden.
-R -D en -I kun je meerdere keren gebruiken, om meerdere subsets tegelijkertijd vrij te laten.
Bijvoorbeeld '-D1 -D3': houdt alle tafels vast behalve tafels 1 en 3.

Optie -f werkt alleen op de eerste n posities.

Optie -a <filenaam> is de meest algemene om tafels vast te houden. Voor een voorbeeld van een fixerfile zie file fixers.txt. Deze kan gebruikt worden met een aanroep zoals:

 balans -a fixers.txt mitchell14.7.txt
De fixerfile mag desgewenst extra spaties en nieuwe regels bevatten.

Opties -f -r -t -i -j overrulen de gegevens uit de fixerfile.

Opmerkingen over het vasthouden van tafels

Als je op alle tafels met dezelfde spelgroep NZ en OW verwisselt, verandert de balans van een schema niet. Daarom kunt je voor elke spelgroep n willekeurige tafel vasthouden zonder verlies van algemeenheid. Veel schema's zijn zo georganiseerd dat tafel 1, of ronde 1, of de eerste paar tafels van ronde 1, alle verschillende spelgroepen hebben. In zo'n geval kunnen de opties -t, of -r, of -f worden gebruikt om die tafels vast te houden zonder verlies van algemeenheid.
Bijv. voor een incomplete Mitchell met 16 paren en 6 rondes:
balans -f6 -s1000 16p6ronvmitchell1.asc
Maar het is niet altijd een goed idee om dit te doen. Voor grote / moeilijke schema's zal zulk vasthouden het leven lastiger maken voor programma balans, en gemiddeld iets slechtere Qf opleveren. Een betere aanpak is om niets vast te houden tijdens zeer lange optimalisatie runs (en gebruik ook optie -S). Wanneer de kwaliteit bevredigend is of er geen optimalisatietijd meer beschikbaar is, kun je het resultaat verfraaien met optie -J van vernum om het schema te herleiden tot dezelfde structuur als wanneer je de eerste ronde of tafel had vastgehouden.
Als je meer dan n ronde / tafel vastlegt, wordt het leven gewoonlijk gemakkelijker voor balans. Maar dan moet je oppassen dat je zo de optimale oplossing niet volledig uitsluit.

aantal iteraties, optie -s

Als je optie -s niet gebruikt neemt het programma een defaultwaarde, momenteel 2000. Dit is vaak voldoende voor kleine schema's, zeg 20 paren of minder, maar als je erg zeker van je zaak wil zijn is het raadzaam een groter getal te nemen. Voor grote of moeilijke schema's is optie -S ook aan te bevelen (-S1 ...).

maximum tijd, optie -T

Hiermee geef je de maximum tijd op (in seconden). Bij de limiet die het eerst bereikt wordt, aantal iteraties of tijd, rondt het programma de lopende iteratie af en voert de resultaten uit.

voorkeur voor paar nrs van een afwezig paar, optie -P nfirst-nlast

Het argument bestaat uit twee delen, gescheiden door '-' or a ':'.
voorbeelden: -P 4-8,  -P8
Als nlast=nfirst kan het laatste deel worden weggelaten: -P8 is equivalent met -P8-8.
Het programma selecteert de maximale Qf1 in het opgegeven gebied, wanneer er een keuze mogelijk is tussen equivalente schema's.
Default is: beschouw alle paren.

gewichtsfactoren van Qf1max en Qf1av, optie -W w1:w2

Het argument bestaat uit twee delen, gescheiden door ':'.
voorbeelden: -W 1:5 ,   -W0
Als w2 niet gegeven wordt: w2=1.0.
De getallen w1 en w2 zijn het relatieve gewicht dat aan de "vacancy quality" parameters Qf1max en Qf1av gegeven wordt.
De weegfunctie is Fw = w1 * Qf1max + w2 * P * Qf1av
waarin P het aantal paren in het schema.
Normaal zijn de default waarden w1 = 2.0, w2 = 1.0
Maar, als optie -v geselecteerd is, of als P oneven is, wordt de default w1 = 0, w2 = 1.
Qf1max in deze vergelijking is het maximum in het gebied opgegeven met optie -P, maar Qf1av is altijd het gemiddelde over alle paren.
w1 en w2 kunnen in de gebruikelijke notatie voor rele getallen worden opgegeven, en mogen onderdelen bevatten als teken, gehele deel, decimale punt, fractie, exponent, bijv. +1.0e-2

Speciale waarden van w1, w2
w1w2 
0≠ 0 optimaliseer alleen Qf1av
≠ 0 0 optimaliseer alleen Qf1max
00 optimaliseer Qf1max en Qf1av niet
 afwezigw2 = 1.0

optimalisatie van d4, opties -k0 / -k1

Als deze optie is ingeschakeld wordt bij verder gelijke optimale eigenschappen de oplossing met de kleinste d4 gekozen (d4 = 4de moment van de verdeling van de scoregetallen).
-k0 : schakel d4 optimalisatie uit.
-k1 : schakel d4 optimalisatie in (default).

optie -v

Optie -v kan maar een keer per commando gegeven worden. Als je voor het getal bij -v iets opgeeft groter dan het aantal paren waarvoor het schema gemaakt is laat hij het hoogste paarnummer weg.

De normale uitvoer van belans bevat al de kwaliteitsfactoren Qf1(p) voor iedere keuze van het afwezige paar p. Met w2=0 in combinatie met optie -P kan men de optimale balans zoeken voor ieder gewenst paarnummer, maar dat is dan bij maximale Qf voor het volledige schema.
Optie -v kan gebruikt worden als je niet geinteresseerd bent in het volledige schema, maar alleen in de belans van een schema met een afwezig paar.

slow algorithm tuning, optie -S n:c1:c2

Het argument bestaat uit 1 tot 3 delen, gescheiden door ':'.
voorbeelden: -S1, -S1:150, -S1:110:22, -S 0:5:80
Het getal n is verplicht. De interpretatie van de optionele getallen c1 en c2 hangt af van n. Momenteel zijn er twee algoritmes gedefinieerd, 0 en 1.

-S0 selecteert het default fast algoritme, en neemt daarbij c1:c2 (default 1:2000) als begin- en eindtemperatuur. Dus afwezigheid van de -S at optie is equivalent met -S0:1:2000. Hoe hoger de temperatuur (T), hoe groter de kans dat we tijdelijk een NZ-OW verwisseling accepteren die die de som van de kwadraten verhoogt (ofwel Qf verlaagt). Zulk een verhoging kan nodig zijn om later een nog lagere waarde te vinden. T=1 is so laag dat praktisch alleen onmiddellijke verbeteringen geaccepteerd worden. Standaard beginnen we daarmee. Later, als T de topwaarde 2000 bereikt is, gaat de zoektocht vrijelijk in alle richtingen, dichter bij een "random walk". Met de standaard -S0 gaat de temperatuur snel op en neer, met alleen ongeveer 100 iteraties van top tot top.

-S1 selecteert langzame exponentiele afkoeling (of opwarming) van temperatuur c1 naar temperatuur c2. Dit algoritme is af te raden voor schema's waarbij de standaard -S0 snel de optimale Qf vindt en de rest van de tijd doorbrengt met het optimaliseren van Qf1max/Qf1av/d4. -S1 is bedoeld voor gevallen waabij de beste Qf moeilijk te vinden is.
De verstekwaarde c1:c2 is momenteel zeer ruw gezet op P:P/4 waarbij P het aantal paren in het schema is.
Voor een schema van 56 paren is -S1 dus equivalent met -S1:56 en met -S1:56:14.

Werken met deze optie is een kwestie van intuitie en uitproberen. Enkele tips in het Engels:

The default -S0 algorithm is always recommended for at least one or a few short runs before -S1 is tried out for a few short runs too, perhaps 10000 iterations each. That makes it easier to guess a more useful temperature interval than the default one for longer -S1 runs. For the 100 pair 99 round endless Howell the default interval 100:25 seems to be perfect. But for many other large and/or difficult movements the default end temperature is too low, catching the search in a local optimum too early on and just wasting CPU without being able to escape after that. On rare occasions the default start temperature is too low too. If the -S0 trial runs found new optima at high T, consider starting the -S1 runs at high T too. After a moderately long -S1 run, a further minor improvement can often be quickly obtained by a short reheating from below to above the temperature where the present solution was found. Fast improvements happen much less frequently when a solution found by -S0 is fed into balans. That's because the -S0 algorithm already includes such retries with reheating automatically, searching very intensely several times near non-transient new optima. A short -S0 run may also be used to harden the output of a long -S1 run. If you aim for more than minor improvements, it's probably better to spend most of the time on -S1 cooling in a rather narrow interval around the T where the previous result of a semi-long -S1 run was found - before the final short -S1 or -S0 hardening. The main problem here is that exponential cooling spends too much time at some temperatures and too little at others. Manually chaining -S1 runs with varying intervals is a work-around for that. In a future version we expect to provide more intelligent adaptive cooling, e.g. at constant thermodynamic speed.

vernummering van het schema

optie -L: vertaalt de spelgroepen naar letters.
          Als je bijvoorbeeld een schema hebt dat begint met
             8- 1 1    3- 6 4    2- 7 6    5- 4 7
          maakt optie -L er van:
             8- 1 A    3- 6 D    2- 7 F    5- 4 G
          Uitgebreidere mogelijkheden om de spelgroepen te herschikken
          vind men in 'vernum', opties -N en -n.

optie -p: vernummer de paren. Anders dan -L moet je hier precies opgeven
          hoe je de nieuwe volgorde wil hebben.
          Schrijf onder elkaar een rij getallen die de oude nummers
          weergeven en daaronder een rij met de nieuwe gewenste nummers.
          Herschik nu de kolommen zodanig dat op de eerste rij de
          getallen op volgorde staan. Dan verschijnt op rij 2 de invoer
          die het programma verwacht.
          Voorbeeld. Je wil bovenstaand schema hernummeren tot de
          universele startpositie, dus je wilt van
             8 1 3 6 2 7 5 4
          maken:
             1 2 3 4 5 6 7 8
          Schuif nu de 1, met de 2 die er onder staat, naar plaats 1,
          enzovoorts, zo dat de 2 rijen worden.
             1 2 3 4 5 6 7 8
             2 5 3 8 7 4 6 1
          Die laatste serie is nu wat je dient op te geven bij het
          commando:
              balans -cLp howell4tafels.txt 2 5 3 8 7 4 6 1
          Dit maakt van die eerste regel dus 
              1- 2 A    3- 4 B    5- 6 C    7- 8 D 

optie -Q (= Quiet)

Uitvoer naar het consolescherm wordt onderdrukt. Er verschijnt alleen één regel met de resultaten, Qf, d4, enzovoorts. Speciaal interessant als balans vanuit een ander programma wordt aangeroepen.

optie -z (= randomize)

Vr de optimalisatie worden de NZ en OW posities op willekeurige wijze gerangschikt.

uitvoering van het programma

Het programma presenteert nu de balans van het schema zoals ingevoerd en, tenzij je '-c' opgegeven had, gaat het vervolgens optimaliseren. Tijdens het optimaliseren laat het programma ook nog zien het iteratie-nummer, de nieuwe Qf en wat verdere gegevens als het een nieuw optimum vindt.

Vervolgens wordt het geoptimaliseerde schema vertoond, met bijbehorende scorematrix, som van kwadraten, standaarddeviatie en Qf.

Het gevonden schema wordt ook naar een bestand geschreven. Commentaar in dit bestand beschrijft ook nog de belangrijkste eigenschappen van het schema.

Voorbeeld:

balans -r1 -t1 -P15 -s1000 mitchell16.asc
Bereken een 'draaiend schema' uitgaande van het bestand mitchell16.asc Houdt daarbij ronde 1 en tafel 1 vast, laat bij voorkeur paar 15 weg als er een paar minder is. (Immers dan vervalt tafel 8 en daarmee het lenen)
Als het goed is leidt dit commando tot een schema met de optimale balans Qf=91.38, Qf1av=85.71, en tevens tot de maximale kwaliteitsfactor Qf1(15) = Qf1max=87.50 bij afwezigheid van paar 15.
Je mag ook spaties gebruiken tussen optie en argument:
balans -r 1 -t 1 -t 8 -s 1000 mitchell16.asc

Als je de uitvoer in een bestand wil hebben in plaats van op het scherm geef je als commando:

 balans [opties] schemafile > uitvoerfile
Voor een voorbeeld van de uitvoer zie outputexample.html

Het programma vernum.

Dit is een gestripte versie van balans waaruit alle optimalisatie- mogelijkheden verwijderd zijn, maar wel een paar extra opties aanwezig zijn om het vernummeren te vergemakkelijken. Opties -R, -D, en -I werken anders dan in balans.

aanroep:

  vernum [opties] schemafile
[opties] staat voor een aantal mogelijke opties.
Mogelijkheden
 -h   : geef een korte beschrijving van de opties
 -Q   : (Quiet) Onderdruk uitvoer naar het scherm
 -A   : uitvoer conform de standaard
 -p   : vernummer de paren (zie boven)
 -L   : vertaal spelgroepen naar letters (zie boven)
 -u   : vernummer naar "Universele Begin Positie"
 -w   : verwissel windrichtingen NZ <--> OW voor alle ronden en tafels
 -z   : willekeurige keuze voor NZ en OW
 -f -r -t -i -j -a fixerfile: (zie boven)
        Deze opties hebben invloed op de werking van -w en -z
 -R <ronde> : verwissel NZ <--> OW van één ronde				
 -D <tafel> : verwissel NZ <--> OW van één tafel in alle ronden			
 -I <paar> : verwissel NZ <--> OW van alle tafels waar dit paar speelt.			
 -J <paar> : verwissel NZ <--> OW van alle tafels waar deze spelgroep gespeeld wordt.			
 -v n : berekening voor het geval dat paar n afwezig is.
 -N   : gebruik in de uitvoer getallen voor de spelgroepen 
        (programma neemt standaard volgorde)
 -n <laagste getal>  : gebruik in de uitvoer getallen voor de spelgroepen
        maar specificeer de volgorde
 -m <filenaam> : voer het vernummerde schema uit naar file <filenaam>
 -K <ntafels> : sorteer de eerste <ntafels> tafels van iedere ronde
                handig als je naar een "spelvast" schema wil
 -b <basis>   : print schema als een set van basisschema's
                om de basisschema's van een topintegraal te vinden
 -o <offset>  : tel <offset> op bij ieder oneven paarnummer
 -e <offset>  : tel <offset> op bij ieder even paarnummer
                bij het samenvoegen van basisschema's tot een topintegraalschema

Gebruik van -n en -N

Bij -n wordt op de commandoregel een reeks verwacht van alle gebruikte tekens voor de spelgroepen in de volgorde die je wil hanteren.

Voorbeeld optie -n

commando:
vernum -n 7 schemafile.txt A B C D E F
maakt van 'A' '7', van 'B' '8', enzovoorts.
Vr de behandeling:
10 6 6 6 0
 1  2 A    3  4 B    5  6 C    7  8 D    9 10 E    0  0 0
 4  7 A    6  9 B   10  8 C    2  5 D    0  0 0    1  3 F
 9  8 A   10  1 B    3  2 C    0  0 0    7  6 E    5  4 F
 6  3 A    8  5 B    0  0 0    1  9 D    4  2 E   10  7 F
 5 10 A    0  0 0    7  1 C    4  6 D    3  8 E    9  2 F
 0  0 0    7  2 B    9  4 C    3 10 D    5  1 E    6  8 F
Na de behandeling:
10  6  6  6 0 g
 1- 2  7   3- 4  8   5- 6  9   7- 8 10   9-10 11   0- 0  0  
 4- 7  7   6- 9  8  10- 8  9   2- 5 10   0- 0  0   1- 3 12  
 9- 8  7  10- 1  8   3- 2  9   0- 0  0   7- 6 11   5- 4 12  
 6- 3  7   8- 5  8   0- 0  0   1- 9 10   4- 2 11  10- 7 12  
 5-10  7   0- 0  0   7- 1  9   4- 6 10   3- 8 11   9- 2 12  
 0- 0  0   7- 2  8   9- 4  9   3-10 10   5- 1 11   6- 8 12  

Optie -N is een eenvoudige versie hiervan. Als je gebruikt

 vernum -N howell12.txt
is de volgorde van de letters de volgorde waarin ze in het schema voorkomen, en de getallen beginnen met 1.

-n en -N kunnen ook gebruikt worden als de spelgroepen al getallen zijn. Dan op de commandoregel de oude nummers geven in de gewenste volgorde. Als je bijvoorbeeld een schema hebt met spelgroepen 11 .. 17, levert

vernum -n1 klad.txt 17 16 15 14 13 12 11
de vernummering:
oud:    17 16 15 14 13 12 11
nieuw:   1  2  3  4  5  6  7 
Bij gelijktijdig gebruik van -p en -n eerst de paarnummers opgeven, daarna de spelgroepen.

Optie -u
Universele beginpositie. Opgelet! Deze optie vernummert alleen de paren, niet de spelgroepen. Om de spelgroepen op volgorde te krijgen gebruikt optie -N, eventueel in een volgende ronde run door -L

Verdere opties voor de knutselaars

-K, -b, -o, -e ...
Als deze niet werken zoals verwacht hoor ik het graag. Hetzelfde geldt voor verdere suggesties.

Het programma score2

Dit programma berekent de mogelijke scores van een denkbeeldige competitie met 2 sterke paren in een veld van gemiddelde paren. Voor een beschrijving van dit model zie de website.

aanroep:

  score2 [opties] schemafile
Mogelijkheden [n is een geheel getal]
 -T n : geef de score in procent van de sterke paren (normaal 100)
 -e   : uitgebreide uitvoer, alle mogelijke scores per paar voor alle mogelijke
        keuzes van de 2 sterke paren.
 -d   : verdeling van de scores (met soort van grafiek) op het scherm
 -x   : exporteer verdeling van de scores naar een file
 -1   : er is maar 1 sterk paar. bij deze optie worden bovenstaande opties
        genegeerd.
 -h   : geef een korte beschrijving van de opties

Het Bussemaker model

Simulatie volgens het Bussemaker model is "ondergeschoven" in score2. Het model en het gebruik worden beschreven op een aparte pagina.

default bestand

Alle drie programma's gebruiken default een bestand met de naam _balans.txt. Tenzij je optie -m gebruikt in balans of vernum wordt het resulterende schema naar bestand _balans.txt geschreven. Als je geen invoerbestand opgeeft wordt _balans.txt gebruikt. Dit kan handig zijn bij achtereenvolgende bewerkingen. Je wijzigt bijvoorrbeeld een schema met vernum en wilt het vervolgens optimaliseren. Alles wat je dan hoeft te doen is het intypen van "balans".

Overzicht van alle opties

Optiebalansvernumscore2
-h+++
-c+genegeerd 
-s iteraties+ +
-r ronde++ 
-t tafel++ 
-f npos++ 
-i paar nr.++ 
-j spelgroep++ 
-R ronde++ 
-I paar nr.++ 
-J spelgroep++ 
-D tafel++ 
-v vacant paar nr.++ 
-k 0 / -k 1+  
-P vfirst-vlast+  
-W w1:w2+  
-S n:c1:c2+  
-T tijd+  
-Q++ 
-m outputfile++ 
-a fixerfile++ 
-L++ 
-p++ 
-A + 
-u + 
-w + 
-n + 
-N + 
-K tafels + 
-b base + 
-o offset + 
-e offset + 
-e  +
-d  +
-x  +
-T top  +
-1   (= score1)  +
-b  (Bussemaker)  +

ontwikkelomgeving

Deze programma's zijn geschreven in C en werden ontwikkeld in de MINGW32 en in de Linux omgeving, en gecompileerd met gcc of clang. Als random number generator wordt gebruikt Mutsuo Saito and Makoto Matsumoto's SIMD-oriented Fast Mersenne Twister (SFMT) .