AI-Termites
view release on metacpan or search on metacpan
lib/AI/Termites.pm view on Meta::CPAN
defined $wood_ix and $self->termite_take_wood($termite, $wood_ix);
}
}
sub termite_take_wood {
my ($self, $termite, $wood_ix) = @_;
my $wood = $self->{wood}[$wood_ix];
return if $wood->{taken};
$wood->{taken} = 1;
$self->{taken}++;
# print "taken: $self->{taken}\n";
defined $termite->{wood_ix} and die "termite is already carrying some wood";
$termite->{wood_ix} = $wood_ix;
}
sub termite_leave_wood {
my ($self, $termite) = @_;
my $wood_ix = delete $termite->{wood_ix} //
croak "termite can not leave wood because it is carrying nothing";
$self->{taken}--;
my $wood = $self->{wood}[$wood_ix];
lib/AI/Termites/NemusNidor.pm view on Meta::CPAN
use Math::Vector::Real::MultiNormalMixture;
use parent 'AI::Termites';
sub before_termites_action {
my $self = shift;
my @ixs = grep !$self->{wood}[$_]{taken}, 0..$#{$self->{wood}};
$self->{kdtree_ixs} = \@ixs;
$self->{kdtree} = Math::Vector::Real::kdTree->new(map $_->{pos}, @{$self->{wood}}[@ixs]);
my $sigma = $self->{near}**(-2) * log(2);
# print "sigma: $sigma\n";
my $mnm = Math::Vector::Real::MultiNormalMixture->new(mu => [map $_->{pos}, @{$self->{wood}}[@ixs]],
sigma => $sigma);
$self->{mnm} = $mnm;
$self->{mnm_max} = $mnm->max_density_estimation;
}
sub termite_take_wood_p {
my ($self, $termite) = @_;
my $pos = $termite->{pos};
my $near = $self->{near};
my $wood_ix = $self->{kdtree}->find_nearest_neighbor($pos, $near);
if (defined $wood_ix) {
my @near = $self->{kdtree}->find_in_ball($pos, $near * 3, $wood_ix);
my $density = $self->{mnm}->density_portion($pos, @near);
my $max = $self->{mnm_max};
$self->{mnm_max} = $max = $density if $density > $max;
# printf "take -> max: %6g, density: %6g. ratio: %02.7f\n", $max, $density, $density/$max * 100;
return $self->{kdtree_ixs}[$wood_ix] if $density < rand($max);
}
undef
}
sub termite_leave_wood_p {
my ($self, $termite) = @_;
my $pos = $termite->{pos};
my $near = $self->{near};
my @near = $self->{kdtree}->find_in_ball($pos, $near * 3);
my $density = $self->{mnm}->density_portion($pos, @near);
my $max = $self->{mnm_max};
$self->{mnm_max} = $max = $density if $density > $max;
# printf "leave -> max: %6g, density: %6g. ratio: %02.7f\n", $max, $density, $density/$max * 100;
return 1 if $density > rand($max);
undef;
}
1;
lib/AI/Termites/VicinusOccurro.pm view on Meta::CPAN
use parent 'AI::Termites';
my $nlog2 = -log 2;
sub before_termites_action {
my $self = shift;
my @ixs = grep !$self->{wood}[$_]{taken}, 0..$#{$self->{wood}};
$self->{kdtree_ixs} = \@ixs;
$self->{kdtree} = Math::Vector::Real::kdTree->new(map $_->{pos}, @{$self->{wood}}[@ixs]);
# print "dim: $self->{dim}, near: $self->{near}, density: $self->{wood_density}\n";
$self->{alpha} = $nlog2/(nsphere_volumen($self->{dim} - 1, $self->{near}) * $self->{wood_density});
}
sub termite_take_wood_p {
my ($self, $termite) = @_;
my $pos = $termite->{pos};
my $near = $self->{near};
samples/termites.pl view on Meta::CPAN
$im->filledRectangle(0, 0, $width, $width, $white);
my $black = $im->colorAllocate(0, 0, 0);
# $im->interlaced('true');
my $red = $im->colorAllocate(255, 0, 0);
my $blue = $im->colorAllocate(0, 0, 255);
my $orange = $im->colorAllocate(255, 128, 0);
my $green = $im->colorAllocate(0, 255, 0);
my $txt = sprintf ("dim: %d, near: %.2f%%, termites: %d, wood: %d, wood taken: %d, iteration %d",
$dim,
100 * $ters->{near} / $world,
$termites, $wood, $ters->{taken},
$n );
$im->string(gdSmallFont, 4, 4, $txt, $black);
for my $wood (@{$ters->{wood}}) {
if ($wood->{taken}) {
$taken and $im->filledEllipse(scl($wood->{pos}), 8, 8, $orange);
samples/termites.pl view on Meta::CPAN
else {
$im->filledEllipse(scl($wood->{pos}), 5, 5, $blue);
}
}
for my $ter (@{$ters->{termites}}) {
my $color = (defined($ter->{wood_ix}) ? $red : $green);
$im->filledEllipse(scl($ter->{pos}), 3, 3, $color);
}
my $name = sprintf "%s-%05d.png", $output, $fn;
open my $fh, ">", $name;
print $fh $im->png;
close $fh;
print "$n ($fn)\r";
for (1..$one_of) {
$n++;
$ters->iterate;
}
$fn++;
last if ($top and $n > $top);
}
__END__
t/AI-Termites.t view on Meta::CPAN
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl AI-Termites.t'
#########################
# change 'tests => 1' to 'tests => last_test_to_print';
use strict;
use warnings;
use Test::More tests => 1;
BEGIN { use_ok('AI::Termites') };
#########################
# Insert your test code below, the Test::More module is use()ed here so read
( run in 0.835 second using v1.01-cache-2.11-cpan-de7293f3b23 )