[EM] simulator code for 2 Approval methods
raphfrk at netscape.net
raphfrk at netscape.net
Fri Dec 15 12:04:45 PST 2006
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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.electorama.com/pipermail/election-methods-electorama.com/attachments/20061215/662eef8c/attachment-0001.htm>
More information about the Election-Methods
mailing list