This, below, is pseudocode for Symmetrical ICT. And,at this point, I emphasize that Symmetrical ICT does very well by criteria and properties:
It can fairly be said to meet the Condorcet Criterion because, as I said, it meets that criterion when "beats" is defined consistently with the intentions and wishes of an equal-top-ranking voter, and of an equal-bottom-ranking voter. It meets FBC It is defection-resistant. It meets LNHe For avoiding the strategy problems that would otherwise distort the sincerity of voters' rankings, Symmetrical ICT is unequalled. Symmetrical ICT is the rank-count that delivers on the promise of rank balloting. Now, about the Symmetrical ICT count pseudocode: Pseudocode is just a description of what to do, without regard to any one particular programming language. I should add that this program is only for counting a set of rankings and giving the final winner(s). And so, for this program to be used for an ongoing poll, in which a winner is found and announced periodically, then the pairwise totals that are incremented in the "Pairwise Totals" section should be saved to a file. And then, the next time the program is run, the statements that initialize them to zero should be deleted from the program. In that way, each new ballot can increment the pairwise totals, and, from those new totals, a new count can be done, to find a new winner or winning set. I should also say that this program assumes that there is already an array, R(k,i), where k is the number of a ballot, and i is the number of a candidate, and R(k,i) is that candidate's rank on that ballot. Most people who actually use a count program use automated balloting, by which the R(k,i) array is automatically calculated from the voted rankings. But, speaking for myself, I've never written software for automated balloting. I've only collected rankings, as we're doing in the current Democracy Chronicles ICT poll, written them down, and entered the rankings into the program, via "input" statements. In case anyone else is interested in doing it that way, the only way that I've ever done it, I enclose, right after the end of the program, a separate program section, for manually inputting into the program, rankings from written ballots. To use it, one would append it to the beginning of the program proper, just before the program proper. As I said, that manual ranking-inputting program section will be after the end of the program proper, and will be clearly labeled. It will be rudimentary. For simplicity, it doesn't include error-correction provisions, and it calls upon the user to input, on each ballot, for each candidate, that candidate's rank on that ballot. I emphasize that I'm not a professional programmer. I've used FORTRAN IV, and BASIC, and got an A in a course in FORTRAN 77. Of course I have a computer (or two). My computer even has a programming language--Microsoft Office includes a programming language called VBA (Visual Basic for Applications). So far, I've been unsuccessful in my attempts to make a simple test program run in VBA. Who knows, maybe someday I'll find out how to make VBA run. But, because I haven't yet, I'm sending my Symmetrical ICT count program without having actually run it. Of course most computer programs contain at least one "bug". In the FORTRAN 77 course, one of my assignment programs ran properly the first time, but most would agree that that is the exception. So I can't guarantee that the enclosed program doesn't contain a bug. But it appears to be correct. The program will be divided into numbered and named sections. There may be comments here and there. If so, they'll be in parentheses, sometimes on their own line (in which case they refer to what's below them if they end in a colon--otherwise they refer to what's above them). Maybe sometimes they'll be at the end of a line, referring to that line. The Symmetrical ICT count pseudocode: (I have an initialization section that initializes a number of global variables. I usually also initialize them at the appropriate place in the program too. No harm in doing it twice.) NC is the number of candidates. NB is the number of ballots. R(k,i) is the array for the rank at which candidate i is ranked on ballot k. 1. Initialization: NBeaten = 0 (No one initially beaten) (Initialize everyone unbeaten:) For i = 1 to NC ...Beaten(i) = 0 ...Win(i) = 0 ...NTop(i) = 0 Next i (Initialize everyone at bottom on every ballot:) For k = 1 to NB ...For i = 1 to NC ......Bottom(k,i) = 1 ...Next i Next k (Initialize all the pairwise totals to zero:) For i = 1 to NC ...For j = 1 to NC ...V(i,j) = 0 (votes for i over j) ...ET(i,j) = 0 (ballots with i and j top ranked) ...EB(i,j) = 0 (ballots with i and j at bottom) Next i (at bottom means not ranked over anyone on that ballot) 2. Pairwise totals: (i's top-count, i-j pairwise vote totals and equal-top:) For k = 1 to NB ...For i = 1 to NC ......Top(k,i) = 0 ......Ntop(i) = 0 ......For j = 1 to NC .........If R(k,i) < R(k,j) then ............V(i,j) = V(i,j) + 1 .........Endif .........If R(k,i) = 1 AND R(k,j) = 1 AND i<>j then ............ET(i,j) = ET(i,j) + 1 .........Endif ......Next j ...Next i (Is i at bottom on ballot k?:) For i = 1 to NC ...For j = 1 to NC ......If R(k,i) < R(k,j) then .........Bottom(k,i) = 0 (i is not at bottom) ......Endif ...Next j Next i 3. Increment i-j equal bottom count? For i = 1 to NC ...For j = 1 to NC ......If Bottom(k,i) = 1 AND Bottom(k,j) = 1 AND i<>j then .........EB(i,j) = EB(i,j) +1 ......Endif ...Next j Next i Next k (Is candidate i unbeaten?:) For i = 1 to NC ...For j = 1 to NC ......If V(j,i) + EB(i,j) > V(i,j) + ET(i,j) then .........Beaten(i) = 1 ......Endif ...Next j ...If Beaten(i) = 1 then ......NBeaten = NBeaten + 1 ...Endif Next i 4. Find winners: (If exactly 1 candidate is unbeaten:) If Nbeaten = NC - 1 then: ...For i = 1 to NC ......If Beaten(i) = 0 then .........Win(i) = 1 .........Print Name(i), "_Wins." ......Endif ...Next i Stop Endif (If all or no candidates are unbeaten:) (Find maximum top-score:) If NBeaten = 0 OR NBeaten = NC ...Max = 0 ...For i = 1 to NC ......If Top(i) > Max then: .........Max = Top(i) ......Endif ...Next i (Find who has that top-score:) ...For i = 1 to NC ......If Top(i) = Max then: .........Win(i) = 1 .........Print Name(i), "_Wins." ......Endif ...Next i Stop Endif (If some but not all candidates are unbeaten:) Same as (If all or no candidates are unbeaten), except that: If Max = Top(i) becomes: If Max = Top(i) AND Beaten(i) = 0 And: If Top(i) = Max becomes: If Top(i) = Max AND Beaten(i) = 0 [End of program] Here is rudimentary code to manually enter rankings into the program: For k = 1 to NB ...For i = 1 to NC ......Print Name(i) ......Input "Rank", R(k,i) ...Next i Next k [end of manual ranking-entry program] As I said, if that manual ranking-entry program is used, then it should be appended to the beginning of the main program described above. Mike Ossipoff . ---- Election-Methods mailing list - see http://electorama.com/em for list info
