[EM] STV is nonmontonic 24% of vote negated

Craig Carey research at ijs.co.nz
Wed Oct 18 14:04:33 PDT 2000



The Alternative Vote will reverse the intent of 24.98% of voters'
votes. It negates their intent.

An instance making this practical: a mayor or politician campaigns for
themselves. That person's support rises by 24.98% of the total vote.
The Alternative Vote will make that gain, cause a loss.


                          [1]     [2]
                +----------------------+
                |  AB   14992    7498  |   ab
                |  BC    7503    7503  |   bc
                |  CA    7505   14999  |   ca
                +----------------------+
  Alternate Vote, STV:     C       B
                 IFPP:     A       C
                 FPTP:     A       C

         (ab+bc):               15001
         (bc+ca):       15008

     Total Votes:       30000   30000
       1/3 Quota:       10000   10000

     24.98% of the votes held in ballot papers (AB) are
     remarked as (CA), causing C to change from a winner to a
     loser.  I.e. this alteration occurred:

             (7494:AB{C+)-(7494:CA{B+)

     What happened to B seems doubtful but it is allowed by my P1 rule.
     What happened to C is not OK under my P1.

     Both FPTP and the IFFP method are monotonic so no example of this
     sort can be found for them.

     I haven't finished checking out the 3 candidate 1 winner STV
     simplex.


This example shows that the Alternative Vote and STV elects the wrong
winners. The methods seem to be unfair.

---

This particular example locally maximises the percentage of votes that
were shifted, subject to the papers leaving one paper and going to only
one other. Another thing that could be done, is to attempt to make
maximally negative the weight that seems to be being used by the method.

Some methods, like Borda [and STV with its transfer values] actually
have weights so we can know that they are positive.

Does anybody want to post in the (negative) weight that is being used in
the example above?.

Many people knew that STV was unfair all along. Certainly it is not
made fair by publishing pamphlets and websites saying it is.

Below is REDLOG code I wrote to find this example on 19 Oct 2000.


######################################################################

This algorithm has a fairly good speed when it is finding a problem
but it can be very slow when rlqe or rlqea can't find a monotonicity
violation. I provide this for the CVD.

%---------------------------------------------------------------------
% 18..19 Oct-2000 %%%%%
load_package rl;  % REDLOG and REDUCE 3.6
rlset ofsf;

procedure faces(q); begin
    % faces (a<=b and a<=c and (2*a<=b+c)) = {2*a - b - c,a - b,a - c}
    % should not return faces for <> & =.
    scalar q,f1,f2;
    f1 := second rlifstruct(q,facesv);
    return foreach f2 in f1 collect rhs f2;
end;

procedure surf(p); begin
   % surf(a<b and a<c and c<>d and d<=e and a+c<b+d) =
   %               a-b+c-d = 0 or a-b = 0 or a-c = 0 or c-d = 0 or d-e = 0
   scalar p,q,r;  % this is not quite right, e.g.  (a=0)and(...)
   r := false; q := faces(p);
   for k:=1:length(q) do   %if 'true = rlqe rlex (p and 0<>part(q,k)) then
     r := r or (0 = part(q,k));
   return rlsimpl r;
end;

procedure nsurf(q); begin  return not surf(q);  end;

procedure w31_1(a0,b0,c0, ab,ac, bc,ba, ca,cb); begin
    scalar Tbca,Tcba;
    scalar a,b,c;  a:=a0+ab+ac;  b:=b0+bc+ba;  c:=c0+ca+cb;
    Tbca := (c+bc<a+ba);
    Tcba := (b+cb<a+ca);
    return (b<a)and(b<c)and Tbca or (c<b)and(c<a)and Tcba;
end;

procedure w31_2(a0,b0,c0, ab,ac, bc,ba, ca,cb); begin
    scalar Tacb,Tcab;
    scalar a,b,c;  a:=a0+ab+ac;  b:=b0+bc+ba;  c:=c0+ca+cb;
    Tacb := (c+ac<b+ab);
    Tcab := (a+ca<b+cb);
    return (a<b)and(a<c)and Tacb or (c<a)and(c<b)and Tcab;
end;

procedure w31_3(a0,b0,c0, ab,ac, bc,ba, ca,cb); begin
    scalar Tabc,Tbac;
    scalar a,b,c;  a:=a0+ab+ac;  b:=b0+bc+ba;  c:=c0+ca+cb;
    Tabc := (b+ab<c+ac);
    Tbac := (a+ba<c+bc);
    return (a<c)and(a<b)and Tabc or (b<a)and(b<c)and Tbac;
end;

uv3 := (0<=a0)and(0<=b0)and(0<=c0)and
                  (0<=ab)and(0<=ac)and
        (0<=ba)and          (0<=bc)and
        (0<=ca)and(0<=cb);

off rounded;  precision 8;

procedure ty3(mlb,mub); begin
    scalar j,k, ret2, iter,len,s1;
    clear x, a0,b0,c0, ab,ac, bc,ba, ca,cb;
    len:=9;   extrap := 3;
    array xlb(9,9),xub(9,9);
    hga := w31_3(a0,b0,c0, ab,ac, bc,ba, ca,cb);
    huv := uv3 and (a0+b0+c0+ab+ac+bc+ba+ca+cb = 10000);
    s1 := {a0,b0,c0, ab,ac, bc,ba, ca,cb};
    iter := 1;
    AGAIN: ;
    write "iter = ",iter;
    for j:=1:length(s1) do begin
       for k:=1:length(s1) do begin
          if (part(s1,j) member {c0,ac,bc,ca,cb})
                and not (j=k)
                and 0 <= xub(j,k)
                and j=8 and k=4   % try this one
          then begin
             if iter = 1 then mnk := mlb               % binary search
             else mnk := min(extrap*xlb(j,k), (xlb(j,k) + xub(j,k))/2);
             s3 := {part(s1,j)=part(s1,j)+x, part(s1,k)=part(s1,k)-x};
             s4 := {part(s1,j)+x, part(s1,k)-x};
       write iter," entering ",{{j,k, xlb(j,k),xub(j,k)}, mnk, s3, s4};
             ret2 := hg ({j,k, xlb(j,k),xub(j,k)}, mnk, s3, s4);
goto EXIT;
       write iter," leaving ",{{j,k, xlb(j,k),xub(j,k)}, mnk, s3, s4};
             if 2 = ret2 then begin     % found solution
                xlb(j,k) := mnk;
                if iter = 1 then xub(j,k) := mub;
             end else begin
                if iter = 1 then xub(j,k) := -1
                else xub(j,k) := mnk;
             end;
    end; end; end;  iter := iter+1;
    goto AGAIN;
EXIT: ;
end;

% Find a monotonicity violation wrt. C greater that (mnk/100)%
% C wins ("hga") and adding votes ("x") makes C lose ("sub(s,hga)").

procedure hg(u,mnk,s,s4); begin  % globals hga, huv
    scalar ret,hh,h3,test;
    % write "->hg:",{"mnk=",mnk, u,mnk,"s=",s,s4,"huv=",huv,"hga=",hga};
    off rounded;
    hh := rlsimpl (rlsimpl(huv and sub(s,huv)) and mnk<=x and
             hga and not sub(s,hga)
             and nsurf(sub(s,hga)));   % need the nsurf
    if 1 = 1 then begin    % added
       s8:={
             a0 = 0
            ,ab = 14992/3
            ,ac = 0
            ,b0 = 0
            ,ba = 0
            ,bc = 2501
            ,c0 = 7505/3
            ,ca = 0
            ,cb = 0
            ,x = 2498
       };
       hh := rlsimpl sub(s8,hh);
    end;
    hh := rlex hh;
    h3 := rlqe  rlsimpl hh;  test := h3;                 h3a := 0;
       %  h3 := rlqea rlsimpl hh;  test := part(part(h3,1),1); h3a := 1;
    if 'true = test then begin
       write u," YES ",{"mnk=",mnk,u,h3,s4,hh};
       if 0=h3a then begin  write "MORE... rlqea =";
          on rounded;
          write rlqea rlsimpl hh;
          off rounded;
          write rlqea rlsimpl hh;
       end;
       ret := 2;
    end else begin
       write u," NO  ",{"mnk=",mnk,u,h3,s4,hh};
       ret := 1;
    end;
    return ret;
end;

ty3(1667,2501);

%---------------------------------------------------------------------
% untested code to found the 4 candidate monotonicity violations
uv4 :=
       (0<=a0)and(0<=b0)and(0<=c0)and(0<=d0)and
       (0<=ab0)and(0<=ac0)and(0<=ad0)and
...  [unfinished. Maybe I can get the votes negated upto 38%.]



IFPP defined: http://www.ijs.co.nz/ifpp.htm




G. A. Craig Carey
Auckland
New Zealand.



More information about the Election-Methods mailing list