Condorcet winner

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 winner criterion, a voting system should select a candidate who wins all head-to-head competitions.

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

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

The plurality method selects candidate $c$ because $c$ has the most first rank preferences. However, candidate $a$ is the Condocet winner. In a head-to-head competition, candidate $a$ defeats candidate $b$:

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

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

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

The Condorcet winner criterion is not satisfied in the example above: candidate $a$ is the Condorcet winner, but the plurality method selected candidate $c$.

Usage

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

Satisfies

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

using RankChoiceVoting
criterion = CondorcetWinner()
satisfies(criterion)
1-element Vector{VotingSystem}:
 Minimax()

Example

In the next example, we will illustrate how to check whether the Bucklin system violates the Condorcet winner 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 winner criterion for the preference profile above.

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

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

References