summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJed Barber <jjbarber@y7mail.com>2017-02-20 10:54:44 +1100
committerJed Barber <jjbarber@y7mail.com>2017-02-20 10:54:44 +1100
commit374c45e5ef46eda860e9261079f737b5cf1687fd (patch)
treed53bd10e64c859004524fec0c5ed4fdc474b77cc
parent31b2f62e121cb219d1f9ae2189da5bf53863b7a2 (diff)
Single transferable vote article added
-rw-r--r--project/complexity.yml1
-rw-r--r--project/templates/index.html1
-rw-r--r--project/templates/stvcount.html275
3 files changed, 277 insertions, 0 deletions
diff --git a/project/complexity.yml b/project/complexity.yml
index c25e9fa..07417a2 100644
--- a/project/complexity.yml
+++ b/project/complexity.yml
@@ -13,4 +13,5 @@ unexpanded_templates:
- "grasp.html"
- "thue2a.html"
- "adapad.html"
+ - "stvcount.html"
diff --git a/project/templates/index.html b/project/templates/index.html
index b8db7fe..de16dbf 100644
--- a/project/templates/index.html
+++ b/project/templates/index.html
@@ -5,6 +5,7 @@
{% block content %}
<ul class="index">
+ <li><a href="/stvcount.html">Single Transferable Vote Counter</a></li>
<li><a href="/adapad.html">Adapad</a></li>
<li><a href="/grasp.html">Grasp Interpreter</a></li>
<li><a href="/thue2a.html">Thue Version 2a</a></li>
diff --git a/project/templates/stvcount.html b/project/templates/stvcount.html
new file mode 100644
index 0000000..a64f029
--- /dev/null
+++ b/project/templates/stvcount.html
@@ -0,0 +1,275 @@
+
+{% extends "base.html" %}
+
+
+
+{% block title %}Single Transferable Vote Counter{% endblock %}
+
+
+
+{% block content %}
+
+<h4>Single Transferable Vote Counter</h4>
+
+<p>To give an incredibly brief summary of <a href="https://en.wikipedia.org/wiki/Parliament_of_Australia"
+target="_blank">Australia's political system</a>, both the Federal Parliament and most of the State
+Parliaments are bicameral. The lower houses are generally elected by Instant Runoff, while the upper
+houses generally have half elections using Single Transferable Vote. There are exceptions and a whole
+lot of differing details, but that's the overall pattern.</p>
+
+<p>In 2016, however, the Federal Parliament underwent a Double Dissolution, causing the entirety of
+both houses to go to an election. This had the outcome of 20 out of 76 seats going to third parties
+in the upper house, a record number. Even more than the 18 there were prior. As the entire purpose of
+a Double Dissolution is to break deadlocks in parliament, to have the outcome go in the
+<a href="http://www.abc.net.au/news/2016-07-03/crabb-election-2016-is-lose-lose-for-malcolm-turnbull/7565840"
+target="_blank">complete opposite direction</a> probably caused some dismay from Malcolm Turnbull
+and his Liberal/National government.</p>
+
+<p>This raises the question: Would they have been better off had a normal election happened instead?</p>
+
+<p>To calculate the likely outcome, the ballot preference data is needed. That's the easy part, as
+the Australian Electoral Commission makes that available
+<a href="http://results.aec.gov.au/20499/Website/SenateDownloadsMenu-20499-Csv.htm" target="_blank">here</a>
+in the 'Formal preferences' section. Then, a program is needed to execute the STV algorithm, which is
+as follows:</p>
+
+<ol>
+ <li>Set the quota of votes required for a candidate to win.</li>
+ <li>Allocate the ballot papers according to first preference to each of the candidates for
+ initial vote totals.</li>
+ <li>Mark any candidate who has reached or exceeded the quota as elected.</li>
+ <li>If any elected candidate has more votes than the quota, transfer the excess to the other
+ candidates according to the next applicable preference.</li>
+ <li>If no further candidates meet the quota, the candidate with the fewest votes is eliminated
+ and their votes are transferred to the others according to next applicable preference.</li>
+ <li>Repeat steps 3-5 until all seats are filled.</li>
+</ol>
+
+<p>Seems simple enough, right? Except not really. There is a surprising amount of complexity in there, and most
+of it is to do with how to transfer votes around. So, in addition, there are the specifics for the version
+used for the Australian Senate:</p>
+
+<ul>
+ <li>Voters are given the option of voting either "above the line" or "below the line". The latter is
+ standard STV. The former used to be a group voting ticket, but for 2016 and later it is treated as
+ a shorthand way of voting, as per instructions
+ <a href="http://www.aec.gov.au/Voting/How_to_vote/Voting_Senate.htm" target="_blank">here</a>.</li>
+ <li>There are <a href="http://www.aec.gov.au/Elections/candidates/files/ballot-paper-formality-guidelines.pdf"
+ target="_blank">specific guidelines</a> on what constitutes a correctly filled out ballot. This is
+ important for parsing the formal preference data.</li>
+ <li>The <a href="https://en.wikipedia.org/wiki/Droop_quota" target="_blank">Droop quota</a> is used.</li>
+ <li>All votes are transferred from elected candidates at a fraction of their value, as per the
+ <a href="https://en.wikipedia.org/wiki/Counting_single_transferable_votes#Gregory" target="_blank">
+ Gregory Method</a>. This can result in fractions with surprisingly large numerators and denominators.
+ This also results in occasional discarding of fractional votes during transfers.</li>
+ <li>Should the next applicable preference of a ballot be a candidate who has already been elected, that
+ preference is ignored and the ballot is transferred to the next preference.</li>
+ <li>If the number of remaining candidates is equal to one more than the number of remaining vacancies,
+ the candidates with the highest vote totals at that point are considered elected.</li>
+</ul>
+
+<p>My implementation (source <a href="http://jedbarber.id.au/cgit/cgit.cgi/stv-count.git/"
+target="_blank">here</a>) also includes <a href="https://en.wikipedia.org/wiki/Counting_single_transferable_votes#Bulk_exclusions"
+target="_blank">bulk exclusions</a> using applied breakpoints in order to increase speed slightly and minimise
+superfluous logging.</p>
+
+<p>At this point I'm fairly sure my program provides an accurate count. However, my numbers still differ
+slightly from the ones provided by the AEC's official distribution of preferences. Investigations into the
+exact cause are ongoing.</p>
+
+<h4>Results</h4>
+
+<p>Calculations were done for each state using the formal preference data with vacancies set to 6 instead of 12,
+and the results were added to the Senators elected in 2013 to find the probable outcome. The results for
+ACT and NT were taken as-is, because the few Senators elected from the territories are not part of the half
+election cadence anyway.</p>
+
+<p>Computational resources required varied from approximately 50 seconds using 46MB of memory for Tasmania, to
+nearly 30 minutes using 1452MB memory for NSW. The vast majority of that time was spent parsing preference data,
+and the program is single threaded, so there is still room for improvement. All counts were run on a Core 2 Quad
+Q9500.</p>
+
+<table>
+ <caption>Probable non-DD results by state</caption>
+ <tr>
+ <th>NSW</th>
+ <th>VIC</th>
+ <th>QLD</th>
+ <th>SA</th>
+ <th>WA</th>
+ <th>TAS</th>
+ </tr>
+ <tr>
+ <td>Liberal</td>
+ <td>Liberal</td>
+ <td>Liberal National</td>
+ <td>Liberal</td>
+ <td>Liberal</td>
+ <td>Liberal</td>
+ </tr>
+ <tr>
+ <td>Labor</td>
+ <td>Labor</td>
+ <td>Labor</td>
+ <td>Labor</td>
+ <td>Labor</td>
+ <td>Labor</td>
+ </tr>
+ <tr>
+ <td>Liberal</td>
+ <td>National</td>
+ <td>Liberal National</td>
+ <td>Xenophon</td>
+ <td>Liberal</td>
+ <td>Liberal</td>
+ </tr>
+ <tr>
+ <td>Labor</td>
+ <td>Labor</td>
+ <td>Labor</td>
+ <td>Liberal</td>
+ <td>Labor</td>
+ <td>Labor</td>
+ </tr>
+ <tr>
+ <td>National</td>
+ <td>Green</td>
+ <td>One Nation</td>
+ <td>Labor</td>
+ <td>Green</td>
+ <td>Jacqui Lambie</td>
+ </tr>
+ <tr>
+ <td>Green</td>
+ <td>Derryn Hinch</td>
+ <td>Liberal National</td>
+ <td>Xenophon</td>
+ <td>Liberal</td>
+ <td>Green</td>
+ </tr>
+</table>
+
+<table>
+ <caption>Probable non-DD Senate composition</caption>
+ <tr>
+ <th>Party</th>
+ <th>Seats Won</th>
+ <th>Continuing Senators</th>
+ <th>Total Seats</th>
+ <th>Difference from Actual</th>
+ </tr>
+ <tr>
+ <td>Liberal/National Coalition</td>
+ <td>17</td>
+ <td>15</td>
+ <td>32</td>
+ <td>+2</td>
+ </tr>
+ <tr>
+ <td>Australian Labor Party</td>
+ <td>14</td>
+ <td>10</td>
+ <td>24</td>
+ <td>-2</td>
+ </tr>
+ <tr>
+ <td>Australian Greens</td>
+ <td>4</td>
+ <td>4</td>
+ <td>8</td>
+ <td>-1</td>
+ </tr>
+ <tr>
+ <td>Xenophon Group</td>
+ <td>2</td>
+ <td>1</td>
+ <td>3</td>
+ <td>Nil</td>
+ </tr>
+ <tr>
+ <td>Jacqui Lambie Network*</td>
+ <td>1</td>
+ <td>1</td>
+ <td>2</td>
+ <td>+1</td>
+ </tr>
+ <tr>
+ <td>Liberal Democratic Party</td>
+ <td>0</td>
+ <td>1</td>
+ <td>1</td>
+ <td>Nil</td>
+ </tr>
+ <tr>
+ <td>Family First Party</td>
+ <td>0</td>
+ <td>1</td>
+ <td>1</td>
+ <td>Nil</td>
+ </tr>
+ <tr>
+ <td>Palmer United Party*</td>
+ <td>0</td>
+ <td>1</td>
+ <td>1</td>
+ <td>+1</td>
+ </tr>
+ <tr>
+ <td>Glenn Lazarus Team*</td>
+ <td>0</td>
+ <td>1</td>
+ <td>1</td>
+ <td>+1</td>
+ </tr>
+ <tr>
+ <td>Australian Motoring Enthusiast Party</td>
+ <td>0</td>
+ <td>1</td>
+ <td>1</td>
+ <td>+1</td>
+ </tr>
+ <tr>
+ <td>One Nation</td>
+ <td>1</td>
+ <td>0</td>
+ <td>1</td>
+ <td>-3</td>
+ </tr>
+ <tr>
+ <td>Derryn Hinch's Justice Party</td>
+ <td>1</td>
+ <td>0</td>
+ <td>1</td>
+ <td>Nil</td>
+ </tr>
+</table>
+
+<p>* These three parties were all part of the Palmer United Party at the 2013/2014 election, but split up mid term.</p>
+
+<p>Surprisingly, these projected results <em>still</em> have 20 out of 76 seats held by third party candidates, despite
+the half election putting them at a disadvantage. The number of third party groups the Liberal Nationals have to
+negotiate with to pass legislation (assuming Labor and Greens attempt to block) equally remains unchanged.</p>
+
+<p>The Greens manage to do slightly worse, even though their usual position of winning the 5th or 6th seat in most states
+often allows them to obtain more representation than their primary vote would otherwise support. This can't even be
+attributed to a bad 2013 result, as their primary vote both then and in 2016 was nearly identical.</p>
+
+<p>One Nation's much reduced number of seats can be attributed to the inherent geographic bias that any system involving
+electing multiple candidates across multiple independent divisions introduces. If like-minded voters are all in one
+place, they receive representation, but when the same number of voters are spread out, they get nothing. When this effect
+is intentionally exploited it's called gerrymandering, but here it's merely an artifact of electing Senators from each
+state separately. One Nation's support is strongest in Queensland but is relatively diffuse. Any claims of Pauline
+Hanson being <a href="http://junkee.com/malcolm-turnbull-will-probably-need-pauline-hansons-support-to-pass-any-laws/82138"
+target="_blank">one of the most powerful politicians in Australia</a> are thus overblown.</p>
+
+<p>The Xenophon Group, by contrast, has the vast majority of their support concentrated in South Australia. So the result
+for them remains unchanged.</p>
+
+<p>The most noteworthy outcomes for the question though, are that the Liberal/Nationals would have obtained more seats,
+and Labor would have been in a more difficult position to block the passage of legislation. Meaning that yes, the
+Liberal/National government would definitely have been better off with a normal election.</p>
+
+<p>Nice job screwing over your own party, Malcolm.</p>
+
+{% endblock %}
+