I år er det valår, og ikkje berre det – det er kommune- og fylkestingsval. For å markere dette vil vi presentere ein gamal slagar:
Kommunestyrekalkulatoren. Dette er eit program
Mass Production - NWS utvikla til kommunestyre- og fylkestingsvalet i 2003 for å betre kunne analysere resultata i vala. Det kan jo vere små marginar, og serleg når ein heiar på eit lite parti kan det vere artig å vite nett kor mange røyster som mangla for representasjon i kommunestyret.
Programmet er enkelt. Ein matar inn valresultatet ved å fylle inn felta "Parti" og "Stemmer" og trykkje på "Legg til". Når ein har lagt inn alle partia fyller ein inn talet på representantar som skal fordelast og trykkjer på "Beregn", og ut får ein då nokre tal.
Som eit tilfeldig valt eksempel skal vi take føre oss
fylkestingsvalet i 1999 for Akershus fylke. Resultatet av dette valet var som følgjer:
Ap | 54622 |
Frp | 30569 |
H | 64648 |
KrF | 14375 |
Sp | 9213 |
SV | 18558 |
V | 8669 |
PP | 3821 |
RV | 2868 |
MdG | 2332 |
NKP | 247 |
NP | 369 |
Fylkestinget i Akershus var på den tida på 63 representantar. Legg vi desse tala inn i kommunestyrekalkulatoren får vi dette resultatet ut:
FORDELING
Manglet
Parti Prosent Mandater på neste
H 30,7% 19 315
Ap 26,0% 16 347
Frp 14,5% 9 1080
SV 8,8% 6 3096
KrF 6,8% 4 616
Sp 4,4% 3 2447
V 4,1% 3 2991
PP 1,8% 1 1176
RV 1,4% 1 2129
MdG 1,1% 1 2665
NP 0,2% 0 1963
NKP 0,1% 0 2085
Minimum stemmer for å ta siste mandat: 2332
Vi får vite kor mange prosent av røystene kvart parti fekk og kor mange representantar dei fekk i fylkestinget (evt. kommunestyret). I tillegg til det får vi vite kor mange røyster dei mangla på å take eit mandat til, og kva som krevst av røyster for å få siste mandatet (dvs. akkurat klare å kome inn).
Det er verdt å merke seg at det talet på røyster ein manglar på neste mandat er i høve til kva dei andre partia har fått og gjeld dersom det ikkje er nokre endringar hjå dei. Det same gjeld røystetalet for å ta siste mandatet – det er i høve til dei partia som
har fått mandat.
Det vil ikkje seie at det ikkje finst marginar. I dette eksempelet fekk Miljøpartiet dei Grøne siste mandatet med 2332 stemmer. For at eit anna parti utan mandat, dvs. NKP eller Naturlovspartiet, skulle kapra dette måtte dei hatt minst 2332 røyster. Men samtidig hadde Miljøpartiet dei Grøne klara seg med 2321 røyster og hadde med andre ord ein margin på 11 røyster på mandatet sitt, utan at dette går fram av tala ein får frå kommunestyrekalkulatoren. (Om vi nokon gong får somla oss til å lage den utbetra versjonen vi lenge har planlagd, er utrekning av margin på siste mandatet til partia noko vi vil freiste få med. Men her er det ein ting å tenkje på. RV tok her 51. mandatet og marginen til det er 14 røyster. Dvs. at med 15 færre røyster ville RV fått 52. mandatet, men framleis ha same representasjon i fylkestinget. Meir interessant er det kanskje at RV hadde ein margin på 547 røyster for å halde representasjonen sin. Så vi får sjå).
Så til teknikalitetane. Som
logikkpianosimulatoren og mykje anna
MP - NWS har laga er dette ein
Java Applet. Hovudprogrammet, som står for oppsett av grensesnittet, handtering av innlegging av resultata og utrekningar er klassen
Kommunestyrekalkulator. Partiinterne ting vert handtert av klassen
Party. For kvart parti som vert lagt inn vert eit partiobjekt oppretta og plassert i ei liste sortert etter røystetal (dette er ein viktig invariant i utrekningane). I tillegg har vi òg den obligatoriske HTML-fila
index.html for å køyre programmet i ein nettlesar (og her er faktisk storleikparametrane til applet-taggen naudsynt for at grensesnittet skal sjå bra ut, men, men).
I følgje
vallova §§11-4, 11-10, 11-12, skal mandat i kommunestyre- og fylkestingsval (og distriktsmandat i stortingsval) verte fordelt etter
St. Laguës modifiserte metode. Her vallova §11-4(3):
| St. Laguës modifiserte metode innebærer at hver listes stemmetall divideres med 1,4-3-5-7 osv. Hvert stemmetall skal divideres så mange ganger som det er nødvendig for å finne det antall mandater listen skal ha. Det første mandatet tilfaller den listen som har den største kvotienten. Det andre mandatet tilfaller den listen som har den nest største kvotienten osv. Hvis flere lister har samme kvotient, tilfaller mandatet den av listene som har størst stemmetall. Har de samme stemmetall, avgjøres det ved loddtrekning hvilken liste mandatet skal tilfalle. | |
Algoritmen for å rekne ut mandatfordelinga er følgjeleg ganske enkel. Alle røystetala vert fyrst delt på 1,4. For kvart mandat går programmet gjennom lista av parti og finn det med det høgste talet (høgste kvotienten). Når eit parti får tildelt eit mandat vert delingstalet økt, fyrst til 3, så til 5 osb., og røystetalet vert delt på det nye delingstalet. Sidan lista av parti er sortert på det faktiske røystetalet vil det partiet med flest røyster få mandatet dersom kvotienten er lik. Loddtrekning gjer ikkje programmet, så om røystetalet òg er likt vil det partiet som vart lagt til lista fyrst få mandatet.
For å rekne ut kor mange røyster som trengst for å take siste mandatet vert den siste kvotienten som gav mandat multiplisert med 1,4 – det fyste delingstalet. For å rekene ut kor mange røyster eit parti mangla på å ta eit mandat til vert talet på røyster partiet fekk trekt frå kvotienten som gav sistemandat (for heile kommunestyret, ikkje partiet) mulitpisert med det siste delingstalet til partiet.
Vi har tidlegare presentert
Jevnons sitt logikkpiano og ein
simulator av denne logikkmaskina. I vårt
samarbeid med
Mass Production - No Warranty Software vil vi no presentere og offentleggjere kjeldekoden til simulatoren.
Simulatoren er programmert som ein
Java Applet og er laga for å mest mogleg etterlikne logikkpianoet. For å skjøne programmet kan difor det greiaste vere å lese
utgreiinga vår eller
Jevons sin orginale artikkel om korleis logikkpianoet fungerer. Vi skal likevel gje ei kort utgreiing her.
Pianoet sjølv og kvar av hovuddelane tangent, stav og hevarm er representert av eigne javaklassar. Hovudklassen
Piano representerer sjølve maskina og inneheld i all hovudsak oppsett av pianoet. Hòla inn til stavane er representert av ein todimensjonal
Label array abecedarium. Tangentane vert representert med
Button. I pianoet er kvar tangent forbundi med ein hevarm som løftar seg når ein trykkar på tangenten. Hevarmane er representert med klassen
Lever, og ved at denne klassen implementerer
ActionListener kan ein hevarm enkelt registrere at ein tangent har vorte trykka ned. Når ein hevarm løftar seg kan han få stavane til å flytte på seg og endre posisjon ved å slå bort i pinnar i stavane. Stavar er representert med klassen
Rod, og pinnane er i denne klassen representert av ein
boolean array pin. Enkelt og greitt har klassen Rod ein metode move som hevarmane kallar når dei løftar seg, og i denne metoden vert den nye posisjonen til staven rekna ut. Etter å ha fått ein ny posisjon kallar staven på metoden display i klassen Piano for å fortelje kva som no skal visast i hòla på framsida av pianoet.
I tillegg til desse java-filane finst det ei HTML-fil
index.html som gjer at programmet kan køyrast i ein nettlesar. Og meir er det vel eigentleg ikkje å seie om denne saka.