<div dir="ltr"><div class="gmail_default" style="font-family:"times new roman",serif"><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">Kevin Bass' work on rethinking STV encouraged me to dig out my old proportional method and dust it off.</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">Kevin outlines two trial elections that many formulations of STV will produce an unsatisfying outcome for.</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><a href="http://blog.opavote.com/2016/06/guest-post-rethinking-stv-fundamentals.html" target="_blank">http://blog.opavote.com/2016/<wbr>06/guest-post-rethinking-stv-<wbr>fundamentals.html</a><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br>My system gets those two tests right, and I think has some other good qualities worth discussing.<br><br>I call my system <b>"Instant Runoff Normalized Ratings, Proportional" (IRNRP).</b> If you've been following this discussion forum for enough years, you may have heard me talk about the single-winner variant.<br><b><br>STV/IRV ignore useful information.</b> Because they only look at the currently-top-ranked choice on each ballot, we get the classic IRV failure mode of not electing a com</font><span style="font-family:"times new roman",serif">promise candidate where there's good 2nd-choice support but less 1st-choice support.</span><br></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><span style="font-family:"times new roman",serif"><br></span></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><span style="font-family:"times new roman",serif"><b>IRNRP looks at the whole ballot</b>. Like most ratings based method, it operates on summing up the ratings for each choice across all voters.</span></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><span style="font-family:"times new roman",serif"><br></span></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><span style="font-family:"times new roman",serif">There are probably discontinuities/non-monotonic regions, but they are probably smaller. In Ka Ping Yee style election space diagrams, the single winner IRNR has much smaller discontinuous zones than IRV. I haven't ported my IRNRP implementation to C for the fast simulation framework to generate such a diagram, and those things are messier in multi-winner situation, but it could be on the TODO list.</span></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">Also, given the recent talk of sharing programs, I've implemented it in about 100 lines of Python:</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><span style="font-family:"times new roman",serif"><a href="https://bitbucket.org/bodhisnarkva/voteutil/src/58bb573731df1f0c493c04189aa6b818637d9421/python/irnrp.py?at=default&fileviewer=file-view-default" target="_blank">https://bitbucket.org/<wbr>bodhisnarkva/voteutil/src/<wbr>58bb573731df1f0c493c04189aa6b8<wbr>18637d9421/python/irnrp.py?at=<wbr>default&fileviewer=file-view-<wbr>default</a></span><br></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">Read the source, or my <b>prose version of the algorithm</b>:</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><div class="gmail_default">    Given a set of votes that are ratings from voters across some</div><div class="gmail_default">    choices (higher rating better), elect several choices in proportion to</div><div class="gmail_default">    their support in the voters.</div><div class="gmail_default"><br></div><div class="gmail_default">    At any time a single vote is 'normalized' by dividing it by the</div><div class="gmail_default">    sum of absolute values of its component ratings. The sum of</div><div class="gmail_default">    absolute values of the ratings of the normalized vote should be</div><div class="gmail_default">    1.0</div><div class="gmail_default"><br></div><div class="gmail_default">    Each competing choice starts off with a 'weight' of 1.0</div><div class="gmail_default"><br></div><div class="gmail_default">    Add up the votes, for each vote:</div><div class="gmail_default">      Multiply each rating by the global weight for that chioice</div><div class="gmail_default">      Normalize to 1.0 the sum of absolute values of ratings</div><div class="gmail_default">      Add up these weighted-then-normalized votes</div><div class="gmail_default"><br></div><div class="gmail_default">    A choice is considered elected if it has greater than the quota of:</div><div class="gmail_default">    ((number of active voters) / ((number of seats to elect) + 1))</div><div class="gmail_default"><br></div><div class="gmail_default">    If a sufficient number of choices are elected, we're done.</div><div class="gmail_default"><br></div><div class="gmail_default">    The weight of each elected choice shall be decreased so that it</div><div class="gmail_default">    receives less surplus vote but still greater vote than the needed</div><div class="gmail_default">    quota to win. This may be repeated several times, doing a recount</div><div class="gmail_default">    as above to integrate the new weights and the re-normalized votes</div><div class="gmail_default">    which result.</div><div class="gmail_default"><br></div><div class="gmail_default">    If adjusting the weights of the winners does not move enough</div><div class="gmail_default">    surplus vote to elect a full set of winners, whichever choice has</div><div class="gmail_default">    the least vote shall have its weight set to 0.0 and thus be</div><div class="gmail_default">    disqualified. Re-count with re-normalized votes accounting for</div><div class="gmail_default">    this choice having been removed from consideration.</div><div class="gmail_default"><br></div><div class="gmail_default">    A voter can become 'inactive' and not counted in the total number</div><div class="gmail_default">    of voters if all of the non-zero rated choices on their ballot</div><div class="gmail_default">    have become disqualified.</div></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><br></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">If you check out the source:</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">hg clone <a href="https://bitbucket.org/bodhisnarkva/voteutil" target="_blank">https://bitbucket.org/<wbr>bodhisnarkva/voteutil</a><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif">You can run the two tests with commands like this:</font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><br></font></div><div class="gmail_default" style="font-family:arial,sans-serif;font-size:12.8px"><font face="times new roman, serif"><div class="gmail_default">python3 python/countvotes.py --html=/tmp/a.html - --enable-repeat  --seats=3<<EOF</div><div class="gmail_default">*12 a=9&b=8</div><div class="gmail_default">*7 b=9&a=8</div><div class="gmail_default">*9 r=9&s=8</div><div class="gmail_default">*8 s=9&r=8</div><div class="gmail_default">EOF</div><div class="gmail_default"><br></div><div class="gmail_default">python3 python/countvotes.py --html=/tmp/b.html - --enable-repeat  --seats=5<<EOF</div><div class="gmail_default">*690 a=9&b=8&c=7&d=6&e=5&v=4&w=3&x=<wbr>2&y=1&z=0.5</div><div class="gmail_default">*310 v=10&w=9&x=8&y=7&z=6&a=5&b=4&<wbr>c=3&d=2&e=1</div><div class="gmail_default">EOF</div></font></div></div></div>