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.