s/\s+$//;
next if m/^\s*\#/;
next unless m/\S/;
+ next if m/^\s/;
if (m/^([A-Z]+)\s*\=\s*(\S.*)$/) {
my ($choname, $desc) = ($1,$2);
my $cho = addchoice($choname, Desc => $desc);
# Go through the voters and construct V(A,B)
-print "\nDefeats matrix\n";
+print "\nPreference matrix\n";
foreach my $iv (@invotes) {
my ($votestr,$voter) = @$iv;
drop $i, "majority ratio ($vad * $majr->[1] <= $vda * $majr->[0])";
}
-my $defeats = Graph::Directed->new; # A.6(4)
+print "\nDefeats A.6(4)\n";
+
+my $defeats = Graph::Directed->new;
sub chremain () {
return grep { !$ch[$_]{Dropped} } (0..$#ch);
my $vab = scalar @{ $vab[$ia][$ib] };
my $vba = scalar @{ $vab[$ib][$ia] };
next unless $vab > $vba;
- print "defeat: $choices[$ia] beats $choices[$ib] ($vab > $vba)\n";
- $defeats->add_vertex($choices[$ia],$choices[$ib]);
+ my $diff = $vab - $vba;
+ print "defeat: $choices[$ia] beats $choices[$ib]",
+ " ($vab > $vba: $diff)\n";
+ $defeats->add_edge($choices[$ia],$choices[$ib]);
}
}
sub chvab ($$) {
my ($ca,$cb) = @_;
- return $vab[ $choices{$ca}{Index} ][ $choices{$cb}{Index} ];
+ my $v = $vab[ $choices{$ca}{Index} ][ $choices{$cb}{Index} ];
+ return scalar @$v;
}
sub weaker ($$) {
next if $tdefeats->has_edge($choices[$ia],$choices[$ib]);
next if !$tdefeats->has_edge($choices[$ib],$choices[$ia]);
print "not in Schwartz set: $choices[$ia] because $choices[$ib]\n";
- $schwartz->delete_vertex($ia);
+ $schwartz->delete_vertex($choices[$ia]);
last;
}
}
our @weakest = ();
foreach my $edge ($schwartz->edges()) {
+# print " considering @$edge\n";
if (!@weakest) {
# no weakest edges yet
} elsif (weaker($edge, $weakest[0])) {
}
last unless @weakest;
-
- printf "weakest defeats %d > %d",
- (scalar @{ $vab[$_->[0]][$_->[1]] }),
- (scalar @{ $vab[$_->[1]][$_->[0]] });
+
+ my $w = $weakest[0];
+ printf "weakest defeats %d > %d\n",
+ chvab($w->[0], $w->[1]),
+ chvab($w->[1], $w->[0]);
foreach my $weakest (@weakest) {
- my ($ia,$ib) = @$weakest;
- print "weakest defeat $choices[$ia] > $choices[$ib]\n";
- $defeats->delete_edge($choices[$ia],$choices[$ib]);
+ my ($ca,$cb) = @$weakest;
+ print "weakest defeat $ca > $cb\n";
+ $defeats->delete_edge($ca,$cb);
}
print "defeats within the Schwartz set, round again\n";