AI-PSO
view release on metacpan or search on metacpan
lib/AI/PSO.pm view on Meta::CPAN
2021222324252627282930313233343536373839404142######################## BEGIN MODULE CODE #################################
#---------- BEGIN GLOBAL PARAMETERS ------------
#-#-# search parameters #-#-#
my
$numParticles
=
'null'
;
# This is the number of particles that actually search the problem hyperspace
my
$numNeighbors
=
'null'
;
# This is the number of neighboring particles that each particle shares information with
# which must obviously be less than the number of particles and greater than 0.
# TODO: write code to preconstruct different topologies. Such as fully connected, ring, star etc.
# Currently, neighbors are chosen by a simple hash function.
# It would be fun (no theoretical benefit that I know of) to play with different topologies.
my
$maxIterations
=
'null'
;
# This is the maximum number of optimization iterations before exiting if the fitness goal is never reached.
my
$exitFitness
=
'null'
;
# this is the exit criteria. It must be a value between 0 and 1.
my
$dimensions
=
'null'
;
# this is the number of variables the user is optimizing
#-#-# pso position parameters #-#-#
my
$deltaMin
=
'null'
;
# This is the minimum scalar position change value when searching
my
$deltaMax
=
'null'
;
# This is the maximum scalar position change value when searching
#-#-# my 'how much do I trust myself verses my neighbors' parameters #-#-#
lib/AI/PSO.pm view on Meta::CPAN
204205206207208209210211212213214215216217218219220221222223224
$particles
[
$p
]{bestPos}[
$d
] =
&random
(
$deltaMin
,
$deltaMax
);
$particles
[
$p
]{velocity}[
$d
] =
&random
(
$deltaMin
,
$deltaMax
);
}
}
}
#
# initialize_neighbors
# NOTE: I made this a separate subroutine so that different topologies of neighbors can be created and used instead of this.
# NOTE: This subroutine is currently not used because we access neighbors by index to the particle array rather than storing their references
#
# - adds a neighbor array to the particle hash data structure
# - sets the neighbor based on the default neighbor hash function
#
sub
initialize_neighbors() {
for
(
my
$p
= 0;
$p
<
$numParticles
;
$p
++) {
for
(
my
$n
= 0;
$n
<
$numNeighbors
;
$n
++) {
$particles
[
$p
]{neighbor}[
$n
] =
$particles
[
&get_index_of_neighbor
(
$p
,
$n
)];
}
lib/AI/PSO.pm view on Meta::CPAN
503504505506507508509510511512513514515516517518519520521522523524525
psoRandomRange = 4.0. Also, you should also be setting meMin
and themMin to 0, and meMin and themMax to 1
unless
you really
know what you are doing.
=item 2. Search space coverage
If you have a large search space, increasing deltaMin and deltaMax
and delta max can help cover more area. Conversely, if you have a
small search space, then decreasing them will fine tune the search.
=item 3. Swarm Topology
I've personally found that using a global (fully connected) topology
where each particle is neighbors with all other particles
(numNeighbors == numParticles - 1) converges more quickly. However,
this will drastically increase the number of calls to your fitness
function. So, if your fitness function is the bottleneck, then you
should tune this value for the appropriate time/accuracy trade-off.
Also, I highly suggest you implement a simple fitness cache so you
don't end up recomputing fitness values. This can easily be done
with a perl hash that is keyed on the string concatenation of the
array values passed to your fitness function. Note that these are
floating point values, so determine how significant the values are
( run in 1.071 second using v1.01-cache-2.11-cpan-49f99fa48dc )