AI-ParticleSwarmOptimization
view release on metacpan or search on metacpan
lib/AI/ParticleSwarmOptimization.pm view on Meta::CPAN
package AI::ParticleSwarmOptimization;
use strict;
use warnings;
use Math::Random::MT qw();
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw();
$AI::ParticleSwarmOptimization::VERSION = '1.006';
use constant kLogBetter => 1;
use constant kLogStall => 2;
use constant kLogIter => 4;
use constant kLogDetail => 8;
use constant kLogIterDetail => (kLogIter | kLogDetail);
sub new {
my ($class, %params) = @_;
my $self = bless {}, $class;
$self->setParams (%params);
return $self;
}
sub setParams {
my ($self, %params) = @_;
if (defined $params{-fitFunc}) {
# Process required parameters - -fitFunc and -dimensions
if ('ARRAY' eq ref $params{-fitFunc}) {
($self->{fitFunc}, @{$self->{fitParams}}) = @{$params{-fitFunc}};
} else {
$self->{fitFunc} = $params{-fitFunc};
}
$self->{fitParams} ||= [];
}
$self->{prtcls} = [] # Need to reinit if num dimensions changed
if defined $params{-dimensions}
and defined $self->{dimensions}
and $params{-dimensions} != $self->{dimensions};
$self->{$_} = $params{"-$_"} for grep {exists $params{"-$_"}} qw/
dimensions
exitFit
exitPlateau
exitPlateauDP
exitPlateauWindow
exitPlateauBurnin
inertia
iterations
meWeight
numNeighbors
numParticles
posMax
posMin
randSeed
randStartVelocity
stallSpeed
themWeight
verbose
/;
die "-dimensions must be greater than 0\n"
if exists $params{-dimensions} && $params{-dimensions} <= 0;
if (defined $self->{verbose} and 'ARRAY' eq ref $self->{verbose}) {
my @log = map {lc} @{$self->{verbose}};
my %logTypes = (
better => kLogBetter,
stall => kLogStall,
iter => kLogIter,
detail => kLogDetail,
);
$self->{verbose} = 0;
exists $logTypes{$_} and $self->{verbose} |= $logTypes{$_} for @log;
( run in 0.924 second using v1.01-cache-2.11-cpan-6aa56a78535 )