sub _centrality
{ my $self = shift;
my $net = $self->{net};
my %parameters = @_;
#my %adj_matrix = $net->get_adjacency_matrix(); # Now find the betweenness centrality. This is equal to # The number of shortest paths the vertex is on, divided by the number of # shortest paths my @vertices = $net->get_vertices();
my %numsps = ();
my %distance = ();
my %predecessors = ();
my %centrality = ();
@centrality{@vertices} = map{0} @vertices;
my %dependency = ();
foreach my $s (@vertices) {
foreach my $v (@vertices) {
$numsps{$v} = 0;
$distance{$v} = -1;
$dependency{$v} = 0;
$predecessors{$v} = ();
}
$numsps{$s} = 1;
$distance{$s} = 0;
@{$predecessors{$s}} = ();
my @stack = ();
my @queue = ($s);
while (@queue) {
my $v = pop @queue;
push(@stack, $v);
foreach my $w ($net->{graph}->predecessors($v)) {
# w found for the first time? if ($distance{$w} < 0) {
unshift(@queue, $w);
$distance{$w} = $distance{$v} + 1;
}
# shortest path to w via v? if ($distance{$w} == $distance{$v} + 1) {
$numsps{$w} += $numsps{$v};
push @{$predecessors{$w}}, $v;
}
}
}
while (@stack) {
my $w = pop @stack;
foreach my $v (@{$predecessors{$w}}) {
$dependency{$v} += ($numsps{$v} / $numsps{$w}) * (1.0 + $dependency{$w}); }
if ($w ne $s) {
$centrality{$w} += $dependency{$w};
}
}
}
return\% centrality;} |