BE:Neukölln/Gebietsversammlungen/2010.3/Protokoll
Inhaltsverzeichnis
- 1 Protokoll der dritten Neuköllner Gebietsversammlung am 19.12.2010
- 1.1 Protokoll
- 1.1.1 Begrüßung
- 1.1.2 Abstimmung über die Zulassung von Gästen und die Tagesordnung
- 1.1.3 Wahl Versammlungsleitung u. Protokollanten
- 1.1.4 Vorstellung u. Bestimmung des Wahlleiters und seiner Helfer
- 1.1.5 Vorstellung/Abstimmung über Wahl- u. Geschäftsordnung
- 1.1.6 Wahl von Kandidaten für die BVV-Liste Neukölln
- 1.1.7 Meinungsaustausch über die Aufstellung von Direktkandidaten und gegebenenfalls Beschlußfassung/ Wahl
- 1.1.8 sonstige Anträge
- 1.1.9 Verabschiedung
- 1.2 Wahlprotokoll
- 1.1 Protokoll
Protokoll der dritten Neuköllner Gebietsversammlung am 19.12.2010
Protokoll
Begrüßung
Akkreditiert sind 13 Stimmberechtigte.
Heide Hagen eröffnet die Versammlung um 19 Uhr.
Abstimmung über die Zulassung von Gästen und die Tagesordnung
Abstimmung über die Zulassung von Gästen: Einstimmig angenommen.
Abstimmung über die Tagesordnung wie in der Einladung enthalten:
- Begrüßung
- Abstimmung über die Zulassung von Gästen und die Tagesordnung
- Wahl Versammlungsleitung u. Protokollanten
- Vorstellung u. Bestimmung des Wahlleiters und seiner Helfer
- Vorstellung/Abstimmung über Wahl- u. Geschäftsordnung
- Meinungsaustausch über die Aufstellung von Direktkandidaten und gegebenenfalls Beschlußfassung/ Wahl
- Wahl von Kandidaten für die BVV-Liste Neukölln
- Wahlkampfvorbereitung
- sonstige Anträge
- Beschlußfassung über den Termin der nächsten Gebietsversammlung
- Verabschiedung
Die Tagesordnung wird einstimmig angenommen.
Antrag auf Änderung der Tagesordnung: Vorziehen der Kandidatenaufstellung für die BVV (TOP 7) vor die Aufstellung der Direktkandidaten zur Abgeordnetenhauswahl (TOP 6). Begründung: Es ist das Wichtigste. Keine Gegenrede, damit angenommen.
Wahl Versammlungsleitung u. Protokollanten
Wahl des Versammlungsleiters: Vorschlag Andreas Nitsche. Einstimmig angenommen.
Wahl des Protokollanten: Vorschlag Simon Weiß. Einstimmig angenommen.
Vorstellung u. Bestimmung des Wahlleiters und seiner Helfer
Wahl des Wahlleiters: Vorschlag Jan Behrens. Einstimmig angenommen. Der Wahlleiter bestimmt als Wahlhelfer Björn Swierczek und Martin Delius.
Vorstellung/Abstimmung über Wahl- u. Geschäftsordnung
Die Wahl- und Geschäftsordnung der Piratenpartei Berlin wird vorgestellt und von der Versammlung einstimmig als gültig bestätigt.
Antrag auf Änderung der Wahlordnung, um die Listen und Direktkandidaten nach einem Präferenzwahlverfahren zu wählen:
Die Gebietsversammlung Neukölln beschließt in Ergänzung zur Wahl- und Geschäftsordnung:
Die Wahlen zur Einreichung von Wahlvorschlägen (Direktkandidaten und Liste) werden mittels eines Präferenzwahlverfahrens entsprechend der diesem Antrag beiliegenden Stimmzettelvorlagen durchgeführt. Kandidaten, die nicht mehr Zustimmungen als Ablehnungen auf sich vereinigen können, scheiden aus und finden im nachfolgend beschriebenen Prozess keine Berücksichtigung. Für die übrigen Kandidaten wird die im Folgenden beschriebene Schulze-Methode zur Ermittlung des Wahlgewinners bzw. der Kandidatenreihenfolge auf Listen verwendet:
Jeder Kandidat wird mit jedem anderen Kandidaten verglichen und es wird für jeden Kandidaten ermittelt, wieviele Wähler diesen Kandidaten den jeweils anderen Kandidaten vorziehen.
Definition: Jeder Kandidat kann jeden anderen Kandidaten mit einem Gewicht von n schlagen, wenn sich eine Abfolge von insgesamt mindestens zwei Kandidaten konstruieren lässt, die mit Kandidat A beginnt und mit Kandidat B endet, bei der für alle Paare direkt aufeinanderfolgender Kandidaten dieser Abfolge der jeweils eine Kandidat gegenüber seinem Nachfolger von einer einfachen Mehrheit, mindestens jedoch von n Wählern, bevorzugt wird.
- Es wird für jedes Kandidatenpaar X und Y ermittelt, wie das größtmögliche Gewicht ist, mit dem ein Kandidat X nach obenstehender Definition den Kandidaten Y schlagen kann. Hierzu müssen alle der obenstehenden Definition genügenden Abfolgen von Kandidaten berücksichtigt werden. Gibt es keine solche Abfolge wird jeweils ein größtmögliches Gewicht von Null (0) angenommen.
- Ein Kandidat X ist dann Gewinner der Wahl, wenn für jeden anderen Kandidaten Y das größtmögliche Gewicht, mit dem der Kandidat X den Kandidaten Y schlagen kann, größer als das größtmögliche oder gleich dem größtmöglichen Gewicht ist, mit dem der Kandididat Y den Kandidaten X schlagen kann.
- Gibt es mehrere Gewinner, findet eine Stichwahl statt.
Im Falle von Listenaufstellungen wird Schritt 2 unter Ausnahme der bisherigen Gewinner wiederholt, um die weiteren Plätze zu besetzen. Gleichplatzierte Kandidaten werden im Anschluss an die Auszählung mittels einer Stichwahl untereinander in eine Reihenfolge gebracht.
Stichwahlen werden als Wahl durch Zustimmung durchgeführt. Es werden hierbei nur Zustimmungen gezählt und der Kandidat mit den meisten Stimmen gewinnt bzw. wird erstplatziert. Sind mehrere Kandidaten in eine Reihenfolge zu bringen, entscheidet die Anzahl der Zustimmungen über die Reihenfolge der Kandidaten. Ergibt die Stichwahl einen Gleichstand, dann entscheidet das Los oder ein Münzwurf.
Technisch wird die Auszählung mit Ausnahme der Stichwahlen unter Verwendung des folgenden in der Programmiersprache Lua 5.1 geschriebenen Computerprogramms durchgeführt. Die Eingabedaten werden gemäß der Stimmzettel in einem öffentlichen Prozess erfasst. Eingaben und Ausgaben des Programms werden protokolliert und veröffentlicht.
Dieser Beschluss behält Gültigkeit bis zum Abschluss der Gebietsversammlung, sofern er nicht vorher durch einen mehrheitlichen Beschluss aufgehoben wird.
Quellcode des verwendeten Computerprogramms:
#!/usr/bin/env lua ---------------------- -- Helper functions -- ---------------------- function message(...) io.stderr:write(...) end ------------------------------------------ -- Print notice related to tie-breaking -- ------------------------------------------ message("NOTICE: This simplified version of the program does not perform tie-breaking.\n\n") -------------------------------------- -- Command line argument processing -- -------------------------------------- settings = {} do local next_arg do local argv = {...} local i = 0 next_arg = function() i = i + 1 return argv[i] end end local function command_line_error() message("Get help with -h or --help.\n") os.exit(1) end for option in next_arg do local argument, lower_argument local function require_argument() argument = next_arg() if argument == nil then message('Command line option "', option, '" requires an argument.\n') command_line_error() end lower_argument = string.lower(argument) end local function set_setting_once(key, value) if settings[key] ~= nil then message('Command line option "', option, '" occurred multiple times.\n') command_line_error() end settings[key] = value end if option == "-h" or option == "--help" then io.stdout:write("Usage:\n") io.stdout:write("schuool -c|--candidates <candidates_file>\n") io.stdout:write(" -b|--ballots <ballots_file>\n") io.stdout:write(" [ -d|--default n|neutral|f|first|l|last ]\n") io.stdout:write(" [ -o|--output <output_file> ]\n") os.exit(0) elseif option == "-c" or option == "--candidates" then require_argument() set_setting_once("candidates_filename", argument) elseif option == "-b" or option == "--ballots" then require_argument() set_setting_once("ballots_filename", argument) elseif option == "-d" or option == "--default" then require_argument() if lower_argument == "n" or lower_argument == "neutral" then set_setting_once("default", "n") elseif lower_argument == "f" or lower_argument == "first" then set_setting_once("default", "f") elseif lower_argument == "l" or lower_argument == "last" then set_setting_once("default", "l") else message('Unknown default position "', argument, '" specified after ', option, ' switch.\n') command_line_error() end elseif option == "-o" or option == "--output" then require_argument() set_setting_once("output_filename", argument) else message('Illegal command line option "', option, '"\n') command_line_error() end end if settings.candidates_filename == nil then message("Use -c or --candidates to specify file containing candidate information.\n") command_line_error() end if settings.ballots_filename == nil then message("Use -b or --ballots to specify file containing all ballot data.\n") command_line_error() end end -------------------------- -- I/O helper functions -- -------------------------- function strip(str) return string.match(str, "^%s*(.-)%s*$") end function stripped_lines(filename) local file, errmsg = io.open(filename, "r") if not file then message(errmsg, "\n") os.exit(2) end local get_next_line = file:lines(filename) return function() if not file then return nil end local line repeat line = get_next_line() if line == nil then file:close() file = nil return nil end line = strip(string.match(line, "^[^#]*")) until line ~= "" return line end end function stripped_gmatch(str, pattern) local next_entry = string.gmatch(str, pattern) return function() local entry repeat entry = next_entry() if entry then entry = strip(entry) end until entry ~= "" return entry end end do local output_file if settings.output_filename == nil then output_file = io.stdout else local errmsg output_file, errmsg = io.open(settings.output_filename, "w") if not output_file then message(errmsg, "\n") os.exit(2) end end function output(...) output_file:write(...) end end function padded_number(number, maximum) local str = tostring(number) local max_digits = 1 local tmp = maximum while tmp >= 10 do tmp = math.floor(tmp / 10) max_digits = max_digits + 1 end for i = 1, max_digits - #str do str = " " .. str end return str end --------------------- -- Read candidates -- --------------------- candidates = {} -- mapping string to candidate number and vice versa do for line in stripped_lines(settings.candidates_filename) do for candidate in stripped_gmatch(line, "[^;,]+") do if candidates[candidate] then message('Duplicate candidate in "', settings.candidates_filename, '": "', candidate, '".\n') os.exit(2) end candidates[#candidates+1] = candidate candidates[candidate] = #candidates end end end ------------------------------ -- Read and process ballots -- ------------------------------ ballots = {} approval_counts = {} disapproval_counts = {} for i = 1, #candidates do approval_counts[candidates[i]] = 0 disapproval_counts[candidates[i]] = 0 end for line in stripped_lines(settings.ballots_filename) do local ballot = {} local rank local processed = {} local approvals, neutrals, disapprovals = string.match(line, "^([^/]*)/([^/]*)/([^/]*)$") if not approvals then approvals, neutrals, disapprovals = string.match(line, "^([^/]*)$"), "", "" end if not approvals then message('Ill formatted ballot: "', line, '".\n') os.exit(2) end local function process_lists(candidate_lists, count_table) for candidate_list in string.gmatch(candidate_lists, "[^;]+") do if rank == -1 then -- only happens when there are different rankings in the neutral section message('Different rankings (semicolon) found in neutral section of ballot "', line, '".\n') os.exit(2) end local empty = true for candidate in stripped_gmatch(candidate_list, "[^,]+") do empty = false if not candidates[candidate] then message('Unknown candidate "', candidate, '" contained in ballot "', line, '".\n') os.exit(2) end if processed[candidate] then message('Duplicate candidate "', candidate, '" in ballot "', line, '".\n') os.exit(2) end ballot[candidate] = rank if count_table then count_table[candidate] = count_table[candidate] + 1 end processed[candidate] = true end if not empty then -- It is important to only decrease rank, when candidates have been processed. rank = rank - 1 end end end rank = #candidates process_lists(approvals, approval_counts) rank = 0 process_lists(neutrals) rank = -2 -- rank -1 is reserved for default=first process_lists(disapprovals, disapproval_counts) for i = 1, #candidates do local candidate = candidates[i] if not processed[candidate] then if settings.default == "n" then ballot[candidate] = 0 elseif settings.default == "f" then ballot[candidate] = -1 disapproval_counts[candidate] = disapproval_counts[candidate] + 1 elseif settings.default == "l" then ballot[candidate] = -#candidates - 2 disapproval_counts[candidate] = disapproval_counts[candidate] + 1 else message('Candidate "', candidate, '" missing in ballot "', line, '".\n') os.exit(2) end end end ballots[#ballots+1] = ballot end ------------------------------------------------------------------------- -- Select approved candidates, who passed the hard-coded quota of 1/2+ -- ------------------------------------------------------------------------- local approved_candidates = {} do local max_approval = 0 local max_disapproval = 0 local max_neutral = 0 for i = 1, #candidates do local candidate = candidates[i] local approval_count = approval_counts[candidate] local disapproval_count = disapproval_counts[candidate] local neutral_count = #ballots - approval_count - disapproval_count max_approval = math.max(max_approval, approval_count) max_disapproval = math.max(max_disapproval, disapproval_count) max_neutral = math.max(max_neutral, neutral_count) end output("Candidates:\n") for i = 1, #candidates do local candidate = candidates[i] local approval_count = approval_counts[candidate] local disapproval_count = disapproval_counts[candidate] local neutral_count = #ballots - approval_count - disapproval_count local approved = approval_count > disapproval_count output(padded_number(i, #candidates), ". ", padded_number(approval_count, max_approval), ':', padded_number(disapproval_count, max_disapproval), '(:', padded_number(neutral_count, max_neutral), ') 1/2+ ', approved and "APPROVED" or "FAILED ", ' ', candidates[i], "\n") if approved then approved_candidates[#approved_candidates+1] = candidate approved_candidates[candidate] = #approved_candidates end end output("\n") end ---------------------------------------------------------------- -- Calculate battles and rankings according to Schulze method -- ---------------------------------------------------------------- battles = {} -- two dimensional array max_pro_contra = 0 for i = 1, #approved_candidates do battles[i] = {} end ranking = {} -- mapping candidate name to ranking number and ranking number to list of candidates function beating_weight(pro, contra) if pro > contra then return pro else return 0 end end function approval_ratio(approval_count, disapproval_count) if approval_count > 0 and disapproval_count > 0 then return approval_count / (approval_count + disapproval_count) elseif approval_count > 0 then return approval_count elseif disapproval_count > 0 then return 1 - disapproval_count else return 1/2 end end do local matrix = {} for i = 1, #approved_candidates do matrix[i] = {} end for i = 1, #approved_candidates do for j = i+1, #approved_candidates do local pro, contra = 0, 0 for k = 1, #ballots do local ballot = ballots[k] local rank1 = ballot[approved_candidates[i]] local rank2 = ballot[approved_candidates[j]] if rank1 > rank2 then pro = pro + 1 elseif rank2 > rank1 then contra = contra + 1 end end battles[i][j] = pro battles[j][i] = contra max_pro_contra = math.max(max_pro_contra, pro) matrix[i][j] = beating_weight(pro, contra) matrix[j][i] = beating_weight(contra, pro) end end for i = 1, #approved_candidates do for j = 1, #approved_candidates do if i ~= j then for k = 1, #approved_candidates do if i ~= k and j ~= k then matrix[j][k] = math.max(matrix[j][k], math.min(matrix[j][i], matrix[i][k])) end end end end end local count = 0 repeat local winners = {} for i = 1, #approved_candidates do local candidate = approved_candidates[i] if ranking[candidate] == nil then local best = true for j = 1, #approved_candidates do if i ~= j then local other_candidate = approved_candidates[j] if ranking[other_candidate] == nil and matrix[j][i] > matrix[i][j] then best = false break end end end if best then winners[#winners+1] = candidate end end end ranking[#ranking+1] = winners for i = 1, #winners do ranking[winners[i]] = #ranking count = count + 1 end until count == #approved_candidates end -------------------- -- Output ranking -- -------------------- output("Ranking:\n") for rank = 1, #ranking do local list = ranking[rank] for i = 1, #list do local candidate = list[i] output(padded_number(rank, #ranking), ". ", candidate, "\n") end end output("\n") --------------------------- -- Output battle results -- --------------------------- for rank = 1, #ranking do local list = ranking[rank] for i = 1, #list do local candidate = list[i] output("Comparison of: ", padded_number(rank, #ranking), ". ", candidate, "\n") for other_rank = 1, #ranking do local other_list = ranking[other_rank] for j = 1, #other_list do local other_candidate = other_list[j] if candidate ~= other_candidate then local pro = battles[approved_candidates[candidate]][approved_candidates[other_candidate]] local contra = battles[approved_candidates[other_candidate]][approved_candidates[candidate]] output(padded_number(pro, max_pro_contra), ":", padded_number(contra, max_pro_contra), " ", padded_number(other_rank, #ranking), ". ", other_candidate, "\n") end end end output("\n") end end
Anlagen:
Das vorgeschlagene Verfahren wird vorgestellt.
Meinungsbild: Wer möchte das Verfahren verwenden? Deutlich positiv.
Fragen zum Verfahren werden erörtert.
Eine Nachakkreditierung findet statt.
Der Antrag ist einstimmig angenommen.
Antrag auf Änderung der Wahlordnung:
Bei Wahlen zur Aufstellung von Direktkandidaten gibt es eine zusätzliche explizite Wahloption, keinen Kandidaten aufzustellen. Diese Wahloption wird genauso wie alle übrigen Kandidaten behandelt.
Der Antrag ist einstimmig angenommen.
Antrag auf Änderung der Wahlordnung:
Die selbe Person kann sich für mehrere Wahlkreise zur Wahl aufstellen lassen, jedoch nur für einen Wahlkreis die Wahl annehmen. Lehnt ein gewählter Direktkandidat die Annahme der Wahl für einen Wahlkreis ab, wird nach dem Auszählungssverfahren der Listenaufstellung aus den bereits abgegebenen Stimmen der nächstplatzierte ermittelt. Dieser ist dann gewählt.
Der Antrag ist einstimmig angenommen.
Wahl von Kandidaten für die BVV-Liste Neukölln
Diskussion über die Aufstellung von Kandidaten für die Bezirksverordnetenversammlung.
Die Kandidaten für die BVV-Liste werden erfasst:
- Mathias Zaech
- Steffen Burger
- Philipp Ott
- Lisa Vanovitch
- Anne Helm
- Moritz Nibbrig
- Roland Heine
Die Kandidaten stellen sich vor, beantworten Fragen und nehmen spontante Beifallsbekundungen entgegen.
Heide Hagen gibt zu Protokoll: "Neukölln Rules!".
Die Wahlmodalitäten werden noch einmal vorgestellt und der Wahlgang wird eröffnet.
Wahlergebnis (siehe Wahlprotokoll):
- Steffen Burger
- Anne Helm
- Mathias Zaech
- Moritz Nibbrig
- Roland Heine
- Philipp Ott
- Lisa Vanovitch
Die gewählten Kandidaten nehmen die Wahl an.
Meinungsaustausch über die Aufstellung von Direktkandidaten und gegebenenfalls Beschlußfassung/ Wahl
Diskussion über die Aufstellung von Direktkandidaten.
Die Sitzung wird für 5 Minuten unterbrochen.
Die Kandidaten für Wahlkreis 1 werden erfasst:
- Rik Aulfes
- Benjamin Meyer
Die Kandidaten stellen sich vor und beantworten Fragen.
Die Wahlmodalitäten werden noch einmal vorgestellt und der Wahlgang wird eröffnet.
Gewählt ist Benjamin Meyer (siehe Wahlprotokoll).
Die Kandidaten für Wahlkreis 2 werden erfasst:
- Anne Helm
- Steffen Burger
Die Kandidaten beantworten Fragen.
Die Wahlmodalitäten werden noch einmal vorgestellt und der Wahlgang wird eröffnet.
Gewählt ist Anne Helm (siehe Wahlprotokoll).
Meinungsbild: Kannst du dir vorstellen, dich für die restlichen Wahlkreise als Direktkandidat aufstellen zu lassen? Mehrere Meldungen.
Die Kandidaten für Wahlkreis 3 werden erfasst:
- Philipp Ott
- Andre Trecksel
Die Kandidaten stellen sich vor und beantworten Fragen.
Weitere Diskussion über die Aufstellung von Kandidaten.
Die Wahlmodalitäten werden noch einmal vorgestellt und der Wahlgang wird eröffnet.
Keiner der Kandidaten ist gewählt (siehe Wahlprotokoll).
Die Kandidaten für Wahlkreis 4 werden erfasst:
- Mathias Zaech
- Rik Aulfes
Die Kandidaten stellen sich vor und beantworten Fragen.
Die Wahlmodalitäten werden noch einmal vorgestellt und der Wahlgang wird eröffnet.
Gewählt ist Mathias Zaech (siehe Wahlprotokoll).
Die Kandidaten für Wahlkreis 5 werden erfasst:
- Stefan Berkner
- Rik Aulfes
- Lisa Vanovitch
Die Kandidaten stellen sich vor und beantworten Fragen.
Die Wahlmodalitäten werden noch einmal vorgestellt und der Wahlgang wird eröffnet.
Keiner der Kandidaten ist gewählt (siehe Wahlprotokoll).
Der Wunsch nach der Wiederholung eines Wahlganges wird vom Wahlleiter erfragt und nicht geäußert.
Die Kandidaten für Wahlkreis 6 werden erfasst.
Keiner der Anwesenden kandidiert.
Die Sitzung wird für 5 Minuten unterbrochen.
Die gewählten Direktkandidaten Benjamin Meyer (WK1), Anne Helm (WK2) und Mathias Zaech (WK4) nehmen die Wahl an.
Antrag auf Streichung des Tagesordnungspunkts "Wahlkampfvorbereitung". Keine Gegenrede.
sonstige Anträge
Keine sonstigen Anträge.
Antrag auf Streichung des Tagesordnungspunkts "Termin der nächsten GV". Keine Gegenrede.
Verabschiedung
Die Versammlung wird um 00:14 geschlossen.