27. my %mate = %{$node->{mate}};
my $next_grid_node = $grid_edge->[1];
Binary Decision diagram
$mate{$next_grid_node} = $next_grid_node unless exists $mate{$next_grid_node};
{mate => %mate};
}
sub high_node($$) { 1
my ($node, $grid_edge) = @_;
s
2
my %mate = %{$node->{mate}};
1 2 2
my @grid_nodes;
3 g
# loop detection
return undef if ($mate{$grid_edge->[0]} / '') eq $grid_edge->[1];
/
3 3
for my $grid_node ($grid_edge->[0], $grid_edge->[1]) {
3 3
if (! exists $mate{$grid_node}) {
push @grid_nodes, $grid_node; # That's the new grid node
} elsif (! defined $mate{$grid_node}) { # Have already connected :/
return undef;
} else {
4 4 4
push @grid_nodes, $mate{$grid_node};
4
$mate{$grid_node} = undef; # Connect to new grid node
4 4 4 4
}
}
$mate{$grid_nodes[0]} = $grid_nodes[1];
$mate{$grid_nodes[1]} = $grid_nodes[0];
・・・・・・
{mate => %mate};
28. # delete mate which isn't frontier
my $child_node = sub {
my $new_node = shift;
Pruning trees
defined $new_node or return undef;
my $new_mate = $new_node->{mate};
for (@done_grid_nodes) {
if ($_ eq $start || $_ eq $goal) {
return undef unless defined $new_mate->{$_} &&
$new_mate->{$_} ne $_;
} elsif (defined $new_mate->{$_} &&
$new_mate->{$_} ne $_
) {
Stop computing if it will be impossible
return undef; # won't be connected forever
}
if 2 ways intersect
delete $new_node->{mate}{$_};
}
if a node becomes a dead end
return 1 if has_one_route $new_node, $start => $goal;
$next_nodes_map{node_id $new_node} / $new_node;
/=
};
$node->{low} = $child_node->($low_node);
$node->{high} = $child_node->($high_node);
30. sub node_id($) {
Sharing trees
my $node = shift;
my $mate = $node->{mate};
join "t", map {"$_-" . ($mate->{$_} / '')} sort keys %$mate;
/
}
...
my @active_nodes = ($top_node);
for my $grid_edge (@grid_edges) { are connected
Track how nodes
...
my %next_nodes_map;
Share 2 trees if{ they have same status
for my $node (@active_nodes)
of
connections
$next_nodes_map{node_id $new_node} / $new_node;
/=
};
...
};
31. x is connected with y
in both diagram
x 2 y 5 x 2 y 5
1 4 7 1 4 7
3 6 3 6
32. Sharing
the result of computation
1
2 2
3 3 3 3
4 4 4 4 4 4 4 4
5 5