Condorcet loser

In a head-to-head competition, let $d(x,y)$ be a function which counts the number of voters who perfer $x$ to $y$. Candidate x wins the head-to-head competition if $d(x,y) > d(y,x)$. According to the Condorcet loser criterion, a voting system should not select a candidate who losses in all head-to-head competitions.

Below, we will illustrate how the plurality method can violate the Condorcet loser criterion. Consider the preference profile of $n=10$ voters for candidates $C = \{a,b,c\}$.

using RankChoiceVoting
system = Plurality()
ranks = [[:a,:b,:c],[:b,:c,:a],[:c,:b,:a]]
counts = [4,3,3]
rankings = Ranks(counts, ranks)
Ranks
┌────────┬──────────────┐
│ Counts │ Ranks        │
├────────┼──────────────┤
│ 4      │ [:a, :b, :c] │
│ 3      │ [:b, :c, :a] │
│ 3      │ [:c, :b, :a] │
└────────┴──────────────┘

The plurality method selects candidate $a$ because $a$ has the most first rank preferences. Now let's see how candidate $a$ performs in head-to-head compititions between canidates $b$ and $c$. In a head-to-head competition, candidate $a$ loses to candidate $b$:

  • a vs. b: 4
  • b vs. a: 6

In a head-to-head competition,candidate $a$ also loses to candidate $c$:

  • a vs c: 4
  • c vs a: 6

Candidate $a$, who was selected by the plurality method, is a Condorcet loser because $a$ lost each head-to-head competition.

Usage

The following examples illustrate various uses of the Condorcet loser criterion.

Satisfies

We can see which systems are guaranteed to satisfy the Condorcet loser criterion by calling satisfies with the majority criterion object.

using RankChoiceVoting
criterion = CondorcetLoser()
satisfies(criterion)
2-element Vector{VotingSystem}:
 Borda()
 InstantRunOff()

Example

In the next example, we will illustrate how to check whether the Bucklin system violates the Condorcet loser criterion for a specific preference profile. Consider the following preference profile of $n=100$ voters for $m=4$ candidates.

ranks = [[:a,:b,:c],[:b,:c,:a],[:b,:a,:c],[:c,:a,:b]]
counts = [37,22,12,29]
rankings = Ranks(counts, ranks)
Ranks
┌────────┬──────────────┐
│ Counts │ Ranks        │
├────────┼──────────────┤
│ 37     │ [:a, :b, :c] │
│ 22     │ [:b, :c, :a] │
│ 12     │ [:b, :a, :c] │
│ 29     │ [:c, :a, :b] │
└────────┴──────────────┘

Now, create an Bucklin voting system object:

system = Bucklin()
Bucklin()

In the code block below, we can determine the winner of the election with the function evaluate_winner as follows:

evaluate_winner(system, rankings)
1-element Vector{Symbol}:
 :a

In the next code block, we will use the function satisifies to determine whether the Bucklin system complies with the Condorcet loser criterion for the preference profile above.

criterion = CondorcetLoser()
satisfies(system, criterion, rankings)
true

Although the Bucklin system does not satisfy the Condorcet loser criterion in general, it does satisfy it in this specific example.