AI-PSO

 view release on metacpan or  search on metacpan

lib/AI/PSO.pm  view on Meta::CPAN

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
######################## 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

204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
            $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

503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
    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 )