Thanks. I have created 2 methods.
 
 The first one is approval zero info. In this case, the voter averages his 
utility for all the candidates and places his approval threshold at the average.
 
 The second one is the same as above. However, it runs 2 elections. The first 
election uses the same as above and is considered a poll (might be worth 
reducing the number of voters to <numv ?). For the second 'real' election, the 
threshold is set at the average of the winner and second place in the poll. 
This approx means that the voter will vote for his favourite of the top 2 and 
all he prefers more.
 
 Unless anyone objects, I will post the code here (or at least if someone 
objects, I won't do it again). This has the added advantage that any code 
errors may be spotted :).
 
 I don't have the ability to compile as I am basing it on the code snippet, so 
it may not compile, but I did read it through.
 
 void ApprovalNoInfo::runElection( int* winnerR, const VoterArray& they ) {
 int i,j;
 int* talley;
 int winner, second_place;
 int numc = they.numc;
 int numv = they.numv;
 
 // init things
 talley = new int[numc];
 for ( i = 0; i < numc; i++ ) {
 talley[i] = 0;
 }
 
 double* thresh;
 thresh = new double[numv];
 
 for ( i = 0; i < numv; i++ ) {
 thresh[i] = 0;
 for ( j = 0; j < numc; j++) {
 thresh[i] += they[i].getPref( j );
 }
 thresh[i] = thresh[i]/numc;
 }
 
 // count votes for each candidate
 for ( i = 0; i < numv; i++ ) {
 for ( j = 0; j < numc; j++) {
 if ( they[i].getPref[j] >= thresh[i] ) {
 talley[j]++;
 }
 }
 }
 // find winner + second place
 {
 int m = -1;
 int m2 = -2; // second place
 for ( i = 0; i < numc; i++ ) {
 if ( talley[i] > m ) {
 m2 = m;
 m = talley[i];
 second_place=winner;
 winner = i;
 } else if ( talley[i] > m2 ) {
 m2 = talley[i];
 second_place = i;
 }
 }
 }
 
 
 delete [] talley;
 delete [] thresh;
 if ( winnerR ) {
 *winnerR = winner;
 *(winnerR+1) = second_place; // not really needed
 }
 
 }
 
 -----------------------------------------------------
   
 void ApprovalWithPoll::runElection( int* winnerR, const VoterArray& they ) {
 int i,j;
 int* talley;
 int winner, second_place;
 int numc = they.numc;
 int numv = they.numv;
 
 // init things
 talley = new int[numc];
 for ( i = 0; i < numc; i++ ) {
 talley[i] = 0;
 }
 
 double* thresh;
 thresh = new double[numv];
 
 for ( i = 0; i < numv; i++ ) {
 thresh[i] = 0;
 for ( j = 0; j < numc; j++) {
 thresh[i] += they[i].getPref( j );
 }
 thresh[i] = thresh[i]/numc;
 }
 
 // count votes for each candidate
 for ( i = 0; i < numv; i++ ) {
 for ( j = 0; j < numc; j++) {
 if ( they[i].getPref[j] >= thresh[i] ) {
 talley[j]++;
 }
 }
 }
 // find winner + second place
 {
 int m = -1;
 int m2 = -2; // second place
 for ( i = 0; i < numc; i++ ) {
 if ( talley[i] > m ) {
 m2 = m;
 m = talley[i];
 second_place=winner;
 winner = i;
 } else if ( talley[i] > m2 ) {
 m2 = talley[i];
 second_place = i;
 }
 }
 }
 
 // Above assumed to be 'poll'
 
 // init things
 talley = new int[numc];
 for ( i = 0; i < numc; i++ ) {
 talley[i] = 0;
 }
 
 
 // Threshold set to average of top 2 from 'poll'
 for ( i = 0; i < numv; i++ ) {
 thresh[i] = ( they[i].getPref[winner] + they[i].getPref[second_place] ) / 2.0 ;
 }
 
 // count votes for each candidate
 for ( i = 0; i < numv; i++ ) {
 for ( j = 0; j < numc; j++) {
 if ( they[i].getPref[j] >= thresh[i] ) {
 talley[j]++;
 }
 }
 }
 // find winner + second place
 {
 int m = -1;
 int m2 = -2; // second place
 for ( i = 0; i < numc; i++ ) {
 if ( talley[i] > m ) {
 m2 = m;
 m = talley[i];
 second_place=winner;
 winner = i;
 } else if ( talley[i] > m2 ) {
 m2 = talley[i];
 second_place = i;
 }
 }
 }
 
 delete [] talley;
 delete [] thresh;
 if ( winnerR ) {
 *winnerR = winner;
 *(winnerR+1) = second_place;
 }
 
 
 // return pickOneHappiness( they, numv, winner );
 }
 
 
  Raphfrk
 --------------------
 Interesting site
 "what if anyone could modify the laws"
 
 www.wikocracy.com 
 
   
________________________________________________________________________
Check Out the new free AIM(R) Mail -- 2 GB of storage and industry-leading spam 
and email virus protection.
----
election-methods mailing list - see http://electorama.com/em for list info

Reply via email to