コード例 #1
0
ファイル: sim_condorcet.php プロジェクト: pkeane/stvtools
function runElections()
{
    $num_cands = 30;
    $cands = array();
    foreach (range(1, $num_cands) as $num) {
        $cands[] = 'cand' . $num;
    }
    $pairs = getAllPairs($cands);
    $result = array();
    $condorcets = array();
    foreach (range(0, 100000) as $j) {
        $ballot_set_name = 'ballot_' . sprintf("%07d", $j);
        $dir = substr($ballot_set_name, -3);
        $filepath = 'sim_ballots/' . $dir . '/' . $ballot_set_name . '.json';
        processBallotSet($filepath, $ballot_set_name, $pairs);
    }
}
コード例 #2
0
function runBallots($cands, $ballots)
{
    $cprobs = array();
    $final_probs = array();
    $pairs = getAllPairs($cands);
    foreach ($ballots as $b) {
        $pairs = getBallotPairs($cands, $b, $pairs);
    }
    $ballots_with_neither = array();
    foreach ($ballots as $ballot) {
        foreach ($cands as $I) {
            foreach ($cands as $J) {
                if ($I != $J) {
                    if (!isset($ballots_with_neither[$I])) {
                        $ballots_with_neither[$I] = array();
                    }
                    if (!isset($ballots_with_neither[$I][$J])) {
                        $ballots_with_neither[$I][$J] = 0;
                    }
                    if (!in_array($I, $ballot) and !in_array($J, $ballot)) {
                        $ballots_with_neither[$I][$J] += 1;
                    }
                }
            }
        }
    }
    //print_r($ballots_with_neither);exit;
    foreach ($ballots as $ballot) {
        foreach ($cands as $I) {
            $cprobs[$I] = array();
            foreach ($cands as $J) {
                if ($I != $J) {
                    $cprobs[$I][$J] = '';
                    //per Tse-min algorithm
                    $V = count($ballots);
                    $M = floor($V / 2) + 1;
                    $C = count($cands);
                    $R = count($ballots) - $ballots_with_neither[$I][$J];
                    $S = $ballots_with_neither[$I][$J];
                    $T = $pairs[$I][$J];
                    $IbeatJ = $pairs[$I][$J];
                    $JbeatI = $pairs[$J][$I];
                    $prob = $IbeatJ / ($IbeatJ + $JbeatI);
                    $Q = $prob;
                    $k_range = $M - $T - 1;
                    if ($M - $S <= $T && $T < $M) {
                        $sum = 0;
                        foreach (range(0, $k_range) as $k) {
                            $sum += binomial($S, $Q, $k);
                        }
                        $new_prob = 1 - $sum;
                    }
                    if ($T + $S < $M) {
                        $new_prob = 0;
                    }
                    if ($T >= $M) {
                        $new_prob = 1;
                    }
                    $cprobs[$I][$J] = $new_prob;
                    global $PRINT;
                    if ($PRINT) {
                        print "\n----------------------\n";
                        print "I is {$I}\n";
                        print "J is {$J}\n";
                        print "V is {$V}\n";
                        print "M is {$M}\n";
                        print "C is {$C}\n";
                        print "R is {$R}\n";
                        print "S is {$S}\n";
                        print "T is {$T}\n";
                        print "Q is {$Q}\n";
                        print "k range is {$k_range}\n";
                        print "calculated probability is {$new_prob}\n";
                    }
                }
                // I != J
            }
            // foreach J
        }
        //foreach I
        foreach ($cprobs as $I => $J_array) {
            $final_probs[$I] = round(array_product($J_array), 4);
        }
    }
    return $final_probs;
}
コード例 #3
0
function getResults($result, $filepath)
{
    global $PRINT;
    $cands = getCandidates($filepath);
    $pairs = getAllPairs($cands);
    $data = json_decode(file_get_contents($filepath), 1);
    $year = $data['ELECTION']['id'];
    if ($PRINT) {
        print "\n\n ----- {$year} -----\n\n";
    }
    foreach ($data['BALLOTS'] as $ballot) {
        $pairs = runBallot($cands, $pairs, $ballot);
    }
    $pairs = rerunForNeitherOnBallot($cands, $pairs, $data['BALLOTS']);
    //printFormattedPairs($pairs);
    $new_cands[$year] = array();
    foreach ($cands as $cc) {
        $new_cands[$year][$cc]['beat'] = array();
        $new_cands[$year][$cc]['lost_to'] = array();
        $new_cands[$year][$cc]['tied'] = array();
    }
    foreach ($cands as $c1) {
        foreach ($cands as $c2) {
            if ($c1 != $c2) {
                if ($pairs[$c1][$c2] > $pairs[$c2][$c1]) {
                    //	print "$c1 beats $c2\n";
                    $new_cands[$year][$c1]['beat'][] = $c2;
                    $new_cands[$year][$c2]['lost_to'][] = $c1;
                }
                if ($pairs[$c1][$c2] < $pairs[$c2][$c1]) {
                    //	print "$c2 beats $c1\n";
                }
                if ($pairs[$c1][$c2] == $pairs[$c2][$c1]) {
                    $new_cands[$year][$c2]['tied'][] = $c1;
                }
            }
        }
    }
    //print "\n\n ----- $year Summary -----\n\n";
    //printFormattedResult($new_cands);
    return $new_cands;
}