AI-ParticleSwarmOptimization-MCE
view release on metacpan or search on metacpan
# only for many-core version # the best if == $#cores of your system
# selecting best value if undefined
-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;
THANKS
Mario Roy for suggestions about efficiency.
AUTHOR
Strzelecki Lukasz <lukasz@strzeleccy.eu>
SEE ALSO
AI::ParticleSwarmOptimization AI::ParticleSwarmOptimization::Pmap
COPYRIGHT
Copyright (c) Strzelecki Lukasz. All rights reserved. This program is
free software; you can redistribute it and/or modify it under the same
terms as Perl itself.
example/PSOTest-MultiCore.pl view on Meta::CPAN
#!/usr/bin/perl
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;
}
#=======================================================================
++$|;
#-----------------------------------------------------------------------
#my $pso = AI::ParticleSwarmOptimization::Pmap->new( # Multi-core
my $pso = AI::ParticleSwarmOptimization::MCE->new( # Multi-core
#my $pso = AI::ParticleSwarmOptimization->new( # Single-core
-fitFunc => \&calcFit,
-dimensions => 10,
-iterations => 10,
-numParticles => 1000,
# only for many-core version # the best if == $#cores of your system
# selecting best value if undefined
-workers => 4,
example/PSOTest-MultiCore.pl view on Meta::CPAN
my $beg = time;
$pso->init();
my $fitValue = $pso->optimize ();
my ( $best ) = $pso->getBestParticles (1);
my ( $fit, @values ) = $pso->getParticleBestPos ($best);
my $iters = $pso->getIterationCount();
printf "Fit %.4f at (%s) after %d iterations\n", $fit, join (', ', map {sprintf '%.4f', $_} @values), $iters;
warn "\nTime: ", time - $beg, "\n\n";
#=======================================================================
exit 0;
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
my $pop = $self->{ numParticles };
$self->{ numParticles } = 1;
$self->SUPER::init();
$self->{ numParticles } = $pop;
$self->{ prtcls } = [ ];
#-------------------------------------------------------------------
my $cnt = 0;
my $tpl = $self->_tpl;
@{ $self->{ prtcls } } = map {
$_->{ id } = $cnt++;
$_
} mce_map {
my $arg = clone( $tpl );
$arg->{ -numParticles } = $_;
my $swm = AI::ParticleSwarmOptimization->new( %$arg );
$swm->init;
@{ $swm->{ prtcls } };
} @{ $self->_pop };
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
sub _chunks {
my ( $self ) = @_;
#-------------------------------------------------------------------
@{ $self->{ prtcls } } = shuffle @{ $self->{ prtcls } };
#-------------------------------------------------------------------
my @chk;
for my $idx ( 0 .. $#{ $self->_pop } ){
#my $cnt = 0;
#my @tmp = map {
# $_->{ id } = $cnt++;
# $_
#} splice @{ $self->{ prtcls } }, 0, $self->_pop->[ $idx ];
# Faster and smaller memory consumption...
my $cnt = 0;
my @tmp = splice @{ $self->{ prtcls } }, 0, $self->_pop->[ $idx ];
$_->{ id } = $cnt++ for @tmp;
push @chk, \@tmp;
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
}
#=======================================================================
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 = $_;
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
my $arg = clone( $tpl );
$arg->{ -numParticles } = 1;
my $swm = AI::ParticleSwarmOptimization->new( %$arg );
$swm->init;
$swm->{ numParticles } = scalar( @$ary );
$swm->{ prtcls } = $ary;
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[
$swm->{ prtcls },
$swm->{ bestBest },
]
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
} $self->_chunks;
#-------------------------------------------------------------------
#my $cnt = 0;
#@{ $self->{ prtcls } } = map {
# $_->{ id } = $cnt++;
# $_
#} map {
# @{ $_->[ 0 ] }
#} @lst;
# Faster and smaller memory consumption...
my $cnt = 0;
@{ $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 = $_;
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
my $arg = clone( $tpl );
$arg->{ -numParticles } = 1;
my $swm = AI::ParticleSwarmOptimization->new( %$arg );
$swm->init;
$swm->{ numParticles } = scalar( @$ary );
$swm->{ prtcls } = $ary;
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[
$swm->_moveParticles( $iter ),
$swm->{ prtcls }
]
#- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
} $self->_chunks;
#-------------------------------------------------------------------
#my $cnt = 0;
#@{ $self->{ prtcls } } = map {
# $_->{ id } = $cnt++;
# $_
#} map {
# @{ $_->[ 1 ] }
#} @lst;
# Faster and smaller memory consumption...
my $cnt = 0;
@{ $self->{ prtcls } } = map { @{ $_->[ 1 ] } } @lst;
$_->{ id } = $cnt++ for @{ $self->{ prtcls } };
#-------------------------------------------------------------------
return unless grep { defined $_ } map { $_->[ 0 ] } @lst;
return 1;
}
#=======================================================================
1;
__END__
=head1 NAME
AI::ParticleSwarmOptimization::MCE - Particle Swarm Optimization (object oriented) with support for multi-core processing
lib/AI/ParticleSwarmOptimization/MCE.pm view on Meta::CPAN
# only for many-core version # the best if == $#cores of your system
# selecting best value if undefined
-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
Mario Roy for suggestions about efficiency.
=head1 AUTHOR
Strzelecki Lukasz <lukasz@strzeleccy.eu>
=head1 SEE ALSO
L<AI::ParticleSwarmOptimization>
L<AI::ParticleSwarmOptimization::Pmap>
=head1 COPYRIGHT
Copyright (c) Strzelecki Lukasz. All rights reserved.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
=cut
( run in 0.396 second using v1.01-cache-2.11-cpan-49f99fa48dc )