Skip to content

Instantly share code, notes, and snippets.

@kac-
Last active August 29, 2015 14:21
Show Gist options
  • Save kac-/4b5e55b003420c36203d to your computer and use it in GitHub Desktop.
Save kac-/4b5e55b003420c36203d to your computer and use it in GitHub Desktop.
JOW z przekazywaniem
Map<String, Integer> result = new HashMap<String, Integer>();
while (constituencies.size() > 0) {
Iterator<List<Candidate>> ci = constituencies.iterator();
while (ci.hasNext()) {
List<Candidate> l = ci.next();
Collections.sort(l);
Candidate candidate = l.get(0);
if (candidate.acceptor != null && !candidate.acceptor.out) {
candidate.acceptor.votes += candidate.votes;
} else if (candidate.reserve != null && !candidate.reserve.out) {
candidate.reserve.votes += candidate.votes;
}
candidate.out = true;
l.remove(candidate);
if (l.size() == 1) {
Candidate win = l.get(0);
Integer v = result.get(win.party);
v = v == null ? 1 : v + 1;
result.put(win.party, v);
ci.remove();
}
}
}
@kac-
Copy link
Author

kac- commented May 12, 2015

  1. Ustalona zostaje kolejność „przetwarzania” okręgów.(najlepiej losowo)
  2. Każdy kandydat wskazuje maksymalnie 2 innych kandydatów(Akceptor i Rezerwowy) na których przejdą głosy w razie jego wyeliminowania.
  3. Zbiera się wszystkie głosy z całej Polski.
  4. Zgodnie z kolejnością ustaloną w pkt 1 bierzemy okręg i:
    • jeżeli w okręgu został więcej niż jeden kandydat eliminujemy najsłabszego
    • jego głosy przechodzą na wskazanego przez niego Akceptora, jeżeli ten Akceptor został wyeliminowany we wcześniejszych „turach” to na Rezerwowego, jeżeli i jego nie ma w rozgrywce głosy wyeliminowanego kandydata przepadają
    • jeżeli w okręgu został już tylko 1 kandydat - przechodzimy do kolejnego okręgu( zgodnie z kolejnością z pkt 1)
    • jeżeli we wszystkich okręgach został tylko 1 kandydat przerywamy algorytm i ogłaszamy wyniki

Takie rozwiązanie pozwala wyeliminować listy wyborcze a jednocześnie w wynikach odzwierciedlić proporcjonalnie reprezentację pewnej grupy( o ile kandydaci tej grupy/partii w miarę racjonalnie wskażą swoich Akceptorów). Wszystko przy zachowaniu zalet JOWów.

Metoda na licencji Creative Commons - BY

@kac-
Copy link
Author

kac- commented May 12, 2015

Efekt 3 uruchomień( losowi Akceptorzy i Rezerwowi pośród partii oraz kolejność „odpytywania” okręgów).

partia miejsca udział partia miejsca udział partia miejsca udział
Con 292 44,92% Con 292 44,92% Con 291 44,77%
Lab 233 35,85% Lab 228 35,08% Lab 228 35,08%
UKIP 45 6,92% UKIP 48 7,38% UKIP 51 7,85%
SNP 39 6,00% SNP 40 6,15% SNP 42 6,46%
LD 23 3,54% LD 18 2,77% LD 17 2,62%
SF 5 0,77% DUP 5 0,77% DUP 5 0,77%
DUP 4 0,62% SF 5 0,77% SF 4 0,62%
PC 3 0,46% PC 4 0,62% PC 3 0,46%
Alliance 2 0,31% UUP 4 0,62% SDLP 3 0,46%
UUP 2 0,31% Green 3 0,46% Alliance 2 0,31%
Green 1 0,15% SDLP 2 0,31% Green 2 0,31%
SDLP 1 0,15% Alliance 1 0,15% UUP 2 0,31%

@kac-
Copy link
Author

kac- commented May 14, 2015

Można dodać współczynnik tłumienia tj. np. tylko 3/4 głosów odpadającego przechodzi do Akceptora. Przy takich parametrach ok. 70 reprezentantów dostałoby się z lokalnego drugiego miejsca a 30 z trzeciego, pojedynczy( <10) kandydaci dostaliby się z lokalnych miejsc czwartych i piątych.

Przykładowy wynik:

partia miejsca udział
Con 296 45,54%
Lab 231 35,54%
SNP 50 7,69%
UKIP 34 5,23%
LD 17 2,62%
DUP 5 0,77%
SF 5 0,77%
PC 4 0,62%
SDLP 3 0,46%
UUP 3 0,46%
Green 2 0,31%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment