[MN-dev] [mndiff]: r178 - trunk/ffvotetov/ffvotetov.c

michael subversion at mplayerhq.hu
Fri Dec 18 20:51:02 CET 2009


Author: michael
Date: Fri Dec 18 20:51:02 2009
New Revision: 178

Log:
Better tie breaking for IRV.

Modified:
   trunk/ffvotetov/ffvotetov.c

Modified: trunk/ffvotetov/ffvotetov.c
==============================================================================
--- trunk/ffvotetov/ffvotetov.c	Fri Dec 18 19:52:51 2009	(r177)
+++ trunk/ffvotetov/ffvotetov.c	Fri Dec 18 20:51:02 2009	(r178)
@@ -212,6 +212,7 @@ void print_irv(void){
     printf("Instant runoff winners:\n");
     for(;;){
         int votes[CANDIDATES_MAX]={0};
+        int votes2[CANDIDATES_MAX]={0};
         int min= INT_MAX;
         int non_min= 0;
 
@@ -222,19 +223,33 @@ void print_irv(void){
         }
         for(i=0; i<canditate_count; i++){
             fprintf(stderr, "%3d", votes[i]);
+            if(!droped_canditates[i] && votes[i] < min)
+                min=votes[i];
+        }
+
+        for(i=0; i<vote_count; i++){
+            for(j=0; j<canditate_count && irv[i][j] && droped_canditates[irv[i][j]-1]; j++);
+            if(j<canditate_count && irv[i][j] && votes[ irv[i][j]-1 ]== min)
+                j++;
+            for(; j<canditate_count && irv[i][j] && droped_canditates[irv[i][j]-1]; j++);
+            if(irv[i][j])
+                votes2[ irv[i][j]-1 ]++;
+        }
+        min= INT_MAX;
+        for(i=0; i<canditate_count; i++){
+            fprintf(stderr, "%3d", votes2[i]);
             if(!droped_canditates[i]){
-                if(min != INT_MAX && votes[i] != min)
-                    non_min=1;
-                if(votes[i] <= min){
-                    min=votes[i];
-                }
+                if(min != INT_MAX && votes2[i] != min)
+                    non_min= 1;
+                if(votes2[i] <= min)
+                    min=votes2[i];
             }
         }
         fprintf(stderr, "\n");
         if(!non_min)
             break;
         for(i=0; i<canditate_count; i++){
-            if(votes[i] == min)
+            if(votes2[i] == min)
                 droped_canditates[i]=1;
         }
     }


More information about the Mndiff-dev mailing list