AI-ParticleSwarmOptimization-MCE
view release on metacpan or search on metacpan
-workers => 4,
);
my $fitValue = $pso->optimize ();
my ($best) = $pso->getBestParticles (1);
my ($fit, @values) = $pso->getParticleBestPos ($best);
printf "Fit %.4f at (%s)\n",
$fit, join ', ', map {sprintf '%.4f', $_} @values;
sub calcFit {
my @values = @_;
my $offset = int (-@values / 2);
my $sum;
select( undef, undef, undef, 0.01 ); # Simulation of heavy processing...
$sum += ($_ - $offset++) ** 2 for @values;
return $sum;
}
elements. User provided parameters are passed as the first
parameters to the fitness function when it is called:
my $pso = AI::ParticleSwarmOptimization::MCE->new(
-fitFunc => [\&calcFit, $context],
-dimensions => 3,
);
...
sub calcFit {
my ($context, @values) = @_;
...
return $fitness;
}
In addition to any user provided parameters the list of values
representing the current particle position in the hyperspace is
passed in. There is one value per hyperspace dimension.
-inertia: positive or zero number, optional
example/PSOTest-MultiCore.pl view on Meta::CPAN
use strict;
use warnings;
use lib '../lib/';
#-----------------------------------------------------------------------
#use AI::ParticleSwarmOptimization;
use AI::ParticleSwarmOptimization::MCE;
#use AI::ParticleSwarmOptimization::Pmap;
use Data::Dumper; $::Data::Dumper::Sortkeys = 1;
#=======================================================================
sub calcFit {
my @values = @_;
my $offset = int (-@values / 2);
my $sum;
select( undef, undef, undef, 0.01 ); # Simulation of heavy processing...
$sum += ($_ - $offset++) ** 2 for @values;
return $sum;
}
#=======================================================================
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
#-----------------------------------------------------------------------
__PACKAGE__->mk_accessors( qw(
_pop
_tpl
_wrk
));
#-----------------------------------------------------------------------
$Storable::Deparse = 1;
$Storable::Eval = 1;
#=======================================================================
sub new {
my ($class, %params) = @_;
#-------------------------------------------------------------------
my $self = bless {}, $class;
$self->SUPER::setParams( %params );
#-------------------------------------------------------------------
$self->_init_mce( \%params );
$self->_init_pop( \%params );
$self->_init_tpl( \%params );
#-------------------------------------------------------------------
return $self;
}
#=======================================================================
sub _init_tpl {
my ( $self, $params ) = @_;
my $cln = clone( $params );
delete $cln->{ $_ } for qw(
-iterCount
-iterations
-numParticles
-workers
_pop
_tpl
_wrk
);
$self->_tpl( $cln );
return;
}
#=======================================================================
sub _init_pop {
my ( $self, $params ) = @_;
my $pop = int( $self->{ numParticles } / $self->_wrk );
my $rst = $self->{ numParticles } % $self->_wrk;
my @pop = ( $pop ) x $self->_wrk;
$pop[ 0 ] += $rst;
$self->_pop( \@pop );
}
#=======================================================================
sub _init_mce {
my ( $self, $params ) = @_;
#-------------------------------------------------------------------
$self->_wrk( $params->{ '-workers' } || MCE::Util::get_ncpu() );
#-------------------------------------------------------------------
MCE::Map->init(
chunk_size => 1, # Thanks Roy :-)
#chunk_size => q[auto], # The old one. Currently it should be the same...
max_workers => $self->_wrk,
posix_exit => 1, # Thanks Roy :-)
);
#-------------------------------------------------------------------
return;
}
#=======================================================================
sub setParams {
my ( $self, %params ) = @_;
my $fles = __PACKAGE__->new( %params );
$self->{ $_ } = $fles->{ $_ } for keys %$fles;
return 1;
}
#=======================================================================
sub init {
my ( $self ) = @_;
#-------------------------------------------------------------------
my $pop = $self->{ numParticles };
$self->{ numParticles } = 1;
$self->SUPER::init();
$self->{ numParticles } = $pop;
$self->{ prtcls } = [ ];
#-------------------------------------------------------------------
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
$swm->init;
@{ $swm->{ prtcls } };
} @{ $self->_pop };
#-------------------------------------------------------------------
return 1;
}
#=======================================================================
sub _chunks {
my ( $self ) = @_;
#-------------------------------------------------------------------
@{ $self->{ prtcls } } = shuffle @{ $self->{ prtcls } };
#-------------------------------------------------------------------
my @chk;
for my $idx ( 0 .. $#{ $self->_pop } ){
#my $cnt = 0;
#my @tmp = map {
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
my @tmp = splice @{ $self->{ prtcls } }, 0, $self->_pop->[ $idx ];
$_->{ id } = $cnt++ for @tmp;
push @chk, \@tmp;
}
#-------------------------------------------------------------------
return \@chk;
}
#=======================================================================
sub _updateVelocities {
my ( $self, $iter ) = @_;
#-------------------------------------------------------------------
print "Iter $iter\n" if $self->{verbose} & AI::ParticleSwarmOptimization::kLogIter;
my $tpl = $self->_tpl;
my @lst = mce_map {
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
my $ary = $_;
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
@{ $self->{ prtcls } } = map { @{ $_->[ 0 ] } } @lst;
$_->{ id } = $cnt++ for @{ $self->{ prtcls } };
#-------------------------------------------------------------------
$self->{ bestBest } = min grep { defined $_ } map { $_->[ 1 ] } @lst;
#-------------------------------------------------------------------
return;
}
#=======================================================================
sub _moveParticles {
my ( $self, $iter ) = @_;
#-------------------------------------------------------------------
print "Iter $iter\n" if $self->{verbose} & AI::ParticleSwarmOptimization::kLogIter;
my $tpl = $self->_tpl;
my @lst = mce_map {
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
my $ary = $_;
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
-workers => 4,
);
my $fitValue = $pso->optimize ();
my ($best) = $pso->getBestParticles (1);
my ($fit, @values) = $pso->getParticleBestPos ($best);
printf "Fit %.4f at (%s)\n",
$fit, join ', ', map {sprintf '%.4f', $_} @values;
sub calcFit {
my @values = @_;
my $offset = int (-@values / 2);
my $sum;
select( undef, undef, undef, 0.01 ); # Simulation of heavy processing...
$sum += ($_ - $offset++) ** 2 for @values;
return $sum;
}
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
the fitness function as following elements. User provided parameters are passed
as the first parameters to the fitness function when it is called:
my $pso = AI::ParticleSwarmOptimization::MCE->new(
-fitFunc => [\&calcFit, $context],
-dimensions => 3,
);
...
sub calcFit {
my ($context, @values) = @_;
...
return $fitness;
}
In addition to any user provided parameters the list of values representing the
current particle position in the hyperspace is passed in. There is one value per
hyperspace dimension.
=item I<-inertia>: positive or zero number, optional
t/01_pso_multi.t view on Meta::CPAN
my $fitValue = $pso->optimize ();
my ( $best ) = $pso->getBestParticles (1);
my ( $fit, @values ) = $pso->getParticleBestPos ($best);
my $iters = $pso->getIterationCount();
ok ( $fit > 100, 'Computations');
sub calcFit {
my @values = @_;
my $offset = int (-@values / 2);
my $sum;
$sum += ($_ - $offset++)**2 for @values;
return $sum;
}
( run in 0.238 second using v1.01-cache-2.11-cpan-a5abf4f5562 )