[EM] Floyd-Warshall algorithm - variations

Markus Schulze markus.schulze at alumni.tu-berlin.de
Fri Dec 19 15:07:01 PST 2003


Dear Ernest,

I don't know Python-ish pseudo-code. But in Pascal/C-ish pseudo-code
the Dijkstra algorithm (aka Dykstra algorithm) looks as follows when
the strength of a pairwise defeat is measured primarily by p1 (= the
absolute number of votes for the winner of this pairwise defeat) and
secondarily by p2 (= the margin of this pairwise defeat):

***

N is the number of candidates.

Input: d[i,j] with i <> j is the number of voters who strictly prefer
candidate i to candidate j.

Output: "w[i] = true" means that candidate i is a potential winner.
"w[i] = false" means that candidate i is not a potential winner.

***

for i : = 1 to N do
for j : = 1 to N do
if ( i <> j ) then
   {
    if ( d[i,j] > d[j,i] ) then
    d1[i,j] : = d[i,j] ;
    if ( d[i,j] <= d[j,i] ) then
    d1[i,j] : = -1 ;

    d2[i,j] : = d[i,j] - d[j,i] ;

    p1[i,j] : = d1[i,j] ;
    p2[i,j] : = d2[i,j] ;
   }

for i : = 1 to N do
   {
    for j : = 1 to N do
    unchecked[j] : = true ;

    unchecked[i] : = false ;

    for j : = 2 to N do
      {
       v : = - MAXINT ;
       w : = - MAXINT ;
       x : = 0 ;
       
       for k : = 1 to N do
       if ( unchecked[k] = true ) then
       if (( p1[i,k] > v ) or (( p1[i,k] = v ) and ( p2[i,k] > w ))) then
         {
          v : = p1[i,k] ;
          w : = p2[i,k] ;
          x : = k ;
         }

       unchecked[x] : = false ;

       for k : = 1 to N do
       if ( unchecked[k] = true ) then
          {
           s : = min { p1[i,x], d1[x,k] } ;
           if ( p1[i,x] < d1[x,k] ) then
           t : = p2[i,x] ;
           if ( p1[i,x] > d1[x,k] ) then
           t : = d2[x,k] ;
           if ( p1[i,x] = d1[x,k] ) then
           t : = min { p2[i,x], d2[x,k] } ;
           
          if (( p1[i,k] < s ) or
             (( p1[i,k] = s ) and ( p2[i,k] < t ))) then
             {
              p1[i,k] : = s ;
              p2[i,k] : = t ;
             }
          }
      }
   }

for i : = 1 to N do
   {
    w[i] : = true ;
    for j : = 1 to N do
    if ( i <> j ) then
    if (( p1[j,i] > p1[i,j] ) or
       (( p1[j,i] = p1[i,j] ) and ( p2[j,i] > p2[i,j] ))) then
    w[i] : = false ;
   }

Markus Schulze



More information about the Election-Methods mailing list