Senter for Marxistiske og Matematiske Studium, Enschede (SMMSE)

17 januar 2007

 

Til glede for nye brukarar

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:
Ap54622
Frp30569
H64648
KrF14375
Sp9213
SV18558
V8669
PP3821
RV2868
MdG2332
NKP247
NP369
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.

05 januar 2007

 

Jevons sitt logikkpiano IV – simulatoren

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.

Tidlegare tekstar

Ein quine til
To quines
Brev frå Schickard til Kepler
Rapport: Hjelper valkamp?
Prosjektskildring: Hjelper valkamp?
Operativsystemrevolusjonen
Perspektiv på fri/open programvare
Om ... misforståingar knytt til datateknologi II
Om misoppfatninga at fri/open programvare er kommu...
Til glede for nye brukarar

Arkiv

november 2005   desember 2005   februar 2006   april 2006   november 2006   desember 2006   januar 2007   februar 2007   mars 2007   august 2007   desember 2007   januar 2008   juli 2008  

This page is powered by Blogger. Isn't yours?