AI-ANN
view release on metacpan - search on metacpan
view release on metacpan or search on metacpan
lib/AI/ANN/Evolver.pm view on Meta::CPAN
$networkdata->[$i]->{'eta_neurons'}->[$j] *= exp($tau_prime*$random1+$tau*$random2);
$networkdata->[$i]->{'neurons'}->[$j] += $networkdata->[$i]->{'eta_neurons'}->[$j]*$random2;
}
}
# All done. Let's pack it back into an object and let someone else deal
# with it.
$network = $class->new ( 'inputs' => $inputcount,
'data' => $networkdata,
'minvalue' => $minvalue,
'maxvalue' => $maxvalue,
'afunc' => $afunc,
'dafunc' => $dafunc);
return $network;
}
__PACKAGE__->meta->make_immutable;
1;
__END__
=pod
=head1 NAME
AI::ANN::Evolver - an evolver for an artificial neural network simulator
=head1 VERSION
version 0.008
=head1 METHODS
=head2 new
AI::ANN::Evolver->new( { mutation_chance => $mutationchance,
mutation_amount => $mutationamount, add_link_chance => $addlinkchance,
kill_link_chance => $killlinkchance, sub_crossover_chance =>
$subcrossoverchance, min_value => $minvalue, max_value => $maxvalue } )
All values have a sane default.
mutation_chance is the chance that calling mutate() will add a random value
on a per-link basis. It only affects existing (nonzero) links.
mutation_amount is the maximum change that any single mutation can introduce.
It affects the result of successful mutation_chance rolls, the maximum
value after an add_link_chance roll, and the maximum strength of a link
that can be deleted by kill_link_chance rolls. It can either add or
subtract.
add_link_chance is the chance that, during a mutate() call, each pair of
unconnected neurons or each unconnected neuron => input pair will
spontaneously develop a connection. This should be extremely small, as
it is not an overall chance, put a chance for each connection that does
not yet exist. If you wish to ensure that your neural net does not become
recursive, this must be zero.
kill_link_chance is the chance that, during a mutate() call, each pair of
connected neurons with a weight less than mutation_amount or each
neuron => input pair with a weight less than mutation_amount will be
disconnected. If add_link_chance is zero, this should also be zero, or
your network will just fizzle out.
sub_crossover_chance is the chance that, during a crossover() call, each
neuron will, rather than being inherited fully from each parent, have
each element within it be inherited individually.
min_value is the smallest acceptable weight. It must be less than or equal to
zero. If a value would be decremented below min_value, it will instead
become an epsilon above min_value. This is so that we don't accidentally
set a weight to zero, thereby killing the link.
max_value is the largest acceptable weight. It must be greater than zero.
gaussian_tau and gaussian_tau_prime are the terms to the gaussian mutation
method. They are coderefs which accept one parameter, n, the number of
non-zero-weight inputs to the given neuron.
=head2 crossover
$evolver->crossover( $network1, $network2 )
Returns a $network3 consisting of the shuffling of $network1 and $network2
As long as the same neurons in network1 and network2 are outputs, network3
will always have those same outputs.
This method, at least if the sub_crossover_chance is nonzero, expects neurons
to be labeled from zero to n.
You probably don't want to do this. This is the least effective way to evolve
neural networks. This is because, due to the hidden intermediate steps, it
is possible for two networks which output exactly the same with completely
different internal representations.
=head2 mutate
$evolver->mutate($network)
Returns a version of $network mutated according to the parameters set for
$evolver, followed by a series of counters. The original is not modified.
The counters are, in order, the number of times we compared against the
following thresholds: mutation_chance, kill_link_chance, add_link_chance.
This is useful if you want to try to normalize your probabilities. For
example, if you want to make links be killed about as often as they are
added, keep a running total of the counters, and let:
$kill_link_chance = $add_link_chance * $add_link_counter / $kill_link_counter
This will probably make kill_link_chance much larger than add_link_chance,
but in doing so will make links be added at overall the same rate as they
are killed. Since new links tend to be killed particularly quickly, it may
be wise to add an additional optional multiplier to mutation_amount just
for new links.
=head2 mutate_gaussian
$evolver->mutate_gaussian($network)
Returns a version of $network modified according to the Gaussian mutation
rules discussed in X. Yao, Evolving Artifical Neural Networks, and X. Yao
and Y. Liu, Fast Evolution Strategies. Uses the gaussian_tau and
gaussian_tau_prime values from the initializer if they are present, or
sane defaults proposed by the above. These are both functions of 'n', the
number of inputs to each neuron with nonzero weight.
=head1 AUTHOR
Dan Collins <DCOLLINS@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is Copyright (c) 2011 by Dan Collins.
view all matches for this distributionview release on metacpan - search on metacpan
( run in 1.266 second using v1.00-cache-2.02-grep-82fe00e-cpan-f5108d614456 )